При разработке отчетов по накопительным регистрам часто возникает задача получить текущие остатки номенклатуры или подарочных сертификатов вместе с детальной историей движений в разрезе документов-регистраторов. Попытка решить эту задачу «в лоб» через объединение виртуальных таблиц или использование конструкций ИТОГИ ПО в СКД часто приводит к синтаксическим и логическим ошибкам.
В этой статье мы разберем основные ошибки, с которыми сталкиваются разработчики при построении таких запросов, и рассмотрим правильные варианты решения задачи.
Разберем ошибки, которые часто возникают при попытке создать запрос для отчета:
ИТОГИ ПО. Система компоновки данных самостоятельно занимается рассчитыванием итогов по группировкам, поэтому использование секции ИТОГИ ПО внутри запросов для СКД недопустимо и вызывает сбой синтаксического анализатора. Также ошибка может возникать, если пакетный запрос заканчивается помещением данных во временную таблицу без финального оператора ВЫБРАТЬ.ПОМЕСТИТЬ, не разделив запросы точкой с запятой ;.ОстаткиИОбороты.РегистрНакопления.ПодарочныеСертификаты.ОстаткиИОбороты установить периодичность Регистратор, то поля КоличествоКонечныйОстаток и КоличествоНачальныйОстаток рассчитываются на момент конкретного документа-регистратора. Условие ГДЕ КонечныйОстаток <> 0 исключит только те записи-движения, после выполнения которых остаток стал нулевым, но не скроет сам объект полностью, если по нему ранее были приходные или расходные документы.Если задача заключается в том, чтобы вывести актуальный остаток только по тем позиции (например, штрихкодам сертификатов), у которых остаток существует на конец периода, и при этом развернуть их движения по документам, оптимальным решением будет использования двухпакетного запроса.
Разберем по шагам логику этого решения:
Остатки и помещаем их во временную таблицу ОстаткиСертификатов.; для завершения первого запроса пакета.ЛЕВОЕ СОЕДИНЕНИЕ сформированную временную таблицу с виртуальной таблицей Обороты с периодичностью Регистратор.Рассмотрим пример готового кода запроса для модуля:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПодарочныеСертификатыОстатки.Штрихкод КАК Штрихкод,
| ПодарочныеСертификатыОстатки.КоличествоОстаток КАК Остаток
|ПОМЕСТИТЬ ОстаткиСертификатов
|ИЗ
| РегистрНакопления.ПодарочныеСертификаты.Остатки(&КонецПериода, ) КАК ПодарочныеСертификатыОстатки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ОстаткиСертификатов.Штрихкод КАК Штрихкод,
| ОстаткиСертификатов.Остаток КАК Остаток,
| ПодарочныеСертификатыОбороты.Регистратор КАК Регистратор,
| ПодарочныеСертификатыОбороты.КоличествоПриход КАК КоличествоПриход,
| ПодарочныеСертификатыОбороты.КоличествоРасход КАК КоличествоРасход
|ИЗ
| ОстаткиСертификатов КАК ОстаткиСертификатов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПодарочныеСертификаты.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК ПодарочныеСертификатыОбороты
| ПО ОстаткиСертификатов.Штрихкод = ПодарочныеСертификатыОбороты.Штрихкод";
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
РезультатЗапроса = Запрос.Выполнить();
Если отчет разрабатывается в СКД, нет необходимости писать сложные соединения вручную или использовать секцию ИТОГИ ПО. СКД самостоятельно справляется с расчетом итогов и группировкой данных.
Проанализируем правильный алгоритм настройки схемы компоновки данных:
ОстаткиИОбороты с периодичностью Авто:
ВЫБРАТЬ
ПодарочныеСертификатыОстаткиИОбороты.Штрихкод КАК Штрихкод,
ПодарочныеСертификатыОстаткиИОбороты.Регистратор КАК Регистратор,
ПодарочныеСертификатыОстаткиИОбороты.ПериодСекунда КАК ПериодСекунда,
ПодарочныеСертификатыОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачальныйОстаток,
ПодарочныеСертификатыОстаткиИОбороты.КоличествоПриход КАК Приход,
ПодарочныеСертификатыОстаткиИОбороты.КоличествоРасход КАК Расход,
ПодарочныеСертификатыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток
ИЗ
РегистрНакопления.ПодарочныеСертификаты.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ПодарочныеСертификатыОстаткиИОбороты
НачальныйОстаток, Приход, Расход и КонечныйОстаток. Для остаточных полей СКД автоматически назначит рассчитываемые роли по периодам.Штрихкод, а вложенной группировкой делаем Регистратор.КонечныйОстаток Не Равно 0.Для предотвращения ошибок при написании запросов рекомендуется соблюдать следующие правила:
ИТОГИ ПО и УПОРЯДОЧИТЬ ПО в текстах запросов СКД без необходимости — это задача настроек схемы компоновки.; при использовании конструкции ПОМЕСТИТЬ.