Как в отчете СКД разделить суммы оборотов по типам документов-регистраторов и корректно рассчитать остатки?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе системы компоновки данных (СКД) по регистрам накопления часто возникает задача вывести показатели прихода или расхода в разрезе конкретных видов хозяйственных операций. Например, требуется разделить общую сумму расхода по заработной плате на две отдельные колонки: удержания и фактические выплаты. Рассмотрим подробно, как правильно составить запрос, разделить показатели по типам регистратора и избежать типичных ошибок с задвоением начальных и конечных остатков.

Разделение показателей по типам документов в запросе

Для проверки типа документа, выступающего регистратором движения, в языке запросов платформы 1С:Предприятие используется логический оператор ССЫЛКА. Проанализируем синтаксис этого оператора. Тип документа указывается в единственном числе без скобок: Документ.ИмяДокумента.

Если попытаться заключить имя объекта в скобки или написать во множественном числе (Документы.ИмяДокумента), конфигуратор выдаст синтаксическую ошибку. Посмотрим на правильный пример формирования отдельных колонок для разных типов документов расхода:


ВЫБОР
    КОГДА РегистрЗПОстаткиИОбороты.Регистратор ССЫЛКА Документ.УменьшениеНачислений
        ТОГДА РегистрЗПОстаткиИОбороты.СуммаРасход
    ИНАЧЕ 0
КОНЕЦ КАК ОтчисленияЗаПериод,
ВЫБОР
    КОГДА РегистрЗПОстаткиИОбороты.Регистратор ССЫЛКА Документ.РаспределениеСотрудникам
        ТОГДА РегистрЗПОстаткиИОбороты.СуммаРасход
    ИНАЧЕ 0
КОНЕЦ КАК ВыплатаЗаПериод

В данном примере поле СуммаРасход разделяется на два независимых вычисляемых показателя в зависимости от того, какой документ сформировал проводку.

Почему двоятся начальные и конечные остатки: разбор причин

После добавления регистратора в поля выборки разработчики часто сталкиваются с ситуацией, когда начальный остаток рассчитывается некорректно, а конечный остаток суммируется на каждое движение и многократно увеличивается в группировках. Выясним основные причины такого поведения СКД:

  1. Периодичность виртуальной таблицы: если в параметрах виртуальной таблицы ОстаткиИОбороты не задана периодичность или указана периодичность Период без учета регистратора, остатки не смогут корректно распределиться по временной оси.
  2. Фильтрация через условие ГДЕ: наложение условий на даты (например, ГДЕ Регистр.Период МЕЖДУ &НачалоПериода И &КонецПериода) отсекает записи уже после вычисления остатков на уровне платформы, что ломает механизм расчета сальдо на границы интервала.
  3. Сгруппировать по моментным показателям: ручная группировка по полям СуммаНачальныйОстаток и СуммаКонечныйОстаток в запросе превращает их в обычные статические поля, лишая СКД возможности применить встроенные алгоритмы расчета сальдо по иерархии группировок.
  4. Неверная настройка ролей полей в схеме: если в наборе данных СКД не задана строгая иерархия периодов, компоновка не понимает, в каком порядке закрывать и открывать остатки.

Пошаговая настройка схемы компоновки данных

Разберем по шагам, как построить надежный запрос и настроить параметры и роли полей в схеме компоновки данных.

Шаг 1. Формирование текста запроса

Используем в качестве источника виртуальную таблицу ОстаткиИОбороты с периодичностью Авто, передавая границы периода непосредственно в параметры таблицы. Обязательно выбираем поля периодичности ПериодСекунда, ПериодМесяц и сам Регистратор:


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

Шаг 2. Настройка ролей полей в наборе данных СКД

Перейдем на вкладку «Наборы данных». Для полей остатков и периодов зададим строгие роли, чтобы СКД могла автоматически вычислять начальное и конечное сальдо по любым группировкам:

  1. Для поля ПериодСекунда укажем роль: флаг Период со значением 1, флаг Обязательное — Истина.
  2. Для поля Регистратор укажем роль: флаг Период со значением 2.
  3. Для поля МесяцНачислений (или ПериодМесяц) укажем роль: флаг Период со значением 3.
  4. Для поля ДолгНаНачалоПериода установим тип остатка НачальныйОстаток и имя группы Долг.
  5. Для поля ДолгНаКонецПериода установим тип остатка КонечныйОстаток и имя группы Долг.

Шаг 3. Обработка параметров дат

Чтобы исключить потерю движений, записанных в последнюю секунду дня, на вкладке «Параметры» настроим выражения для границ периода:

  1. Для параметра НачалоПериода укажем выражение: НачалоПериода(&НачалоПериода, "День").
  2. Для параметра КонецПериода укажем выражение: КонецПериода(&КонецПериода, "День").
  3. В свойствах типа данных для обоих параметров выберем состав даты Дата, чтобы пользователь выбирал только день без ручного ввода времени 23:59:59.

Альтернативный вариант: разделение через ресурсы СКД

Существует еще один удобный способ разделения показателей без усложнения текста запроса. В самом запросе можно оставить стандартное поле СуммаРасход, а на вкладке «Ресурсы» добавить вычисляемые формулы для нужных полей:


Сумма(ВЫБОР КОГДА Регистратор ССЫЛКА Документ.УменьшениеНачислений ТОГДА СуммаРасход ИНАЧЕ 0 КОНЕЦ)

Такой подход делает запрос более чистым и позволяет гибко управлять отображением ресурсов в различных вариантах отчета без изменения структуры набора данных.

← На главную