Особенность работы конструкции дополнения дат в запросе

В случае если поле, по которому рассчитываем итоги, является полем типа Дата, то возможно дополнение результатов датами в заданном периоде. Делается это при помощи ключевого слова ПЕРИОДАМИ, после которого в скобках указывается вид периода (одно из СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ), начальная и конечные даты интересуемого периода. В случае если начальные и конечные даты не указаны, будут использованы первая и последняя даты, участвующие в результате.

Допустим, мы написали запрос с дополнением дат:

ВЫБРАТЬ
 НАЧАЛОПЕРИОДА(_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.Период, МЕСЯЦ) КАК Период,
 _ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.Номенклатура КАК Номенклатура,
 СУММА(_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоПриход) КАК КоличествоПриход,
 СУММА(_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоРасход) КАК КоличествоРасход,
 СУММА(_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоОборот) КАК КоличествоОборот,
 СУММА(_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоНачальныйОстаток) КАК КоличествоНачальныйОстаток,
 СУММА(_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток
ИЗ
 РегистрНакопления._ДемоОстаткиТоваровВМестахХранения.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Месяц, ДвиженияИГраницыПериода, ) КАК _ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты

СГРУППИРОВАТЬ ПО
 _ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.Номенклатура,
 НАЧАЛОПЕРИОДА(_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.Период, МЕСЯЦ)

УПОРЯДОЧИТЬ ПО
 Период,
 Номенклатура
ИТОГИ
 СУММА(КоличествоПриход),
 СУММА(КоличествоРасход),
 СУММА(КоличествоОборот),
 СУММА(КоличествоНачальныйОстаток),
 СУММА(КоличествоКонечныйОстаток)
ПО
 Период ПЕРИОДАМИ(МЕСЯЦ, &НачалоПериода, &КонецПериода)

 

Если выполнить запрос в консоли запросов, то никакого дополнения дат мы не увидим, хотя запрос написан верно. Особенность дополнения дат в том, что эта конструкция работает только при обходе результата запроса, а консоль запросов применяет метод Выгрузить() к результату запроса и никакого дополнения не происходит.

Пример №1 — выгрузка результата запроса в дерево значений (ДанныеФормыДерево)

Запрос = Новый Запрос;
Запрос.Текст = ПолучитьТекстЗапроса();
Запрос.УстановитьПараметр("НачалоПериода", Объект.НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", Объект.КонецПериода);
ВыборкаПериод = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
ЗначениеВРеквизитФормы(ВыборкаПериод, "РезультатЗапроса");

 

В данном примере дополнение дат не произойдет, т.к. происходит выгрузка результата запроса. Функция ПолучитьТекстЗапроса() возвращает выше приведенный текст запроса.

Пример №2 — обход результата запроса с последующей загрузкой в дерево значений (ДанныеФормыДерево)

Запрос = Новый Запрос;
Запрос.Текст = ПолучитьТекстЗапроса(); 
Запрос.УстановитьПараметр("НачалоПериода", Объект.НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", Объект.КонецПериода); 
ВыборкаПериод = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период", "Все"); 
ЭлементыДерева = ЭтаФорма.РезультатЗапроса.ПолучитьЭлементы();
ЭлементыДерева.Очистить();
Пока ВыборкаПериод.Следующий() Цикл
 НовыйЭлементГруппа = ЭлементыДерева.Добавить();
 ЗаполнитьЗначенияСвойств(НовыйЭлементГруппа, ВыборкаПериод); 
 ВыборкаДетальныеЗаписи = ВыборкаПериод.Выбрать(); 
 ЭлементыГруппы = НовыйЭлементГруппа.ПолучитьЭлементы();
 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
  НовыйЭлемент = ЭлементыГруппы.Добавить();
  ЗаполнитьЗначенияСвойств(НовыйЭлемент, ВыборкаДетальныеЗаписи);
 КонецЦикла;
КонецЦикла;

 

В данном примере производиться обход результата запроса, причем указывается как должна получаться выборка, с помощью передачи параметров в метод Выбрать(). В этом примере будет производиться дополнение дат.