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

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

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

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

Выясняем причину: почему СКД создает пустые строки?

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

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

Поскольку физического регистратора для начального и конечного остатка в выбранном периоде не существует, поле Регистратор для этих записей принимает значение NULL или НЕОПРЕДЕЛЕНО. Система компоновки данных, не зная, как сгруппировать эти строки, выводит их отдельно — так и появляются строки с пустым регистратором, содержащие суммы остатков.

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

---

Способ 1. Настройка ролей полей в СКД (флаг "Игнорировать NULL")

Это самый правильный, классический способ решения проблемы на уровне настроек самой СКД. Нам нужно подсказать системе, как правильно сопоставлять периоды различной детализации, и указать, что пустые значения регистратора нужно игнорировать при выводе остатков.

Разберем этот процесс по шагам:

  1. Откроем схему компоновки данных нашего отчета и перейдем на вкладку "Наборы данных".
  2. В списке полей найдем поле Регистратор.
  3. В колонке "Роль" нажмем на кнопку настройки параметров роли поля.
  4. В открывшемся окне установим следующие параметры:
    • Тип роли: Период.
    • Порядковый номер: 1 (это указывает на то, что регистратор является самым детальным периодом).
    • Обязательно установим флажок "Игнорировать NULL".
  5. Если в запросе используется поле точного периода (например, ПериодСекунда), найдем его в списке полей и также настроим его роль:
    • Тип роли: Период.
    • Порядковый номер: 2 (должен быть больше, чем у регистратора).
    • Установим флажок "Обязательное".

Установка флага "Игнорировать NULL" сообщает СКД, что если значение регистратора не определено (равно NULL), то эту строку не нужно выводить отдельно. Система "схлопнет" начальные и конечные остатки с соответствующими периодами и не будет плодить пустые детальные записи.

---

Способ 2. Обработка регистратора через конструкцию ВЫБОР в запросе

Иногда СКД может некорректно отрабатывать роли полей, если значение регистратора возвращается из базы данных как НЕОПРЕДЕЛЕНО, а не как чистое системное значение NULL. Чтобы гарантировать корректное поведение механизма компоновки, мы можем принудительно заменять неопределенные ссылки на NULL прямо в тексте запроса.

Рассмотрим пример реализации такого запроса в конструкторе схемы компоновки данных:


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

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

---

Способ 3. Изменение метода дополнения периодов в параметрах виртуальной таблицы

По умолчанию виртуальная таблица остатков и оборотов использует метод дополнения, который заставляет систему выводить границы периодов (начало и конец), даже если по аналитике не было никаких движений за выбранный интервал. Это также провоцирует появление пустых строк.

Мы можем скорректировать параметры виртуальной таблицы в запросе:

  1. Откроем текст запроса в конструкторе.
  2. Дважды кликнем по виртуальной таблице ОстаткиИОбороты, чтобы открыть окно настройки ее параметров.
  3. Обратим внимание на четвертый параметр функции — Метод дополнения.
  4. По умолчанию там может использоваться значение ДвиженияИГраницыПериода. Изменим его на значение Движения.

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

---

Способ 4. Исправление ошибок левого соединения (LEFT JOIN)

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

Проанализируем пример некорректного запроса:


ВЫБРАТЬ
    Расчеты.Маклер КАК Маклер,
    ЗаказПокупателя.Контрагент КАК Контрагент, // ОШИБКА: Поле выбирается из присоединенной таблицы!
    Расчеты.СуммаОборот КАК СуммаОборот
ИЗ
    РегистрНакопления.РасчетыСМаклерами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК Расчеты
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателя
        ПО Расчеты.Заказ = ЗаказПокупателя.Ссылка

Если в регистре накопления есть движения с незаполненным измерением Заказ (или если документ был удален), левое соединение вернет значение NULL для поля Контрагент. В отчете это отобразится как пустая строка с суммами.

Как исправить эту ситуацию:

Посмотрим на исправленный и оптимизированный вариант запроса:


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

---

Способ 5. Использование отборов на уровне группировок СКД

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

Выполним следующие действия в СКД:

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

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

---

Полезные рекомендации по проектированию регистров

Чтобы минимизировать появление подобных проблем при разработке отчетов в будущем, рекомендуем придерживаться простых правил при проектировании метаданных и написании кода проведения:

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

← На главную