Имя: Пароль:
1C
 
Я валяюсь с кода УПП
0 Широкий
 
21.01.10
23:28
Делаю небольшую шабашку - наткнулся на код который меня прямо в ступор ввел
УПП 1.2.16.1, Документ "ФормированиеПотребностей"
Фрагмент кода по заполнению табличной части потребностей

Для каждого Строка из ЗаказыНаПроизводство Цикл
       ЗапросНовыеПотребности.УстановитьПараметр("ЗаказНаПроизводствоДатаПотребности" + Формат(Индекс, "ЧГ=0"), НачалоДня(Строка.ДатаПотребности));
       
       ЗапросНовыеПотребности.Текст = ЗапросНовыеПотребности.Текст + "
       |ОБЪЕДИНИТЬ ВСЕ
       |
       |ВЫБРАТЬ
       |    &ДатаДокумента КАК Период,
       |    ЗаказыНаПроизводствоОстатки.Номенклатура КАК Номенклатура,
       |    ЗаказыНаПроизводствоОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
       |    ЗаказыНаПроизводствоОстатки.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,
       |    &Товар КАК ТоварТара,
       |    Ложь КАК Тара,
       |    &ЗаказНаПроизводствоДатаПотребности" + Формат(Индекс, "ЧГ=0") + " КАК ДатаПотребности,
       |    ЗаказыНаПроизводствоОстатки.ЗаказНаПроизводство КАК Заказ,
       |    ЗаказыНаПроизводствоОстатки.Номенклатура КАК КонечнаяПродукция,
       |    &ПроектПустаяСсылка КАК Проект,
       |    &СценарийПустаяСсылка КАК Сценарий,
       |    ЗаказыНаПроизводствоОстатки.Спецификация КАК Спецификация,
       |    ЗаказыНаПроизводствоОстатки.ВидВоспроизводства КАК ВидВоспроизводства,
       |    ЗаказыНаПроизводствоОстатки.КоличествоОстаток КАК Количество
       |ИЗ
       |    РегистрНакопления.ЗаказыНаПроизводство.Остатки(КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ), Номенклатура.Услуга = Ложь";
       
       Если ЗначениеЗаполнено(Строка.Заказ) Тогда
           
           ЗапросНовыеПотребности.УстановитьПараметр("ЗаказНаПроизводство" + Формат(Индекс, "ЧГ=0"), Строка.Заказ);
           ЗапросНовыеПотребности.Текст = ЗапросНовыеПотребности.Текст + " И ЗаказНаПроизводство = &ЗаказНаПроизводство" + Формат(Индекс, "ЧГ=0");
           
       КонецЕсли;
       
       ЗапросНовыеПотребности.Текст = ЗапросНовыеПотребности.Текст +
       ") КАК ЗаказыНаПроизводствоОстатки
       |
       |ГДЕ ЗаказыНаПроизводствоОстатки.КоличествоОстаток > 0
       |";
       
       Индекс = Индекс + 1;
       
   КонецЦикла;
   
   Если ЗапросНовыеПотребности.Текст <> "" Тогда
       
       ЗапросНовыеПотребности.Текст = Сред(ЗапросНовыеПотребности.Текст, 16);
       Результат = ЗапросНовыеПотребности.Выполнить().Выгрузить(ОбходРезультатаЗапроса.Прямой);
       РаспределитьПоНоменклатуре(НовыеПотребности, Результат);
       
КонецЕсли;

Блин.. ну и как после этого конфа может не тормозить??
1 acsent
 
21.01.10
23:31
А в чем проблема. Остатки по датам из ТЧ
2 acsent
 
21.01.10
23:31
Запрос выполняется ввне цикла
3 Широкий
 
21.01.10
23:33
(2) Внимательно посмотри. Идет склейка запроса на каждый заказ строки
4 acsent
 
21.01.10
23:34
А как еще помжно получить остатки по разным датам?
5 Maniac
 
21.01.10
23:36
ну и что? нормальная склейка. праметр то разный в отборе на каждую строку
6 Maniac
 
21.01.10
23:37
и склейка идет не по каждой строке а по каждому конкретному заказу.
7 NcSteel
 
