Как правильно рассчитать остатки и обороты в отчете СКД с детализацией до регистратора

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

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

Анализ типичных ошибок при построении запроса

Рассмотрим ситуацию, с которой столкнулся автор темы. Изначально была попытка получить данные путем ЛЕВОГО СОЕДИНЕНИЯ основной физической таблицы регистра накопления с его виртуальными таблицами Обороты и Остатки. Это классическая ошибка, которая ведет к нескольким проблемам:

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

Проанализируем правильный подход: использование единой виртуальной таблицы ОстаткиИОбороты.

Шаг 1: Использование виртуальной таблицы ОстаткиИОбороты

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

Рассмотрим пример правильного текста запроса:


ВЫБРАТЬ
    СертификатыОстаткиИОбороты.Сертификат КАК Сертификат,
    СертификатыОстаткиИОбороты.Клиент КАК Клиент,
    СертификатыОстаткиИОбороты.Период КАК Период,
    СертификатыОстаткиИОбороты.Регистратор КАК Регистратор,
    СертификатыОстаткиИОбороты.СуммаНачальныйОстаток КАК НачальныйОстаток,
    СертификатыОстаткиИОбороты.СуммаПриход КАК Приход,
    СертификатыОстаткиИОбороты.СуммаРасход КАК Расход,
    СертификатыОстаткиИОбороты.СуммаКонечныйОстаток КАК КонечныйОстаток
ИЗ
    РегистрНакопления.Сертификаты.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, , ) КАК СертификатыОстаткиИОбороты

Обратите внимание на третий параметр виртуальной таблицы — Регистратор. Именно он позволяет системе «развернуть» остатки в хронологической последовательности по каждому документу. Если указать периодичность Период, данные будут сгруппированы по дням/месяцам, а если оставить пустым (Авто) — вы увидите только общие итоги за весь выбранный интервал времени.

Шаг 2: Учет всех измерений регистра

Выясним причину, по которой даже в правильной таблице данные могут казаться неверными. Часто разработчики забывают, что остатки в 1С хранятся в разрезе всех измерений регистра. Если в вашем регистре есть измерения Сертификат и Клиент, то остаток считается для каждой уникальной пары «Сертификат + Клиент».

Если вы выберете в запросе только Сертификат, но не выберете Клиент, и по одному сертификату проходили движения по разным клиентам, СКД сгруппирует эти записи. Чтобы видеть детальную картину, всегда включайте в запрос все значимые измерения или убедитесь, что логика учета подразумевает уникальность ведущего измерения.

Шаг 3: Настройка ролей полей в СКД (Критически важно)

Даже если запрос идеален, СКД может неправильно посчитать итоги по группировкам (например, просто сложив все начальные остатки строк, что даст неверный результат). Чтобы этого избежать, необходимо настроить Роли полей на закладке «Набор данных».

Разберем по шагам настройку ролей для ресурсов-остатков:

  1. Для поля НачальныйОстаток:
    • Установите роль Остаток.
    • В колонке «Имя» введите общее имя (например, Сумма). Это свяжет начальный и конечный остаток в одну логическую цепочку.
    • Тип остатка: Начальный.
    • Поле счета/Бухгалтерские поля обычно оставляем пустыми для регистров накопления, но обязательно указываем поле периода (например, Период или Регистратор).
  2. Для поля КонечныйОстаток:
    • Установите роль Остаток.
    • Имя: такое же, как у начального (Сумма).
    • Тип остатка: Конечный.

Благодаря этим настройкам СКД поймет, что при суммировании итогов по вертикали нужно брать значение начального остатка из первой записи периода, а конечного — из последней, а не просто складывать их математически.

Шаг 4: Оптимизация фильтрации

Посмотрим на частую ошибку в секции ГДЕ. Автор первого сообщения использовал фильтр ГДЕ Сертификаты.ФормаОплаты <> &Сертификат. В случае с виртуальными таблицами это крайне неэффективно.

Правило: Все условия на измерения регистра должны накладываться в параметрах виртуальной таблицы. Это позволяет серверу СУБД отсечь ненужные записи еще на этапе выборки из таблиц итогов, а не фильтровать уже полученный огромный массив данных. Исправленный фрагмент запроса будет выглядеть так:


РегистрНакопления.Сертификаты.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, , ФормаОплаты <> &ИсключаемаяФорма)

Шаг 5: Проблема «пустых» остатков и отсутствия движений

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

Также важно помнить про Момент времени. Если два документа созданы в одну и ту же секунду, 1С выстраивает их в последовательность на основе внутреннего идентификатора позиции. Используя ОстаткиИОбороты с периодичностью Регистратор, вы автоматически получаете данные в правильном хронологическом порядке, что позволяет видеть, как именно каждый документ менял баланс сертификата.

Итоги

Для создания качественного отчета по остаткам в СКД придерживайтесь следующего алгоритма:

Соблюдение этих правил гарантирует точность данных и высокую скорость работы вашего отчета.

← На главную