Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос (Класс "Прямой запрос") с периодичностью "НЕДЕЛЯ"
,
0 Dolly_EV
 
12.04.13
11:49
Задача - сформировать табличку по остаткам/оборотам за период вот такого вида:
Год|Месяц|НомерНедели|Товар|НачОст|Приход|Продано|Прочее

имеется запрос:
       ТекстЗапроса ="
       |ВЫБРАТЬ
       |    ЛЕВО(РегПартОО.НачалоПериода,4) КАК Год
       |    ,СРЕД(РегПартОО.НачалоПериода,5,2) КАК Месяц
       |    ,РегПартОО.НачалоПериода КАК [Неделя $Дата]
       |    ,СОКРП($СпрНом.Код) КАК [ТоварКод $Строка]
       |    ,СОКРП($СпрНом.Наименование) КАК [ТоварИмя $Строка]
       |    ,$СпрАлк.Емкость КАК [ТоварЕмкость $Число.5.3]
       |    ,РегПартОО.КоличествоНачальныйОстаток КАК [КолНачОст $Число.19.3]
       |    ,РегПартОО.КоличествоПриход КАК [КолПриход $Число.19.3]
       |    ,РегПартОО.КоличествоРасход КАК [КолРасход $Число.19.3]
       |    ,РегПартОО.КоличествоКонечныйОстаток КАК [КонОст $Число.19.3]
       |ИЗ
       |    $РегистрОстаткиОбороты.ПартииТоваров(:лНачДата,:лКонДата~,Неделя ДОПОЛНЕНИЕ,ДвиженияИГраницыПериода
       |                                        ,(1=1 И 3=3 И 4=4)
       |                                        ,(Товар)
       |                                        ,(Количество)) КАК РегПартОО
       |ЛЕВОЕ СОЕДИНЕНИЕ
       |    Справочник.Номенклатура КАК СпрНом $nolock
       |ПО
       |    $СпрНом.ТекущийЭлемент = РегПартОО.Товар
       |ЛЕВОЕ СОЕДИНЕНИЕ
       |    Справочник.АлкНоменклатура КАК СпрАлк $nolock
       |ПО
       |    $СпрАлк.Товар = $СпрНом.ТекущийЭлемент";

Все прекрасно, но в числовых показателях требуется подразбить суммы в зависимости от вида документа (операции) - в "Приход" - чистый приход, в "Продано" - за минусом возвратов, в "Прочее" - вся остальная движуха.
Проблема в том, что в ВТ ОстаткиОбороты при периодичности не "ДОКУМЕНТ" соответственно нет поля ВидДокумента...

Вопрос: Как решить задачу с наименьшими затратами?
1 Dolly_EV
 
12.04.13
12:17
Решение через итз и ее перебор и группировку/индексы не предлагать - оно есть. Вопрос хочу решить красиво, прямым запросом, "зАраз"
2 МихаилМ
 
12.04.13
12:22
свернуть понедельно самостоятельно.
3 Dolly_EV
 
25.04.13
15:38
АП.
По условиям задачи: "Данные предоставляются еженедельно в течение первого рабочего дня (как правило понедельника), следующего за отчетной неделей. Содержит обороты и остатки за каждую неделю каждого месяца по каждой SKU  за последние 4 месяца, включая текущий.  Разбивка осуществляется для каждой недели каждого месяца. Если неделя принадлежит двум месяцам, то данные разбиваются на 2 части: с начала недели до конца месяца и с начала следующего месяца до конца недели."

Т.е. в итоге оказалось проще сначала собрать периоды, и учесть разрывы недель, а потом под периоды тянуть данные
4 Dolly_EV
 