21.01.10
23:39
Еще один мнящий себя гуру )) автар вроде не пятница .
8 Широкий
 
21.01.10
23:41
Т.е. запрос такого типа в порядке вещей?

"ВЫБРАТЬ
|    &ДатаДокумента КАК Период,
|    ЗаказыНаПроизводствоОстатки.Номенклатура КАК Номенклатура,
|    ЗаказыНаПроизводствоОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
|    ЗаказыНаПроизводствоОстатки.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,
|    &Товар КАК ТоварТара,
|    ЛОЖЬ КАК Тара,
|    &ЗаказНаПроизводствоДатаПотребности КАК ДатаПотребности,
|    ЗаказыНаПроизводствоОстатки.ЗаказНаПроизводство КАК Заказ,
|    ЗаказыНаПроизводствоОстатки.Номенклатура КАК КонечнаяПродукция,
|    &ПроектПустаяСсылка КАК Проект,
|    &СценарийПустаяСсылка КАК Сценарий,
|    ЗаказыНаПроизводствоОстатки.Спецификация КАК Спецификация,
|    ЗаказыНаПроизводствоОстатки.ВидВоспроизводства КАК ВидВоспроизводства,
|    ЗаказыНаПроизводствоОстатки.КоличествоОстаток КАК Количество
|ИЗ
|    РегистрНакопления.ЗаказыНаПроизводство.Остатки(
|            КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ),
|            Номенклатура.Услуга = ЛОЖЬ
|                И ЗаказНаПроизводство = &ЗаказНаПроизводство) КАК ЗаказыНаПроизводствоОстатки
|ГДЕ
|    ЗаказыНаПроизводствоОстатки.КоличествоОстаток > 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    &ДатаДокумента,
|    ЗаказыНаПроизводствоОстатки.Номенклатура,
|    ЗаказыНаПроизводствоОстатки.ХарактеристикаНоменклатуры,
|    ЗаказыНаПроизводствоОстатки.Номенклатура.ЕдиницаХраненияОстатков,
|    &Товар,
|    ЛОЖЬ,
|    &ЗаказНаПроизводствоДатаПотребности1,
|    ЗаказыНаПроизводствоОстатки.ЗаказНаПроизводство,
|    ЗаказыНаПроизводствоОстатки.Номенклатура,
|    &ПроектПустаяСсылка,
|    &СценарийПустаяСсылка,
|    ЗаказыНаПроизводствоОстатки.Спецификация,
|    ЗаказыНаПроизводствоОстатки.ВидВоспроизводства,
|    ЗаказыНаПроизводствоОстатки.КоличествоОстаток
|ИЗ
|    РегистрНакопления.ЗаказыНаПроизводство.Остатки(
|            КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ),
|            Номенклатура.Услуга = ЛОЖЬ
|                И ЗаказНаПроизводство = &ЗаказНаПроизводство1) КАК ЗаказыНаПроизводствоОстатки
|ГДЕ
|    ЗаказыНаПроизводствоОстатки.КоличествоОстаток > 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    &ДатаДокумента,
|    ЗаказыНаПроизводствоОстатки.Номенклатура,
|    ЗаказыНаПроизводствоОстатки.ХарактеристикаНоменклатуры,
|    ЗаказыНаПроизводствоОстатки.Номенклатура.ЕдиницаХраненияОстатков,
|    &Товар,
|    ЛОЖЬ,
|    &ЗаказНаПроизводствоДатаПотребности2,
|    ЗаказыНаПроизводствоОстатки.ЗаказНаПроизводство,
|    ЗаказыНаПроизводствоОстатки.Номенклатура,
|    &ПроектПустаяСсылка,
|    &СценарийПустаяСсылка,
|    ЗаказыНаПроизводствоОстатки.Спецификация,
|    ЗаказыНаПроизводствоОстатки.ВидВоспроизводства,
|    ЗаказыНаПроизводствоОстатки.КоличествоОстаток
|ИЗ
|    РегистрНакопления.ЗаказыНаПроизводство.Остатки(
|            КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ),
|            Номенклатура.Услуга = ЛОЖЬ
|                И ЗаказНаПроизводство = &ЗаказНаПроизводство2) КАК ЗаказыНаПроизводствоОстатки
|ГДЕ
|    ЗаказыНаПроизводствоОстатки.КоличествоОстаток > 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
...

