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

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

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

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

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

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


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

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

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


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

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

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


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

Комментарии