25.04.13
15:38
Получился вот такой код:

       //** ОСТАТКИ+ДВИЖУХА **
       тзПрод=СоздатьОбъект("ТаблицаЗначений");
       тзПрод.НоваяКолонка("Год","Число",4,0);
       тзПрод.НоваяКолонка("Месяц","Число",2,0);
       тзПрод.НоваяКолонка("Неделя","Число",2,0);
       тзПрод.НоваяКолонка("НачПериода","Дата");
       тзПрод.НоваяКолонка("КонПериода","Дата");
       тзПрод.НоваяКолонка("КолНачОст","Число",19,2);
       тзПрод.НоваяКолонка("КолПриход","Число",19,2);
       тзПрод.НоваяКолонка("КолРасход","Число",19,2);
       тзПрод.НоваяКолонка("КолКонОст","Число",19,2);
       
       Для сч=НачДата По КонДата-1 Цикл
           Если (НомерДняНедели(сч)<>1) И (сч<>НачДата) Тогда
               Продолжить;
           КонецЕсли;
           счКон=Мин(КонДата-1,сч+(7-НомерДняНедели(сч)));
           Если (ДатаГод(сч)<>ДатаГод(счКон)) ИЛИ (ДатаМесяц(сч)<>ДатаМесяц(счКон)) Тогда
               тзПрод.НоваяСтрока();
               тзПрод.Год=ДатаГод(сч);
               тзПрод.Месяц=ДатаМесяц(сч);
               тзПрод.Неделя=НомерНеделиГода(сч);
               тзПрод.НачПериода=сч;
               тзПрод.КонПериода=КонМесяца(сч);
               
               тзПрод.НоваяСтрока();
               тзПрод.Год=ДатаГод(счКон);
               тзПрод.Месяц=ДатаМесяц(счКон);
               тзПрод.Неделя=НомерНеделиГода(счКон);
               тзПрод.НачПериода=НачМесяца(счКон);
               тзПрод.КонПериода=счКон;
               Продолжить;
           КонецЕсли;
           
           тзПрод.НоваяСтрока();
           тзПрод.Год=ДатаГод(сч);
           тзПрод.Месяц=ДатаМесяц(сч);
           тзПрод.Неделя=НомерНеделиГода(сч);
           тзПрод.НачПериода=сч;
           тзПрод.КонПериода=счКон;
           
       КонецЦикла;
       
       ПЗ = СоздатьОбъект("ПрямойЗапрос");
       ПЗ.БухгалтерскийУчет = 0;
       ПЗ.ОперативныйУчет = 1;
       ПЗ.ПериодическиеЗначения = 0;
       ПЗ.РежимОтладки = 0;
       //ПЗ.УложитьТаблицуЗначений(тзПрод,"#тзПер");
       
       ТекстЗапросаОстатки ="
       |ВЫБРАТЬ
       |    :лГод КАК Год
       |    ,:лМесяц КАК Месяц
       |    ,:лНеделя КАК Неделя
       |    ,:лНачДата КАК [НачПериода $Дата]
       |    ,:лКонДата КАК [КонПериода $Дата]
       |    ,РегПартОО.Товар КАК [Товар $Справочник.Номенклатура]
       |    ,СОКРП($СпрНом.Код) КАК ТоварКод
       |    ,СОКРП($СпрНом.Наименование) КАК ТоварИмя
       |    ,$СпрАлк.Емкость КАК [ТоварЕмкость $Число.5.3]
       |    ,РегПартОО.КоличествоНачальныйОстаток КАК КолНачОст
       |    ,0 КАК КолПриход
       |    ,0 КАК КолРасход
       |    ,0 КАК КолПриходПНК
       |    ,0 КАК КолРасходРНК
       |    ,0 КАК КолВозврат
       |    ,РегПартОО.КоличествоКонечныйОстаток КАК КолКонОст
       |ИЗ
       |    $РегистрОстаткиОбороты.ПартииТоваров(:лНачДата,:лКонДата~,ПЕРИОД,
       |                                        ,(1=1 И 3=3 И 4=4)
       |                                        ,(Товар)
       |                                        ,(Количество)) КАК РегПартОО
       |ЛЕВОЕ СОЕДИНЕНИЕ
       |    Справочник.Номенклатура КАК СпрНом $nolock
       |ПО
       |    $СпрНом.ТекущийЭлемент = РегПартОО.Товар
       |ЛЕВОЕ СОЕДИНЕНИЕ
       |    Справочник.АлкНоменклатура КАК СпрАлк $nolock
       |ПО
       |    $СпрАлк.Товар = $СпрНом.ТекущийЭлемент
       |УПОРЯДОЧИТЬ
       |    $СпрНом.Наименование";
       
       ТекстЗапросаОбороты ="
       |ВЫБРАТЬ
       |    МАКСИМУМ(:лГод) КАК Год
       |    ,МАКСИМУМ(:лМесяц) КАК Месяц
       |    ,МАКСИМУМ(:лНеделя) КАК Неделя
       |    ,МАКСИМУМ(:лНачДата) КАК [НачПериода $Дата]
       |    ,МАКСИМУМ(:лКонДата) КАК [КонПериода $Дата]
       |    ,РегПартОО.Товар КАК [Товар $Справочник.Номенклатура]
       |    ,МАКСИМУМ(СОКРП($СпрНом.Код)) КАК ТоварКод
       |    ,МАКСИМУМ(СОКРП($СпрНом.Наименование)) КАК ТоварИмя
       |    ,МАКСИМУМ($СпрАлк.Емкость) КАК [ТоварЕмкость $Число.5.3]
       |    ,0 КАК КолНачОст
       |    ,СУММА(ВЫБОР КОГДА (РегПартОО.ВидДокумента<>:ВидДокумента.ПеремещениеТоваров И РегПартОО.ВидДокумента<>:ВидДокумента.ВозвратОтПокупателя) ТОГДА РегПартОО.КоличествоПриход ИНАЧЕ 0 КОНЕЦ) КАК КолПриход
       |    ,СУММА(ВЫБОР КОГДА РегПартОО.ВидДокумента<>:ВидДокумента.ПеремещениеТоваров ТОГДА РегПартОО.КоличествоРасход ИНАЧЕ 0 КОНЕЦ) КАК КолРасход
       |    ,СУММА(ВЫБОР КОГДА РегПартОО.ВидДокумента=:ВидДокумента.ПриходнаяНакладная ТОГДА РегПартОО.КоличествоПриход ИНАЧЕ 0 КОНЕЦ) КАК КолПриходПНК
       |    ,СУММА(ВЫБОР КОГДА РегПартОО.ВидДокумента В (:ВидДокумента.РасходнаяНакладная,:ВидДокумента.РасходнаяРозница,:ВидДокумента.ЧекККМ) ТОГДА РегПартОО.КоличествоРасход ИНАЧЕ 0 КОНЕЦ) КАК КолРасходРНК
       |    ,СУММА(ВЫБОР КОГДА РегПартОО.ВидДокумента=:ВидДокумента.ВозвратОтПокупателя ТОГДА РегПартОО.КоличествоПриход ИНАЧЕ 0 КОНЕЦ) КАК КолВозврат
       |    ,0 КАК КолКонОст
       |ИЗ
       |    $РегистрОбороты.ПартииТоваров(:лНачДата,:лКонДата~,ДОКУМЕНТ
       |                                        ,(1=1 И 3=3 И 4=4)
       |                                        ,(Товар)
       |                                        ,(Количество)) КАК РегПартОО
       |ЛЕВОЕ СОЕДИНЕНИЕ
       |    Справочник.Номенклатура КАК СпрНом $nolock
       |ПО
       |    $СпрНом.ТекущийЭлемент = РегПартОО.Товар
       |ЛЕВОЕ СОЕДИНЕНИЕ
       |    Справочник.АлкНоменклатура КАК СпрАлк $nolock
       |ПО
       |    $СпрАлк.Товар = $СпрНом.ТекущийЭлемент
       |СГРУППИРОВАТЬ
       |    РегПартОО.Товар
       |УПОРЯДОЧИТЬ
       |    МАКСИМУМ($СпрНом.Наименование)";
       
       //1. ОбъектМФ.Добавить("Справочник.Номенклатура","Товар","Номенклатура","");
       //2. ОбъектМФ.Добавить("Справочник.Контрагенты","Клиент","Контрагенты","");
       //3. ОбъектМФ.Добавить("Справочник.Проекты","Агент","Агенты (Проекты)","");
       //4. ОбъектМФ.Добавить("Справочник.МестаХранения","Склад","Склады","");
       //5. ОбъектМФ.Добавить("Справочник.Проекты","АгентЭТК","Агенты (ЭТК)","");
       
       ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапросаОстатки,ПЗ,"Номенклатура","Товар",,1,1);
       ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапросаОбороты,ПЗ,"Номенклатура","Товар",,1,0);
       Если ВыбФирма.Выбран()=1 Тогда
           ТекстЗапросаОстатки=СтрЗаменить(ТекстЗапросаОстатки,"3=3","Фирма=:лФирма");
           ТекстЗапросаОбороты=СтрЗаменить(ТекстЗапросаОбороты,"3=3","Фирма=:лФирма");
           ПЗ.УстановитьТекстовыйПараметр("лФирма", ВыбФирма);
       КонецЕсли;
       ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапросаОстатки,ПЗ,"Склады","Склад",,4,1);
       ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапросаОбороты,ПЗ,"Склады","Склад",,4,0);
       
       //to do:
       //ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапроса,ПЗ,"По контрагентам","$РегПарт.Покупатель",,3,1);
       //ОбъектМФ.СформироватьУсловиеЗапроса(ТекстЗапроса,ПЗ,"По агентам","$РегПарт.Проект",,4,1);
       тзПрод_=СоздатьОбъект("ИндексированнаяТаблица");
       тзПрод.ВыбратьСтроки();
       Пока тзПрод.ПолучитьСтроку()=1 Цикл
           Сообщить(""+тзПрод.НомерСтроки+",Неделя: "+тзПрод.Неделя+",Период: "+Строка(тзПрод.НачПериода)+" - "+Строка(тзПрод.КонПериода));
           ПЗ.УстановитьТекстовыйПараметр("лГод", тзПрод.Год);
           ПЗ.УстановитьТекстовыйПараметр("лМесяц", тзПрод.Месяц);
           ПЗ.УстановитьТекстовыйПараметр("лНеделя", тзПрод.Неделя);
           ПЗ.УстановитьТекстовыйПараметр("лНачДата", тзПрод.НачПериода);
           ПЗ.УстановитьТекстовыйПараметр("лКонДата", тзПрод.КонПериода);
           
           тзДок=ПЗ.Выполнить(,ТекстЗапросаОстатки);
           тзПрод_.Объединить(тзДок);
           тзДок=ПЗ.Выполнить(,ТекстЗапросаОбороты);
           тзПрод_.Объединить(тзДок);
       КонецЦикла;
       
       СтрСвертки="Год,Месяц,Неделя,НачПериода,КонПериода,Товар,ТоварКод,ТоварИмя,ТоварЕмкость";
       СтрСумм="КолНачОст,КолПриход,КолРасход,КолПриходПНК,КолРасходРНК,КолВозврат,КолКонОст";
       
       тзПрод_.Свернуть(СтрСвертки,СтрСумм);
       тзПрод_.Сортировать("Товар,Год,Месяц,Неделя");
       тзПрод_.НоваяКолонка("КолПродано");
       тзПрод_.НоваяКолонка("КолПрочее");
       
       тзПрод_.ВыбратьСтроки();
       Пока тзПрод_.ПолучитьСтроку()=1 Цикл
           тзПрод_.КолПродано=тзПрод_.КолРасходРНК-тзПрод_.КолВозврат;
           тзПрод_.КолПрочее=тзПрод_.КолПриход-тзПрод_.КолПриходПНК-(тзПрод_.КолРасход-тзПрод_.КолРасходРНК);
           
           //** проверка арифметики:
           //Ostatok + Prihod - Prodano + Prochee = Остаток на конец отчетного периода.
           _Проверка = тзПрод_.КолНачОст+тзПрод_.КолПриходПНК-тзПрод_.КолПродано+тзПрод_.КолПрочее;
           Если _Проверка<>тзПрод_.КолКонОст Тогда
               ТЗОшибок.НоваяСтрока();
               ТЗОшибок.ТипВидОбъекта = "Справочник.Номенклатура";
               ТЗОшибок.Объект = тзПрод_.Товар;
               ТЗОшибок.Ошибка = "не сходится арифметика (№ недели: "+тзПрод_.Неделя+")";
               Сообщить("АРИФМЕТИКА: "+Строка(тзПрод_.Товар)+" месяц: "+Строка(тзПрод_.Месяц)+" неделя: "+Строка(тзПрод_.Неделя),"!");
               Сообщить("   |->НачОст:"+тзПрод_.КолНачОст+" Прих:"+тзПрод_.КолПриходПНК+" Продано:"+тзПрод_.КолПродано+" Прочее:"+тзПрод_.КолПрочее+" КонОст:"+тзПрод_.КолКонОст+" ПРОВЕРКА:"+Строка(_Проверка-тзПрод_.КолКонОст),"!");
           КонецЕсли;
           
           ФайлВыгр.Добавить();
           ФайлВыгр.УстановитьЗначениеПоля("TICKER",СокрП(DistribID));
           ФайлВыгр.УстановитьЗначениеПоля("Year",тзПрод_.Год);
           ФайлВыгр.УстановитьЗначениеПоля("Month",тзПрод_.Месяц);
           ФайлВыгр.УстановитьЗначениеПоля("Week",тзПрод_.Неделя);
           ФайлВыгр.УстановитьЗначениеПоля("SKU_ID",тзПрод_.ТоварКод);
           ФайлВыгр.УстановитьЗначениеПоля("SKU_Name",тзПрод_.ТоварИмя);
           ФайлВыгр.УстановитьЗначениеПоля("Cap",тзПрод_.ТоварЕмкость);
           ФайлВыгр.УстановитьЗначениеПоля("Ostatok",тзПрод_.КолНачОст);
           ФайлВыгр.УстановитьЗначениеПоля("Prihod",тзПрод_.КолПриходПНК);
           ФайлВыгр.УстановитьЗначениеПоля("Prodano",тзПрод_.КолПродано);
           ФайлВыгр.УстановитьЗначениеПоля("Prochee",тзПрод_.КолПрочее);
       КонецЦикла;
       Сообщить("Готово!","iii");
5 Ёпрст
 
25.04.13
15:40
какя знакомая постановка задачи..нам тоже такую шляпу шлют постоянно
6 Mikeware
 
25.04.13
15:40
Зачем тебе тут виртуальная таблица?
считай по реальной!
7 Ёпрст
 
25.04.13
15:41
Синергия поди какая-нить ?
8 Ёпрст
 
25.04.13
15:43
Ну и я считал тупо так - табличка с периодами + соедиение с запросом:

начОст на начало периода + Приход и Расход по периодичности таблички останков..
Усё собственно.

На выходе тупо считается конОст при обходе результата запроса.
усё
9 Mikeware
 
25.04.13
15:44
(5) причем каждый поставщик - свое изобретает.
получали бы через EDI, и не факали мозг, урродыбл...
10 Dolly_EV
 
25.04.13
15:44
(5) ну дык братья-алкоголики))) да, Синергия

(8) вот-вот! пытался сделать одним запросом и вложенным запросом
ПЗ.УложитьТаблицуЗначений(тзПрод,"#тзПер");

потом "ВЫБРАТЬ из тзПер..."
и вложенный типа
(ВЫБРАТЬ ...
|ИЗ
|    $РегистрОбороты.ПартииТоваров(тзПер.НачПериода,тзПер.КонПериода~,ДОКУМЕНТ..

но вложенный в упор не хочет видеть колонки тз верхнего запроса... хотя почитал про SQL/SQLite - понимать должен вложенный запрос поля из верхнего
11 Dolly_EV
 
25.04.13
15:46
(6) Останки - проще из виртуальной выбрать, а обороты да, из реальной, но не суть. Не смог я все это в запросе с тзПериодов уложенной соединить :-(
12 Mikeware
 
25.04.13
15:51
(11) отпрофилируй запрос к ВТ ОстаткиОбороты с группировкой день, добавь вывод номера недели
и вместо группировки День сделай группировку по неделе.
13 Dolly_EV
 
25.04.13
15:56
(12) И как внутри анализировать, где разрыв недели?
Ты лучше пни, как соединить уложенную тз с Периодами и запрос к регистру, чтобы Запрос к регистру был вложенный и брал Нач/Кон периода из вышестоящегО?... мне это уже просто для общего развития, конкретно эта задача решена, ошибок нет, скорость вполне достаточна и идет на этом Синергия лесом.
14 Mikeware
 
25.04.13
15:58
(13) datepart(wk, )
15 Ёпрст
 
25.04.13
16:00
(10) ну на вот, для дбф


   ТзПериодов = СоздатьОбъект("ТаблицаЗначений");
   ТзПериодов.НоваяКолонка("ДатаНачала","Дата");
   ТзПериодов.НоваяКолонка("ДатаКонца","Дата");
   
   
   НачалоПериода = ДобавитьМесяц(КонДата,-4);
   НачалоПериода = Макс(НачМесяца(НачалоПериода),НачНедели(НачалоПериода));
   КонецПериода = Мин(КонНедели(НачалоПериода),КонМесяца(НачалоПериода));
   ТзПериодов.НоваяСтрока();
   ТзПериодов.ДатаНачала = НачалоПериода;
   ТзПериодов.ДатаКонца = КонецПериода;
   
   Пока КонецПериода<КонДата Цикл
       НачалоПериода=КонецПериода+1;
       НачалоПериода = Макс(НачМесяца(НачалоПериода),НачНедели(НачалоПериода));
       КонецПериода = Мин(КонНедели(НачалоПериода),КонМесяца(НачалоПериода));
       ТзПериодов.НоваяСтрока();
       ТзПериодов.ДатаНачала = НачалоПериода;
       ТзПериодов.ДатаКонца = КонецПериода;
   КонецЦикла;    
   
   база.УложитьТЗ(ТзПериодов,"ТабПериодов");
   
   //останки и обороты по периодам
   ТекстЗапроса = "
       |Select
       |   ТабПериодов.ДатаНачала [ДатаНачала $Дата]
       |   ,ТабПериодов.ДатаКонца [ДатаКонца $Дата]
       |   ,Спр.descr Наименование
       |   ,Спр.IDD IDD
       |   ,Рег.МОЛ [МОЛ $Справочник.ФизЛица]
       |   ,Алко.Емкость [Емкость :Число]
       |   ,SUM(Рег.НачОст) [Ostatok $Число]
       |   ,SUM(Рег.Поступление) [Prihod $Число]
       |   ,SUM(Рег.Реализация-Рег.Возврат) [Prodano $Число]
       |   ,SUM(Рег.Приход-Рег.Поступление-Рег.Расход+Рег.Реализация-Рег.Возврат) [Prochee $Число]
       |from  ТабПериодов
       |left join
       |    (
       |   SELECT
       |    
       |        Итоги.Номенклатура Номенклатура
       |       ,Итоги.МОЛ МОЛ
       |       ,:Дата1 Период  
       |        ,Итоги.Количество НачОст
       |        ,0 Приход
       |        ,0 Расход
       |       ,0 Поступление
       |       ,0 Реализация
       |       ,0 Возврат
       |    FROM
       |        [РегистрИтоги.ПартииНаличие] as Итоги
       |
       |    WHERE
       |        Итоги.period = :ПредПериод
       |   UNION ALL
       |    SELECT
       |         Движения.Номенклатура
       |        ,Движения.МОЛ
       |        ,:Дата1
       |        ,Движения.Количество * (1 - Движения.debkred * 2)
       |        ,0
       |        ,0
       |        ,0
       |        ,0
       |        ,0
       |    FROM
       |        [Регистр.ПартииНаличие] AS Движения
       |    WHERE
       |        Движения.date BETWEEN :НачПериод And :КонПериод
       |   --движуха приход/расход
       |    UNION ALL
       |    SELECT
       |         Движения2.Номенклатура
       |        ,Движения2.МОЛ
       |        ,Движения2.date  
       |        ,0
       |        ,Движения2.Количество*(1-Движения2.Debkred) --приход
       |        ,Движения2.Количество*Движения2.Debkred --расход
       |       ,case when Движения2.КодОперации = :ОперацияПоступление then
       |           Движения2.Количество else 0 end
       |       ,case when Движения2.КодОперации = :ОперацияПродажа then
       |            Движения2.Количество else 0 end
       |       ,case when Движения2.КодОперации = :ОперацияВозврат then
       |            Движения2.Количество else 0 end
       |    FROM
       |        [Регистр.ПартииНаличие] AS Движения2
       |    WHERE
       |        Движения2.date BETWEEN :Дата1 And :Дата2
       |        and Движения2.КодОперации <> :ОперацияПеремещение
       |    ) Рег on Рег.Период between ТабПериодов.ДатаНачала and ТабПериодов.ДатаКонца    
       |   Left join [Справочник.Номенклатура] Спр on Спр.id = Рег.Номенклатура
       |   Left join [Справочник.ТоварАлко] Алко On Алко.Id = Спр.АлкоСвойство
       |   Where 1=1 and 2=2
       |Group by Спр.descr,Спр.IDD,ТабПериодов.ДатаНачала,ТабПериодов.ДатаКонца,Алко.Емкость
       |";
   
       НомСтроки = 0;
       НомКолонки = 0;
       Если ТаблицаМФ.НайтиЗначение("Номенклатура", НомСтроки, НомКолонки) = 1 Тогда
           Если ТаблицаМФ.ПолучитьЗначение(НомСтроки, "ФлВкл") = 2  Тогда
               Список = СоздатьОбъект("СписокЗначений");
               ТаблицаМФ.ПолучитьЗначение(НомСтроки,"СписокЭлементов").Выгрузить(Список);
               база.УложитьОбъекты(Список,"ВыбНоменклатура",0,"Номенклатура");
               ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"1=1","
               | Where Рег.Номенклатура "+?(ТаблицаМФ.ПолучитьЗначение(НомСтроки,"ТипМФ")=1,""," NOT")+" IN (SELECT val FROM ВыбНоменклатура)");
           КонецЕсли;
       КонецЕсли;
       НомСтроки = 0;
       НомКолонки = 0;
       Если ТаблицаМФ.НайтиЗначение("МОЛ", НомСтроки, НомКолонки) = 1 Тогда
           Если ТаблицаМФ.ПолучитьЗначение(НомСтроки, "ФлВкл") = 2  Тогда
               Список = СоздатьОбъект("СписокЗначений");
               ТаблицаМФ.ПолучитьЗначение(НомСтроки,"СписокЭлементов").Выгрузить(Список);
               база.УложитьОбъекты(Список,"ВыбМОЛ",0,"ФизЛица");
               ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"2=2","
               | "+?(ЕстьWhere = 0,"Where","and")+" Рег.МОЛ "+?(ТаблицаМФ.ПолучитьЗначение(НомСтроки,"ТипМФ")=1,""," NOT")+" IN (SELECT val FROM ВыбМОЛ)";
           КонецЕсли;
       КонецЕсли;
       
       мд = СоздатьОбъект("MetaDataWork");
       нДата = ТзПериодов.ПолучитьЗначение(1,"ДатаНачала");
       
       НачПериод = мд.ПолучитьНачПериода(нДата);//начало периода
       ПредПериод = мд.ПолучитьНачПериода(НачПериод-1);//предыдущее начало периода останков
       
       
       Запрос.Подставлять("ОперацияПоступление",глко.Закупка);
       Запрос.Подставлять("ОперацияПродажа",глко.Продажа);
       Запрос.Подставлять("ОперацияВозврат",глко.ВозвратОтПокупателя);
       Запрос.Подставлять("ОперацияПеремещение",глко.Перемещение);
       
       
       Запрос.Подставлять("ПредПериод",ПредПериод);
       Запрос.Подставлять("НачПериод",НачПериод);
       Запрос.Подставлять("КонПериод",нДата-1);//для вычисления НачОст
       Запрос.Подставлять("Дата1",нДата);
       Запрос.Подставлять("Дата2",КонДата);
       ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса);
       
       Файл = создатьОбъект("XBASE"); //создаем ссылку на файл DBF
       Файл.КодоваяСтраница(0);
       Файл.ДобавитьПоле("TICKER","S",20,0);
       Файл.ДобавитьПоле("Year","N",4,0);
       Файл.ДобавитьПоле("Month","N",2,0);
       Файл.ДобавитьПоле("Week","N",2,0);
       
       Файл.ДобавитьПоле("SKU_ID","S",17,0);
       Файл.ДобавитьПоле("SKU_Name","S",150,0);
       Файл.ДобавитьПоле("Cap","N",5,3);
       
       Файл.ДобавитьПоле("Ostatok","N",20,0);
       Файл.ДобавитьПоле("Prihod","N",20,0);
       Файл.ДобавитьПоле("Prodano","N",20,2);
       Файл.ДобавитьПоле("Prochee","N",20,0);
       
       Каталог  = СокрЛП(Путь);
       Если ПустаяСтрока(Каталог)=1 Тогда
           Каталог = КаталогПользователя();
       КонецЕсли;
       ИмяФайла = СокрЛП(Тикер)+Формат(ДатаЧисло(КонДата),"Ч(0)2")+Формат(ДатаМесяц(КонДата),"Ч(0)2")+"S.dbf";
       СписокОтправки.УдалитьВсе();
       Файл.СоздатьФайл(Каталог + "\"+ИмяФайла); //создаем файл физически
       СписокОтправки.ДобавитьЗначение(Каталог + "\"+ИмяФайла);
       
       ВыбНоменклатура="";
       НачОстаток=0;
       ТЗ.ВыбратьСтроки();
       Пока ТЗ.ПолучитьСтроку() = 1 Цикл
           Если ВыбНоменклатура<>ТЗ.IDD Тогда
               ВыбНоменклатура = ТЗ.IDD;
               НачОстаток = ТЗ.Ostatok;
           КонецЕсли;
           
           Файл.Добавить();
           Файл.TICKER = СокрЛП(Тикер);
           Файл.Year = ДатаГод(ТЗ.ДатаНачала);
           Файл.Month = ДатаМесяц(ТЗ.ДатаНачала);
           Файл.Week = НомерНеделиГода(ТЗ.ДатаНачала);
           
           Файл.SKU_ID = ТЗ.IDD;
           Файл.SKU_Name = ТЗ.Наименование;
           Файл.Cap = ТЗ.Емкость;
           Файл.Ostatok = НачОстаток;
           Файл.Prihod = ТЗ.Prihod;
           Файл.Prodano = ТЗ.Prodano;
           Файл.Prochee = ТЗ.Prochee;
           НачОстаток = НачОстаток+ТЗ.Prihod-ТЗ.Prodano+ТЗ.Prochee;
           Файл.Записать();
       КонецЦикла;
       Файл.ЗакрытьФайл();            
       Сообщить("записан файл "+Каталог + "\"+ИмяФайла);
16 Mikeware
 
25.04.13
16:00
корелированый запрос, не?
17 Ёпрст
 
25.04.13
16:00
ну там ёмкость и код - свою воткнешь..
18 Dolly_EV
 
25.04.13
16:08
(15) Воооооооооот!
у тебя тоже
)Рег on Рег.Период between ТабПериодов.ДатаНачала and ТабПериодов.ДатаКонца

т.е. вложенный не видит напрямую ТабПериодов.ДатаНачала/ДатаКонца, а делается за весь период и далее группирповка по датам.

(16) Да оне самые!
http://msdn.microsoft.com/ru-ru/library/ms187638(v=sql.105).aspx

вот нихера не выходит каменный цветок на 1С :-(
19 Dolly_EV
 
25.04.13
16:11
Т.е. я хочу перебрать ТабПериодов.Неделя и чтобы вложенный запрос к регистру выполнился столько раз, сколько строк в ТабПериодов и сформировался согласно параметрам ТабПериодов.ДатаНачала / ТабПериодов.ДатаКонца
20 Ёпрст
 
25.04.13
16:13
(18) тебе коррелированный что ли надо ?
А занафига ?
21 Mikeware
 
25.04.13
16:15
+(20) проще при постобработке запоминать значение предыдущей строки.
22 Dolly_EV
 
25.04.13
17:12
(20) "А занафига?" - чтоб знать и понимать, как пользоваться
23 Dolly_EV
 
25.04.13
17:14
+(19) "я хочу перебрать ТабПериодов.Неделя" - в запросе перебрать!
24 Ёпрст
 
25.04.13
17:15
Ну так и передавай строки из первого запроса в лефт джоин в качестве параметра( Только с ВТ такой фокус не получится, это раз, для вычисления границ для получения останков нужно будет писать свою функцию, это два)
25 Dolly_EV
 
25.04.13
17:16
(24) ну я так и понял, что фокус не удался как раз из-за ВТ :-( ясно. Спасибо!
26 Dolly_EV
 
25.04.13
17:30
(24) а как SQL/SQlite вообще понимает "кореллированность"? Т.е. что надо выполнять вложенный на каждую итерацию в верхнем? по наличию полей верхнего запроса во вложенном?
27 Dolly_EV
 
25.04.13
18:00
"коррелированность"
28 Ёпрст
 
25.04.13
18:03
(26) не совсем, тебе надо будет делать коррелированный подзапрос
29 Ёпрст
 
25.04.13
18:03
а так, да, для каждой строки будет свой подзапрос
30 Ёпрст
 
25.04.13
18:08
Грубо говоря, у тебя будет так:

 |Select
       |   ТабПериодов.ДатаНачала [ДатаНачала $Дата]
       |   ,ТабПериодов.ДатаКонца [ДатаКонца $Дата]
       | (select что-то одно значение from ... where что-то =ТабПериодов.ДатаНачала  )as Остаток,
         ...........
       |from  ТабПериодов
31 Dolly_EV
 
25.04.13
18:23
30 т.е. как и склоняют неявно в мсдн - ТабПериодов.ДатаНачала поймется только в WHERE?
32 Ёпрст
 
25.04.13
18:24
не только - где угодно в подзапросе
33 Dolly_EV
 
25.04.13
18:26
(32) ограничение - только ВТ?
34 Ёпрст
 
25.04.13
18:27
(33) в ВТ ты не можешь подставлять динамически параметры, ибо ВТ в скуле развернётся в обычный подзапрос..
35 Dolly_EV
 
25.04.13
18:30
|Select
       |   ТабПериодов.ДатаНачала [ДатаНачала $Дата]
       |   ,ТабПериодов.ДатаКонца [ДатаКонца $Дата]

       | (select что-то одно значение from ... where что-то =ТабПериодов.ДатаНачала  )as Остаток,
         ...........
       |from  ТабПериодов
36 Dolly_EV
 
25.04.13
18:36
вот так можно?
|Select
|   ТабПериодов.ДатаНачала [ДатаНачала $Дата]
|    ,ТабПериодов.ДатаКонца [ДатаКонца $Дата]
|    ,Рег.Что-то...
|from  ТабПериодов
|left join (select что-то МНОГО значений from ... where что-то =ТабПериодов.ДатаНачала  ) as Рег
|

не, нельзя, понял... почти)))