и так 200 раз по числу строк
9 acsent
 
21.01.10
23:42
Я валяюсь с тех, кто валяется с кода УПП.
Покажи как ты бы сделал
10 ink1981
 
21.01.10
23:42
Мужики я не одинЭснег где смеятся скажите
11 NcSteel
 
21.01.10
23:42
Предложи вариант . Пока не вижу проблем , так как юзаются виртуальные таблицы.
12 Широкий
 
21.01.10
23:42
А типа передать во времянку ТаблицуДокумента и слева соединить не кошерно?
13 NcSteel
 
21.01.10
23:43
(12) Ты не заюзаешь виртуальные таблицы , то твой вариант будет тормозить больше
14 NcSteel
 
21.01.10
23:44
(13) А точнее виртуальные параметры . Выход вижу только в другой организации регистра , а запрос корректный.
15 Широкий
 
21.01.10
23:44
(13) Временную таблицу я не смогу использовать в параметрах виртальной таблицы??
Не смеши меня
16 NcSteel
 
21.01.10
23:45
(15) Имел виду параметры виртуальной таблицы . Смеятся не чему.
17 acsent
 
21.01.10
23:45
(15) Ну ты ТУПОЙ. Остатки на РАЗНЫЕ, Р-А-З-Н-Ы-Е даты
18 NcSteel
 
21.01.10
23:46
(17) +1
19 NcSteel
 
21.01.10
23:46
Можно конечно взять обороты и там вертеть ее , но это будет тормозить ооочень .
20 also
 
21.01.10
23:47
(8) ты прeдложи по другому
21 acsent
 
21.01.10
23:48
Можно конечно одинаковые даты группировать, но смыла нет - сиквел и так закэширует
22 Широкий
 
21.01.10
23:49
(17) Дебил.. глянь запрос
КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ) -остатки на дату документа ФормированияПотребностей
23 Maniac
 
21.01.10
23:54
(22) бугага не позорся.
24 Maniac
 
21.01.10
23:55
(22)ЗапросНовыеПотребности.УстановитьПараметр("ЗаказНаПроизводствоДатаПотребности" + Формат(Индекс, "ЧГ=0"), НачалоДня(Строка.ДатаПотребности));
25 ZyXEL
 
модератор
21.01.10
23:55
На личные оскорбления не переходим...
26 Maniac
 
21.01.10
23:56
где строка это каждый документ из ЗаказыНаПроизводство
27 Широкий
 
21.01.10
23:56
(26) Ну.. и она благополучно выводится как реквизит запроса
28 Широкий
 
21.01.10
23:56
+27 |    &ЗаказНаПроизводствоДатаПотребности1,
29 Широкий
 
22.01.10
00:01
С пятницей .. программеры млин..
Признавайтесь, кто из вас такую лажу написал?
30 Maniac
 
22.01.10
00:03
да сам ты лажа. какая разница сколько строк запроса. это тупо текст. динамический запрос с отбором по параметру. ну и чо?
он будет ровно столько же выполнятся. надо смотерть весь запрос а не только этот кусок.
31 Широкий
 
22.01.10
00:04
(30) Запрос в (8)
Там понятно или мне полностью выложить?
32 Maniac
 
22.01.10
00:05
можно было б и общий сделать но значит там где то подвох. ты же написал кусок только.
(31) пля а до этого где код?
вот это ведь не даром стоит ЗапросНовыеПотребности.УстановитьПараметр("ЗаказНаПроизводствоДатаПотребности" + Формат(Индекс, "ЧГ=0"), НачалоДня(Строка.ДатаПотребности));
33 Широкий
 
