Advertisement
DemAl

Sunlight. Собеседование. Тестовые задания (1-4)

Jul 12th, 2021
3,969
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 13.74 KB | None | 0 0
  1. // Задание №1.
  2.  
  3. // с использованием подзапроса
  4.  
  5. "ВЫБРАТЬ РАЗЛИЧНЫЕ
  6. |   Productions.Наименование КАК Name,
  7. |   Productions.Код КАК ProdID
  8. |ИЗ
  9. |   Справочник.Productions КАК Productions
  10. |ГДЕ
  11. |   НЕ Productions.Код В
  12. |               (ВЫБРАТЬ РАЗЛИЧНЫЕ
  13. |                   Trade.ProdID КАК ProdID
  14. |               ИЗ
  15. |                   РегистрСведений.Trade КАК Trade)
  16. |
  17. |УПОРЯДОЧИТЬ ПО
  18. |   ProdID"
  19.  
  20.  
  21. // без использования подзапроса
  22.  
  23. "ВЫБРАТЬ
  24. |   Productions.Наименование КАК Name,
  25. |   СУММА(Trade.ProdID) КАК ProdID_Trade,
  26. |   Productions.Код КАК ProdID
  27. |ПОМЕСТИТЬ ВТ_Отгрузки
  28. |ИЗ
  29. |   Справочник.Productions КАК Productions
  30. |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Trade КАК Trade
  31. |       ПО Productions.Код = Trade.ProdID
  32. |
  33. |СГРУППИРОВАТЬ ПО
  34. |   Productions.Наименование,
  35. |   Productions.Код
  36. |;
  37. |
  38. |////////////////////////////////////////////////////////////////////////////////
  39. |ВЫБРАТЬ РАЗЛИЧНЫЕ
  40. |   Отгрузки.Name КАК Name,
  41. |   Отгрузки.ProdID КАК ProdID
  42. |ИЗ
  43. |   ВТ_Отгрузки КАК Отгрузки
  44. |ГДЕ
  45. |   Отгрузки.ProdID_Trade ЕСТЬ NULL
  46. |
  47. |УПОРЯДОЧИТЬ ПО
  48. |   ProdID"
  49.  
  50.  
  51.  
  52. // Задание №2.
  53.  
  54. "ВЫБРАТЬ
  55. |   CurrValues.cDate КАК cDate,
  56. |   CurrValues.CurrID КАК CurrID,
  57. |   CurrValues.Value КАК Value
  58. |ПОМЕСТИТЬ ВТ_КурсыВалют
  59. |ИЗ
  60. |   РегистрСведений.CurrValues КАК CurrValues
  61. |;
  62. |
  63. |////////////////////////////////////////////////////////////////////////////////
  64. |ВЫБРАТЬ
  65. |   КурсыВалют.cDate КАК cDate,
  66. |   СУММА(КурсыВалют.CurrID) КАК CurrID
  67. |ПОМЕСТИТЬ ВТ_КурсыВалютМакс
  68. |ИЗ
  69. |   ВТ_КурсыВалют КАК КурсыВалют
  70. |
  71. |СГРУППИРОВАТЬ ПО
  72. |   КурсыВалют.cDate
  73. |;
  74. |
  75. |////////////////////////////////////////////////////////////////////////////////
  76. |ВЫБРАТЬ
  77. |   ВТ_КурсыВалют.CurrID КАК CurrID,
  78. |   Currencies.Наименование КАК Name,
  79. |   ВТ_КурсыВалют.Value КАК Value
  80. |ИЗ
  81. |   ВТ_КурсыВалют КАК ВТ_КурсыВалют
  82. |       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КурсыВалютМакс КАК ВТ_КурсыВалютМакс
  83. |       ПО ВТ_КурсыВалют.cDate = ВТ_КурсыВалютМакс.cDate
  84. |           И ВТ_КурсыВалют.CurrID = ВТ_КурсыВалютМакс.CurrID
  85. |       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Currencies КАК Currencies
  86. |       ПО ВТ_КурсыВалют.CurrID = Currencies.Код
  87. |
  88. |УПОРЯДОЧИТЬ ПО
  89. |   CurrID"
  90.  
  91.  
  92.  
  93. // Задание №3
  94.  
  95. Первый запрос выигрывает в производительности за счет того, что выборка отработает уже по отобранному измерению. Т.е. сначала отработает отбор, и только потом сама выборка (но уже с наложенным ограничением). Второй же вопрос выведет те же данные, что и первый, но с той разницей, что вначале рассчитается остаток по всем позициям и только потом наложится отбор
  96.  
  97.  
  98. // Задание №4
  99.  
  100. //Рекомендации по исправлению ошибок в процедуре представлены в прикрепленном в письме файле .docx
  101.  
  102. // Исправленная процедура
  103.  
  104. Процедура ОбработкаПроведенияПравильная(Отказ, РежимПроведения)
  105.    
  106.     // Формирование движений по регистрам
  107.     Запрос = Новый Запрос;
  108.     Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
  109.     Запрос.Текст =
  110.         "ВЫБРАТЬ
  111.         |   Поступления.Ссылка КАК Регистратор,
  112.         |   Поступления.Номенклатура КАК Номенклатура,
  113.         |   Поступления.Партия КАК Партия,
  114.         |   СУММА(Поступления.Количество) КАК Количество,
  115.         |   СУММА(Поступления.Сумма) КАК Сумма
  116.         |ПОМЕСТИТЬ ВТ_ДанныеДокумента
  117.         |ИЗ
  118.         |   Документ.ПоступлениеТоваров.Товары КАК Поступления
  119.         |ГДЕ
  120.         |   Поступления.Ссылка = &Регистратор
  121.         |
  122.         |СГРУППИРОВАТЬ ПО
  123.         |   Поступления.Ссылка,
  124.         |   Поступления.Партия,
  125.         |   Поступления.Номенклатура
  126.         |;
  127.         |
  128.         |////////////////////////////////////////////////////////////////////////////////
  129.         |ВЫБРАТЬ
  130.         |   ВТ_ДанныеДокумента.Регистратор КАК Регистратор,
  131.         |   ВТ_ДанныеДокумента.Номенклатура КАК Номенклатура,
  132.         |   ВТ_ДанныеДокумента.Партия КАК Партия,
  133.         |   ЕСТЬNULL(Партии.Дата, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаПартии,
  134.         |   СУММА(ВТ_ДанныеДокумента.Количество) КАК Количество,
  135.         |   СУММА(ВТ_ДанныеДокумента.Сумма) КАК Сумма
  136.         |ПОМЕСТИТЬ ВТ_ДанныеПоступленийСДатойПартии
  137.         |ИЗ
  138.         |   ВТ_ДанныеДокумента КАК ВТ_ДанныеДокумента
  139.         |       ЛЕВОЕ СОЕДИНЕНИЕ Документ.Партии КАК Партии
  140.         |       ПО ВТ_ДанныеДокумента.Партия = Партии.Ссылка
  141.         |
  142.         |СГРУППИРОВАТЬ ПО
  143.         |   ВТ_ДанныеДокумента.Партия,
  144.         |   ВТ_ДанныеДокумента.Регистратор,
  145.         |   ВТ_ДанныеДокумента.Номенклатура,
  146.         |   ЕСТЬNULL(Партии.Дата, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))
  147.         |;
  148.         |
  149.         |////////////////////////////////////////////////////////////////////////////////
  150.         |ВЫБРАТЬ
  151.         |   Поступления.Регистратор КАК Регистратор,
  152.         |   Поступления.Номенклатура КАК Номенклатура,
  153.         |   Поступления.Партия КАК Партия,
  154.         |   Поступления.ДатаПартии КАК ДатаПартии,
  155.         |   СУММА(Поступления.Количество) КАК Количество,
  156.         |   СУММА(Поступления.Сумма) КАК Сумма,
  157.         |   ЕСТЬNULL(Поступления.Сумма, 0) * ЕСТЬNULL(КурсыВалют.Value, 0) КАК СуммаВал,
  158.         |   &Дата КАК Период,
  159.         |   &Контрагент КАК Контрагент
  160.         |ИЗ
  161.         |   ВТ_ДанныеПоступленийСДатойПартии КАК Поступления
  162.         |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.CurrValues.СрезПоследних(
  163.         |               ,
  164.         |               Валюта В
  165.         |                   (ВЫБРАТЬ РАЗЛИЧНЫЕ
  166.         |                       ОсновнаяИностраннаяВалюта.Значение КАК Значение
  167.         |                   ИЗ
  168.         |                       Константа.ОсновнаяИностраннаяВалюта КАК ОсновнаяИностраннаяВалюта)) КАК КурсыВалют
  169.         |       ПО Поступления.ДатаПартии = КурсыВалют.Период
  170.         |
  171.         |СГРУППИРОВАТЬ ПО
  172.         |   Поступления.Партия,
  173.         |   Поступления.Номенклатура,
  174.         |   Поступления.ДатаПартии,
  175.         |   Поступления.Регистратор,
  176.         |   ЕСТЬNULL(Поступления.Сумма, 0) * ЕСТЬNULL(КурсыВалют.Value, 0)";
  177.    
  178.     Запрос.УстановитьПараметр("Регистратор", Ссылка);
  179.     //Запрос.УстановитьПараметр("Валюта", Константы.ОсновнаяИностраннаяВалюта.Получить());
  180.     Запрос.УстановитьПараметр("Дата", Дата);
  181.     Запрос.УстановитьПараметр("Контрагент", Контрагент);
  182.    
  183.     РезультатЗапроса = Запрос.Выполнить();
  184.    
  185.     Если РезультатЗапроса.Пустой() Тогда
  186.    
  187.         Возврат;    
  188.    
  189.     КонецЕсли;
  190.    
  191.     Выборка = РезультатЗапроса.Выбрать();
  192.    
  193.     Движения.ТоварыНаСкладах.Записывать = Истина;
  194.     Движения.ТоварыНаСкладах.Очистить();
  195.    
  196.     Движения.ЗаказыПоставщикам.Записывать = Истина;
  197.     Движения.ЗаказыПоставщикам.Очистить();
  198.    
  199.     Пока Выборка.Следующий() Цикл
  200.        
  201.         // РН "Товары на складах" - Приход
  202.         Движение = Движения.ТоварыНаСкладах.Добавить();
  203.         ЗаполнитьЗначенияСвойств(Движение, Выборка);
  204.         Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
  205.        
  206.         // РН "Заказы поставщикам" - Расход
  207.         Движение = Движения.ЗаказыПоставщикам.Добавить();
  208.         ЗаполнитьЗначенияСвойств(Движение, Выборка);
  209.         Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
  210.        
  211.     КонецЦикла;  
  212.    
  213.     // Запись движений
  214.     Движения.ТоварыНаСкладах.БлокироватьДляИзменения = Истина;
  215.     Движения.Записать();
  216.    
  217.     Движения.ЗаказыПоставщикам.БлокироватьДляИзменения = Истина;
  218.     Движения.Записать();
  219.  
  220.     // Контроль остатков
  221.     Запрос.Текст =
  222.         "ВЫБРАТЬ РАЗЛИЧНЫЕ
  223.         |   ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура,
  224.         |   &Контрагент КАК Контрагент,
  225.         |   ПоступлениеТоваровТовары.Партия КАК Партия
  226.         |ПОМЕСТИТЬ ДокТЧ
  227.         |ИЗ
  228.         |   ВТ_ДанныеДокумента КАК ПоступлениеТоваровТовары
  229.         |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Productions КАК СправочникНоменклатура
  230.         |       ПО ПоступлениеТоваровТовары.Номенклатура = СправочникНоменклатура.Ссылка
  231.         |;
  232.         |
  233.         |////////////////////////////////////////////////////////////////////////////////
  234.         |ВЫБРАТЬ
  235.         |   ПРЕДСТАВЛЕНИЕ(ТоварыНаСкладахОстатки.Номенклатура) КАК Номенклатура,
  236.         |   ЕСТЬNULL(ПРЕДСТАВЛЕНИЕ(СправочникНоменклатура.ЕдиницаИзмерения), НЕОПРЕДЕЛЕНО) КАК ЕдиницаИзмерения,
  237.         |   ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
  238.         |ИЗ
  239.         |   РегистрНакопления.ЗаказыПоставщикам.Остатки(
  240.         |           &МоментВремениОстатки,
  241.         |           (Номенклатура, Контрагент, Партия) В
  242.         |               (ВЫБРАТЬ РАЗЛИЧНЫЕ
  243.         |                   ДокТЧ.Номенклатура КАК Номенклатура,
  244.         |                   ДокТЧ.Контрагент КАК Контрагент,
  245.         |                   ДокТЧ.Партия КАК Партия
  246.         |               ИЗ
  247.         |                   ДокТЧ КАК ДокТЧ)) КАК ТоварыНаСкладахОстатки
  248.         |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Productions КАК СправочникНоменклатура
  249.         |       ПО ТоварыНаСкладахОстатки.Номенклатура = СправочникНоменклатура.Ссылка
  250.         |ГДЕ
  251.         |   ТоварыНаСкладахОстатки.КоличествоОстаток < 0";
  252.    
  253.     Запрос.УстановитьПараметр("Ссылка", Ссылка);
  254.     Запрос.УстановитьПараметр("МоментВремениОстатки", Новый Граница(МоментВремени(), ВидГраницы.Включая)); // проверка остатков, включая движения документа
  255.    
  256.     РезультатЗапроса = Запрос.Выполнить();
  257.    
  258.     Если Не РезультатЗапроса.Пустой() Тогда
  259.    
  260.         // есть отрицательные остатки
  261.         Отказ = Истина;
  262.        
  263.         Выборка = РезультатЗапроса.Выбрать();
  264.    
  265.         Пока Выборка.Следующий() Цикл
  266.            
  267.             Сообщение = Новый СообщениеПользователю;
  268.             Сообщение.Текст = "Оформлено больше, чем в заказе по номенклатуре""" + Выборка.Номенклатура + """ на " +
  269.                                     СтрЗаменить(Формат(-Выборка.КоличествоОстаток, "ЧН="), Символы.НПП, "") + " " + Выборка.ЕдиницаИзмерения;
  270.             Сообщение.Сообщить();
  271.            
  272.         КонецЦикла;
  273.  
  274.     КонецЕсли;
  275.    
  276.     Если Отказ Тогда
  277.    
  278.         Возврат;
  279.    
  280.     КонецЕсли;
  281.  
  282. КонецПроцедуры
  283.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement