Имя: Пароль:
1C
1С v8
v8: Помогите оптимизировать код
,
0 SanGvin
 
18.04.12
08:58
Помогите оптимизировать код
Цель - выбрать документы выпуска за период и разбить их на несколько таких же по признаку реквизита реквизита (сорь за тафталогию) ТЧ. В моем случае - СкладПоУмолчанию у номенклатуры.

Сделал так на скорую руку, оно даже работает, но вложенность циклов смущает.
Подскажите, как сделать красиво.


[CODE]

ЗапросДоки = Новый Запрос;

   //выберем доки
   ЗапросДоки.Текст = "ВЫБРАТЬ
                      |    ОбщепитВыпускПродукции.Ссылка
                      |ИЗ
                      |    Документ.ОбщепитВыпускПродукции КАК ОбщепитВыпускПродукции
                      |ГДЕ
                      |    ОбщепитВыпускПродукции.ПометкаУдаления = ЛОЖЬ
                      |    И ОбщепитВыпускПродукции.Комментарий ПОДОБНО &Комментарий
                      |    И ОбщепитВыпускПродукции.Дата МЕЖДУ &ДатаНач И &ДатаКон";
   
   ЗапросДоки.УстановитьПараметр("Комментарий","Подлежит разбивке");
   ЗапросДоки.УстановитьПараметр("ДатаНач", ДатаНачалаПериода);
   ЗапросДоки.УстановитьПараметр("ДатаКон", ДатаКонцаПериода);
   
   РезультатДоки = ЗапросДоки.Выполнить().Выбрать();
   
   Пока РезультатДоки.Следующий() Цикл
       ЗапросСклады = Новый Запрос;
       //для каждого дока выберем разные склады
       ЗапросСклады.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                            |    ОбщепитВыпускПродукцииТовары.Номенклатура.СкладПоУмолчанию КАК Склад
                            |ИЗ
                            |    Документ.ОбщепитВыпускПродукции.Товары КАК ОбщепитВыпускПродукцииТовары
                            |ГДЕ
                            |    ОбщепитВыпускПродукцииТовары.Ссылка = &Ссылка";
       
       ЗапросСклады.УстановитьПараметр("Ссылка",РезультатДоки.Ссылка);
       
       РезультатСклады = ЗапросСклады.Выполнить().Выбрать();
       
       Пока РезультатСклады.Следующий() Цикл
           //для каждого склада сделаем отдельный новый док
           ЗапросТЧ = Новый Запрос;
           
           ЗапросТЧ.Текст = "ВЫБРАТЬ *
                          |ИЗ
                          |    Документ.ОбщепитВыпускПродукции.Товары КАК ОбщепитВыпускПродукцииТовары
                          |ГДЕ
                          |    ОбщепитВыпускПродукцииТовары.Номенклатура.СкладПоУмолчанию = &Склад
                          |    И ОбщепитВыпускПродукцииТовары.Ссылка = &Ссылка";
           
           ЗапросТЧ.УстановитьПараметр("АТП_Склад",РезультатСклады.Склад);
           ЗапросТЧ.УстановитьПараметр("Ссылка",РезультатДоки.Ссылка);
           
           РезультатТЧ = ЗапросТЧ.Выполнить().Выгрузить();
           
           НовДок = РезультатДоки.Ссылка.Скопировать();
           НовДок.Дата = РезультатДоки.Ссылка.Дата;
           НовДок.Склад = РезультатСклады.Склад;
           НовДок.Товары.Очистить();
           НовДок.Товары.Загрузить(РезультатТЧ);
           НовДок.Комментарий = "Разбивка - " + РезультатДоки.Ссылка;
           НовДок.Записать(РежимЗаписиДокумента.Запись);
       КонецЦикла; //склады
       
       //отметим исходный док на удалние
       ДокОбъект = РезультатДоки.Ссылка.ПолучитьОбъект();
       ДокОбъект.УстановитьПометкуУдаления(Истина);
               
   КонецЦикла; //доки
   
[/CODE]


Спасибо за внимание
1 zak555
 
18.04.12
09:00
> ЗапросДоки.УстановитьПараметр("Комментарий","Подлежит разбивке");

жесть

двойной запрос в цикле - тоже жесть


не проще смотреть движения дока ?
2 SanGvin
 
18.04.12
09:00
док не проведен
3 SanGvin
 
18.04.12
09:03
(1) коммент - просто признак, хотя лучше добавить реквизит с типом булево
вопрос не в этом, а как раз в том, как запрос оптимизировать, чтобы не было цикла в цикле
4 vmv
 
18.04.12
09:03
запрос в цикле - повешенье
5 vmv
 
18.04.12
09:05
(3) сделать запросом ВТ, те которые в циклах и соединить их с итоговым запросм
6 SanGvin
 
18.04.12
09:05
(4) понимаю что г-код за сим прошу помощи)
7 Джон Тирби
 
18.04.12
09:13
(5)Нафиг! Все запросы из одного дока...делай сводную таблицу и из нее уже расформировывай по докам.
8 Balabass
 
18.04.12
09:16
(0) Используй крабов
9 zak555
 
18.04.12
09:21
(3) вопрос как раз в том, когда ты перепишешь эту куйню ?
10 vde69
 
18.04.12
09:28
даже не говоря про запросы в цикле, запрос к таблице документов - это растрел на месте (даже для обменов не стоит использовать), делай запросы к регистрам....
11 zak555
 
18.04.12
09:39
(10) > запрос к таблице документов - - это растрел на месте

а как же получить данные, например, в модуле доке для расчёта себестоимости товара ? =)
12 Maxus43
 
18.04.12
09:41
(10) в каждой типовой в каждом документе запросы к таблице документов в обработке проведения) от задачи зависит
13 SanGvin
 
18.04.12
09:47
(10) нет движений у дока, писал уже
14 SanGvin
 
18.04.12
10:13
тему можно закрыть. все делается одним запросом с обходом по группировкам.
15 cViper
 
18.04.12
10:20
(18) Молодец.Читая ветку искал коммент который тебе это посоветует, ибо то что в (0) МУСОР.