22.01.10
00:07
ЗапросНовыеПотребности = Новый Запрос;
   ЗапросНовыеПотребности.УстановитьПараметр("ДатаДокумента", Дата);
   ЗапросНовыеПотребности.УстановитьПараметр("ПроектПустаяСсылка", Справочники.Проекты.ПустаяСсылка());
   ЗапросНовыеПотребности.УстановитьПараметр("СценарийПустаяСсылка", Справочники.СценарииПланирования.ПустаяСсылка());
   ЗапросНовыеПотребности.УстановитьПараметр("СпецификацияПустаяСсылка", Справочники.СпецификацииНоменклатуры.ПустаяСсылка());
   ЗапросНовыеПотребности.УстановитьПараметр("ПустаяДата", Дата('00010101000000'));
   ЗапросНовыеПотребности.УстановитьПараметр("Товар", Перечисления.ТоварТара.Товар);
   ЗапросНовыеПотребности.УстановитьПараметр("Тара", Перечисления.ТоварТара.Тара);
   ЗапросНовыеПотребности.УстановитьПараметр("ВозвратнаяТара", Перечисления.СтатусыПартийТоваров.ВозвратнаяТара);
34 Maniac
 
22.01.10
00:07
и особенно еще вот это
  |    &ЗаказНаПроизводствоДатаПотребности" + Формат(Индекс, "ЧГ=0") + " КАК ДатаПотребности,
35 Maniac
 
22.01.10
00:08
(33) да ты тупишь. точно тебе сказали. в 34 строка говорящая о том что каждый запрос на разную дату потребности строится.
36 acsent
 
22.01.10
00:09
Хотя может ты и прав. Извиняюсь
37 Maniac
 
22.01.10
00:10
в каждом запросе у всех строк относящихся к конкретному запросу устанавдивается определенная дата потребности по параметру. этот параметр определяется в цикле как и каждый заказ.
38 Широкий
 
22.01.10
00:10
(35) Е-мое.. ты запрос видешь или нет? Фрагмент кода тоже есть.. где млин остатки на разную дату вылазят?
40 jcage
 
22.01.10
00:14
Так, Маня успакаиваемся!

Сейчас я популярно для маньяков разъясню как надо писать запросы.

Широкий абсолютно прав - запрос г@вно.
Достаточно сунуть таблицу документа в временную и левым соединением прекрасно можно получить эту самую дату потребности из ТЗ и все прочие поля из регистра. Маньяк - сначала подучи SQL, прежде чем возражать. Собственно отбор по заказам на производство сделать элементарно выбрав их из вложенной таблицы. Да даже если бы остатки требовались на дату потребности - то решается это запросом на раз-два.

Так что, с коллегой из (0) АБСОЛЮТНО СОГЛАСЕН.
41 NcSteel
 
22.01.10
00:15
(40) Меня смущает левое соединение.

Напиши запрос и сравни по времени выполнения , твой будет уступать.
42 jcage
 
22.01.10
00:17
200 объединений ВСЕГДА будет медленнее одного левого соединения.
43 NcSteel
 
22.01.10
00:23
(42) 200 возможно, надо тестить .
44 miksla1
 
22.01.10
00:25
Стандартный глюк у начинающих программистов, которые не сталкивались с SQL - использовать циклы где попало. УПП большая, есть хороший код, есть тупой. Всякое бывает. У меня сейчас перед глазами стоит код, который получает сальдо по плану счетов в Галактике - вот это космос!
45 trdm
 
22.01.10
00:28
(44) Лей, любопытно..
46 miksla1
 
22.01.10
00:34
(45) смеяца не будете? :-)
47 NcSteel
 
22.01.10
00:34
(46) Ты что ли написал его ? )
48 shuhard
 
22.01.10
00:38
(40)
УПП 1.2.16.1 вышла с 8.1.9.57  или 8.1.10.50

временных таблиц еще не было
49 miksla1
 
22.01.10
00:39
(47) упаси господи! Просто пришлось остатки перетаскивать.
Вот ссылочка:
http://www.tyumbit.ru/gal_forum/viewtopic.php?t=8815&sid=3074a14417054a5554b7dcce540b8cc8
50 miksla1
 
22.01.10
01:01
Посмотрел в последней (27) версии, возможно все не так однозначно. Из всех табличных частей данные выбираются по такому же принципу. Код понятный, читается хорошо. И не факт что особо тормозит именно из за кучи объединений. Так что предложение Широкому - предложи свой альтернативный вариант более подробно.
51 kiruha
 
22.01.10
01:41
(0)
Вообще то надо разделять красоту запроса и его эффективность
Запрос конечно некрасивый.
Но компиляция занимает относительно немного времени по сравнению
с извлечением данных.

