При разработке отчетов на базе системы компоновки данных (СКД) по регистрам накопления часто возникает задача вывести показатели прихода или расхода в разрезе конкретных видов хозяйственных операций. Например, требуется разделить общую сумму расхода по заработной плате на две отдельные колонки: удержания и фактические выплаты. Рассмотрим подробно, как правильно составить запрос, разделить показатели по типам регистратора и избежать типичных ошибок с задвоением начальных и конечных остатков.
Для проверки типа документа, выступающего регистратором движения, в языке запросов платформы 1С:Предприятие используется логический оператор ССЫЛКА. Проанализируем синтаксис этого оператора. Тип документа указывается в единственном числе без скобок: Документ.ИмяДокумента.
Если попытаться заключить имя объекта в скобки или написать во множественном числе (Документы.ИмяДокумента), конфигуратор выдаст синтаксическую ошибку. Посмотрим на правильный пример формирования отдельных колонок для разных типов документов расхода:
ВЫБОР
КОГДА РегистрЗПОстаткиИОбороты.Регистратор ССЫЛКА Документ.УменьшениеНачислений
ТОГДА РегистрЗПОстаткиИОбороты.СуммаРасход
ИНАЧЕ 0
КОНЕЦ КАК ОтчисленияЗаПериод,
ВЫБОР
КОГДА РегистрЗПОстаткиИОбороты.Регистратор ССЫЛКА Документ.РаспределениеСотрудникам
ТОГДА РегистрЗПОстаткиИОбороты.СуммаРасход
ИНАЧЕ 0
КОНЕЦ КАК ВыплатаЗаПериод
В данном примере поле СуммаРасход разделяется на два независимых вычисляемых показателя в зависимости от того, какой документ сформировал проводку.
После добавления регистратора в поля выборки разработчики часто сталкиваются с ситуацией, когда начальный остаток рассчитывается некорректно, а конечный остаток суммируется на каждое движение и многократно увеличивается в группировках. Выясним основные причины такого поведения СКД:
ОстаткиИОбороты не задана периодичность или указана периодичность Период без учета регистратора, остатки не смогут корректно распределиться по временной оси.ГДЕ Регистр.Период МЕЖДУ &НачалоПериода И &КонецПериода) отсекает записи уже после вычисления остатков на уровне платформы, что ломает механизм расчета сальдо на границы интервала.СуммаНачальныйОстаток и СуммаКонечныйОстаток в запросе превращает их в обычные статические поля, лишая СКД возможности применить встроенные алгоритмы расчета сальдо по иерархии группировок.Разберем по шагам, как построить надежный запрос и настроить параметры и роли полей в схеме компоновки данных.
Используем в качестве источника виртуальную таблицу ОстаткиИОбороты с периодичностью Авто, передавая границы периода непосредственно в параметры таблицы. Обязательно выбираем поля периодичности ПериодСекунда, ПериодМесяц и сам Регистратор:
ВЫБРАТЬ
ВЫБОР
КОГДА РегистрЗПОстаткиИОбороты.Регистратор ССЫЛКА Документ.УменьшениеНачислений
ТОГДА РегистрЗПОстаткиИОбороты.СуммаРасход
ИНАЧЕ 0
КОНЕЦ КАК ОтчисленияЗаПериод,
ВЫБОР
КОГДА РегистрЗПОстаткиИОбороты.Регистратор ССЫЛКА Документ.РаспределениеСотрудникам
ТОГДА РегистрЗПОстаткиИОбороты.СуммаРасход
ИНАЧЕ 0
КОНЕЦ КАК ВыплатаЗаПериод,
РегистрЗПОстаткиИОбороты.ПериодНачисления КАК ПериодНачисления,
РегистрЗПОстаткиИОбороты.ФИО КАК Сотрудник,
РегистрЗПОстаткиИОбороты.ФИО.ЮридическоеЛицо КАК ЮридическоеЛицо,
РегистрЗПОстаткиИОбороты.ФИО.Должность КАК Должность,
РегистрЗПОстаткиИОбороты.ФИО.Подразделение КАК Подразделение,
РегистрЗПОстаткиИОбороты.ФИО.Статус КАК Статус,
РегистрЗПОстаткиИОбороты.Статья КАК Статья,
РегистрЗПОстаткиИОбороты.СуммаНачальныйОстаток КАК ДолгНаНачалоПериода,
РегистрЗПОстаткиИОбороты.СуммаПриход КАК Начислено,
РегистрЗПОстаткиИОбороты.СуммаРасход КАК ВыданоИОтчислено,
РегистрЗПОстаткиИОбороты.СуммаКонечныйОстаток КАК ДолгНаКонецПериода,
РегистрЗПОстаткиИОбороты.Регистратор КАК Регистратор,
НАЧАЛОПЕРИОДА(РегистрЗПОстаткиИОбороты.ПериодДень, МЕСЯЦ) КАК МесяцНачислений,
РегистрЗПОстаткиИОбороты.ПериодМесяц КАК ПериодМесяц,
РегистрЗПОстаткиИОбороты.ПериодСекунда КАК ПериодСекунда
ИЗ
РегистрНакопления.РегистрЗП.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК РегистрЗПОстаткиИОбороты
Перейдем на вкладку «Наборы данных». Для полей остатков и периодов зададим строгие роли, чтобы СКД могла автоматически вычислять начальное и конечное сальдо по любым группировкам:
ПериодСекунда укажем роль: флаг Период со значением 1, флаг Обязательное — Истина.Регистратор укажем роль: флаг Период со значением 2.МесяцНачислений (или ПериодМесяц) укажем роль: флаг Период со значением 3.ДолгНаНачалоПериода установим тип остатка НачальныйОстаток и имя группы Долг.ДолгНаКонецПериода установим тип остатка КонечныйОстаток и имя группы Долг.Чтобы исключить потерю движений, записанных в последнюю секунду дня, на вкладке «Параметры» настроим выражения для границ периода:
НачалоПериода укажем выражение: НачалоПериода(&НачалоПериода, "День").КонецПериода укажем выражение: КонецПериода(&КонецПериода, "День").23:59:59.Существует еще один удобный способ разделения показателей без усложнения текста запроса. В самом запросе можно оставить стандартное поле СуммаРасход, а на вкладке «Ресурсы» добавить вычисляемые формулы для нужных полей:
Сумма(ВЫБОР КОГДА Регистратор ССЫЛКА Документ.УменьшениеНачислений ТОГДА СуммаРасход ИНАЧЕ 0 КОНЕЦ)
Такой подход делает запрос более чистым и позволяет гибко управлять отображением ресурсов в различных вариантах отчета без изменения структуры набора данных.