Почему в отчете СКД появляются пустые строки с заполненными ресурсами и как вывести общие итоги?

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

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

Причина 1: Не определены ресурсы или типы данных полей

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

  1. Типизация полей в наборе данных: Если поле рассчитывается выражением в запросе (например, делением на коэффициент единицы измерения), платформа может определить его тип как составной или неопределенный. Перейдем на вкладку Наборы данных и в колонке Тип значения явно укажем для числовых показателей тип Число с необходимой точностью.
  2. Настройка вкладки «Ресурсы»: По умолчанию СКД не рассчитывает итоги для полей, пока они не добавлены на вкладку Ресурсы. Перенесем все суммовые и количественные поля в список ресурсов и зададим для них агрегатные выражения, например, Сумма(КоличествоПриход), Сумма(КоличествоРасход) или специализированные формулы для расчета остатков.

Причина 2: Особенности виртуальной таблицы «ОстаткиИОбороты» с периодичностью «Регистратор»

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


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

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

Способ 1: Корректная настройка ролей полей периода в СКД

Чтобы система компоновки данных корректно интерпретировала временную иерархию и не выводила фиктивные строки документов, настроим роли полей на вкладке Наборы данных:

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

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

Способ 2: Разделение уровней группировки и отбор на детальные записи

Если требуется построить классическую карточку движения товара (начальный остаток, движения за период, конечный остаток), настроим структуру отчета на вкладке Настройки:

  1. Создадим родительскую группировку по аналитике (например, СкладКомпании, Номенклатура). В выбранных полях родительской группировки выведем: КоличествоНачальныйОстаток, КоличествоПриход, КоличествоРасход, КоличествоКонечныйОстаток.
  2. Внутрь родительской группировки добавим подчиненную группировку ДокументДвижения (или детальные записи). В выбранных полях подчиненной строки оставим только поля регистратора и оборотов: ДатаЗаписи, ДокументДвижения, КоличествоПриход, КоличествоРасход.
  3. На подчиненную группировку (не на весь отчет!) наложим отбор: ДокументДвижения Заполнено или условие КоличествоПриход <> 0 ИЛИ КоличествоРасход <> 0.

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

Способ 3: Разделение данных на два независимых набора

Для высоконагруженных отчетов эффективным архитектурным решением является разделение выборки на два отдельных набора данных внутри схемы компоновки:

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

Оптимизация обращений через точку к составному типу «Регистратор»

Обратим внимание на конструкцию запроса в секции ВЫБОР. Множественные обращения через точку вида ОстаткиИОбороты.Регистратор.Контрагент или ОстаткиИОбороты.Регистратор.СкладПолучатель к полю составного типа приводят к тому, что СУБД выполняет неявное левое соединение со всеми возможными таблицами документов конфигурации. Для ускорения работы отчета рекомендуется переносить часто используемую аналитику (контрагентов, склады) непосредственно в реквизиты регистра накопления или использовать периодичность Авто в СКД.

← На главную