Если ЗаказНаПроизводство входит в индекс таблиц , то существенного
прироста не получишь.
Даже наоборот - бывают короткие запросы , но которые приводят к
сканированию всей таблицы регистра.

Короче приведи свой и время выполнения.
52 luns
 
22.01.10
06:01
да все бывает. вот например в 27 релизе есть тупо пропущенные переменные и по два раза объявленные функции в одном модуле. т.е. элементарно не проходит синтаксис контроль.
ну что поделать - торопились люди.
а в бюджетировании есть места где в цикле читается константа ВалютаРегламентированногоУчета (по количеству строк документа) кажется в УчетФактическихДанныхПоБюджетам - просто молча исправляем и думаем: "а если бы я такую сложную конфу писал? сколько бы еще более тупых ошибок сделал?"
53 Широкий
 
22.01.10
09:32
(48) Я не в курсе откуда у тебя такая инфа, но в коде Временные таблицы встречаются достаточно часто.

(50) "И не факт что особо тормозит именно из за кучи объединений" - ты сам то понял что сказал?

(51) Я свой вариант я уже описывал: скинуть таблицу документа во временную таблицу, потом левое соединение с остатками. В параметры виртуальной таблицы остатков также добавить фильтр по времянке.
54 Secret
 
22.01.10
09:51
Подобный запрос использовался в ЗУП 8.0 при расчете НДФЛ. Количество равнялось количеству месяцев, прошедших с начала года. Иногда захватывался прошлый год. В итоге при выполнении такого запроса в декабре или январе SQL-сервер давал ошибку. В версии 8.1 в запросе стали использовать временную таблицу. Это хороший пример, как не нужно программировать. Уже из-за этакого стиля разработчиков 1С можно отнести к вредоносному ПО. :)
55 Secret
 
22.01.10
09:52
(54) Количество объединений равнялось количеству месяцев ...
56 Широкий
 
22.01.10
10:02
(54) Это лано еще количеству месяцев .. а тут, блин, соответствие количеству строк.. а их может быть их как одна, так и пару штук..
57 Stepa86
 
22.01.10
10:03
(53) а ты напиши свой вариант и сравни время выполнения, если не лень =)
58 Широкий
 
22.01.10
10:06
(57) Да я и так тебе могу сказать .. время выполнения сократиться как минимум раза в 3.. если не больше
59 Stepa86
 
22.01.10
10:09
(58) а я вот возьму и не поверю =) если уж речь заходит о производительности, то без конкретных тестов на рабочих данных нельзя говорить о каком либо варианте...
60 Demasiado
 
22.01.10
10:09
Автор,а ты поновее релизы не смотрел? Иногда там здорово перекраиваются запросы. Может быть там и сабж здорово исправлен?
61 Толич
 
22.01.10
10:09
(58) А можно ваш код? Проверим.)
62 Широкий
 
22.01.10
10:12
(59) Пиво подгонишь?
(60) Это возможно.. Но вот только это шабашка.. а задание состоит не в оптимизации
63 Stepa86
 
22.01.10
10:14
(62) неа
64 mrWatson
 
22.01.10
10:14
Для чего так пишут в типовой УПП:


СуммаВключаетНДС = (СуммаВключаетНДС = Истина);

А вы что думаете?

http://1csoft.com/node/861
65 Stepa86
 
22.01.10
10:15
(64) я так делаю, когда в СуммаВключаетНДС может лежать еще и Неопределено
66 Широкий
 
22.01.10
10:17
(64) Это когда СуммаВключаетНДС не обязательно булево
67 mrWatson
 
22.01.10
10:19
(65,66)а почему бы не написать?

СуммаВключаетНДС = Булево(СуммаВключаетНДС)
68 Stepa86
 
22.01.10
10:20
(67) Потому что: {(1)}: Преобразование значения к типу Булево не может быть выполнено
69 and_51
 
22.01.10
17:04
(0) "ЗапросНовыеПотребности.УстановитьПараметр("ЗаказНаПроизводство" + Формат(Индекс, "ЧГ=0"), Строка.Заказ);" я так понял что все объединения ради этой строчки
70 Bober
 
22.01.10
17:31
наследие от 8.0
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.