|
Я валяюсь с кода УПП | ☑ | ||
---|---|---|---|---|
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |