Имя: Пароль:
1C
1C 7.7
v7: Запрос по регистру
, ,
0 Kuryshev
 
04.12.12
15:05
Есть документ ВозвратОтПоставщика с дополнительным реквизитом ДатаДокументаВходящего. Суть в том, чтобы выбирать движения данного документа не по дате документа, а по дате определенного реквизита. Остальные движения других документов должны выбираться по дате документа. Как это можно реализовать? Привожу запрос:
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с ДатаНачала по ДатаКонца;
   |Док            = Регистр.Продажи.ТекущийДокумент;
   |Фирма            = Регистр.Продажи.Фирма;
   |УпрАналитика    = Регистр.Продажи.Фирма.УпрАналитика;
   |ЮрЛицо        = Регистр.Продажи.Фирма.ЮрЛицо;
   |Покупатель    = Регистр.Продажи.Покупатель;
   |СвойствоПок    = Регистр.Продажи.Покупатель."+ВидСвойстваПок+".ЗначениеСвойства;
   |АдресДоставки    = Регистр.Продажи.АдресДоставки;
   |СвойствоАдресаДоставки = Регистр.Продажи.АдресДоставки."+ВидСвойстваАдр+".ЗначениеСвойства;
   |Номенклатура    = Регистр.Продажи.Номенклатура;                
   |СвойствоТМЦ    = Регистр.Продажи.Номенклатура.ОсновноеСвойство.ЗначениеСвойства;
   |Поставщик        = Регистр.Продажи.Поставщик;
   |СвойствоПост    = Регистр.Продажи.Поставщик.ОсновноеСвойство.ЗначениеСвойства;
   |";
1 Voronve
 
04.12.12
15:20
(0) Хочешь чтобы при запросе 01.11.12-15.11.12 в результат попали документы с датой дока 30.10.12 но с ДатаДокументаВходящего лежащие в интервале запроса ?
2 Kuryshev
 
04.12.12
15:37
(1) Совершенно верно.
3 Voronve
 
04.12.12
15:38
(2) Запросом никак. Только перебором.
4 Kuryshev
 
04.12.12
15:39
Нет возможности проверить, но будет ли работать следующая конструкция?

Функция ПроверитьДату(Док, Запрос)

   Если Док.Вид() = "Документ.ВозвратОтПокупателя" Тогда
       
       Если Док.Вычерк = 0 Тогда

           Возврат Запрос.ДатаДок;
           
       Иначе
           
           Если ПустоеЗначение(Док.ДатаДокВходящий) = 1 Тогда
               
               Возврат Запрос.ДатаДок
           
           Иначе
               
               Возврат Док.ДатаДокВходящий;
               
           КонецЕсли;
                       
       КонецЕсли;
   
   Иначе
       
       Возврат Запрос.ДатаДок;
       
   КонецЕсли;
   
КонецФункции


   мДатаНачала = Дата(1970, 1, 1);
   
   //Создание объекта типа Запрос
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с мДатаНачала по ДатаКонца;
   |Док            = Регистр.Продажи.ТекущийДокумент;
   |ДатаДок        = Регистр.Продажи.ТекущийДокумент.ДатаДок;
   |Фирма            = Регистр.Продажи.Фирма;
   |УпрАналитика    = Регистр.Продажи.Фирма.УпрАналитика;
   |ЮрЛицо        = Регистр.Продажи.Фирма.ЮрЛицо;
   |Покупатель    = Регистр.Продажи.Покупатель;
   |СвойствоПок    = Регистр.Продажи.Покупатель."+ВидСвойстваПок+".ЗначениеСвойства;
   |АдресДоставки    = Регистр.Продажи.АдресДоставки;
   |СвойствоАдресаДоставки = Регистр.Продажи.АдресДоставки."+ВидСвойстваАдр+".ЗначениеСвойства;
   |Номенклатура    = Регистр.Продажи.Номенклатура;                
   |СвойствоТМЦ    = Регистр.Продажи.Номенклатура.ОсновноеСвойство.ЗначениеСвойства;
   |Поставщик        = Регистр.Продажи.Поставщик;
   |СвойствоПост    = Регистр.Продажи.Поставщик.ОсновноеСвойство.ЗначениеСвойства;
   |Функция ДатаДок = Сумма(ПроверитьДату(Док, Запрос));
   |Условие ((Док >= ДатаНачала) И (Док <= ДатаКонца))
   |";
5 miki
 
04.12.12
15:40
(3)без разницы. Всё равно для перебора надо как-то задавать расширенный интервал.
6 Ёпрст
 
04.12.12
15:40
(3) почему ? Еще как.
Период в чорном запросе с начала всех времён до обеда и условие на даты при расчете функций..
7 dk
 
04.12.12
15:40
делай запас в ДатаНачала - месяцев 6 ну или сам смотри
и поставь фильтр
ДатаДокументаВходящего >= ... <= ...
8 Voronve
 
04.12.12
15:40
(4) Точнее запросом можно - но не по регистру а по документам. Перебором - по полю ДатаДокументаВходящего
9 mikecool
 
04.12.12
15:41
(6) а я бы прямой нарисовал )
10 Voronve
 
04.12.12
15:41
(6) Тссс ... Там не известно в какой запущенности БД. Может улечься на полчаса/час
11 Касандер72
 
04.12.12
18:56
(0) в реквизит - дату по которой нужно обрабатывать
12 pofigos
 
04.12.12
19:36
(0) Как вариант 2 запроса (движения без  документа ВозвратОтПоставщика и только  документ ВозвратОтПоставщика без периода выборки с условием вхождения ДатаДокументаВходящего нужный период) и объеденить в одну таблицу...
или (6). Суть одинакова, выигрыш в скорости только будет
13 Kuryshev
 
13.12.12
18:09
(9) Можно привести пример как сие реализовать в прямом запросе?
14 Ёпрст
 
13.12.12
18:15
(13) да обычный селект к табличке движений регистра с условиями на дату
15 Mikeware
 
13.12.12
18:25
(14) Ну и три джойна свойств
2 + 2 = 3.9999999999999999999999999999999...