При разработке отчетов в системе компоновки данных (СКД) с использованием виртуальных таблиц остатков и оборотов программисты часто сталкиваются с неприятным эффектом. При добавлении в структуру отчета группировки по полю Регистратор или детальных записей в готовом отчете начинают выводиться странные пустые строки. В этих строках отсутствует сам документ-регистратор и сопутствующая аналитика, однако в колонках начального и конечного остатков выводятся вполне реальные суммы.
Давайте подробно разберем, почему СКД ведет себя подобным образом, проанализируем основные причины этой проблемы и рассмотрим пошаговые методы ее решения.
Когда мы обращаемся к виртуальной таблице ОстаткиИОбороты, платформа 1С выполняет сложный расчет итогов. Ей необходимо вычислить остатки на начало выбранного периода, зафиксировать все обороты (движения документов) внутри периода и рассчитать конечные остатки на границу окончания периода.
Если в настройках структуры отчета мы указываем группировку по полю Регистратор, СКД пытается сопоставить каждую строку с конкретным документом, сделавшим движение. Но на границах периодов (например, на начало месяца) остаток уже существует, и он сформирован документами из прошлых периодов. У этого начального остатка в рамках текущего запроса нет конкретного документа-регистратора.
Поскольку физического регистратора для начального и конечного остатка в выбранном периоде не существует, поле Регистратор для этих записей принимает значение NULL или НЕОПРЕДЕЛЕНО. Система компоновки данных, не зная, как сгруппировать эти строки, выводит их отдельно — так и появляются строки с пустым регистратором, содержащие суммы остатков.
Также к этой проблеме могут приводить пустые значения в самих измерениях регистра накопления или некорректно настроенные левые соединения в тексте запроса. Ниже мы разберем каждый случай подробно.
---
Это самый правильный, классический способ решения проблемы на уровне настроек самой СКД. Нам нужно подсказать системе, как правильно сопоставлять периоды различной детализации, и указать, что пустые значения регистратора нужно игнорировать при выводе остатков.
Разберем этот процесс по шагам:
Регистратор.ПериодСекунда), найдем его в списке полей и также настроим его роль:
Установка флага "Игнорировать NULL" сообщает СКД, что если значение регистратора не определено (равно NULL), то эту строку не нужно выводить отдельно. Система "схлопнет" начальные и конечные остатки с соответствующими периодами и не будет плодить пустые детальные записи.
---
Иногда СКД может некорректно отрабатывать роли полей, если значение регистратора возвращается из базы данных как НЕОПРЕДЕЛЕНО, а не как чистое системное значение NULL. Чтобы гарантировать корректное поведение механизма компоновки, мы можем принудительно заменять неопределенные ссылки на NULL прямо в тексте запроса.
Рассмотрим пример реализации такого запроса в конструкторе схемы компоновки данных:
ВЫБРАТЬ
РасчетыОстаткиИОбороты.Маклер КАК Маклер,
РасчетыОстаткиИОбороты.Контрагент КАК Контрагент,
ВЫБОР
КОГДА РасчетыОстаткиИОбороты.Регистратор = НЕОПРЕДЕЛЕНО
ТОГДА NULL
ИНАЧЕ РасчетыОстаткиИОбороты.Регистратор
КОНЕЦ КАК Регистратор,
РасчетыОстаткиИОбороты.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток,
РасчетыОстаткиИОбороты.СуммаОборот КАК СуммаОборот,
РасчетыОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток
ИЗ
РегистрНакопления.РасчетыСМаклерами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК РасчетыОстаткиИОбороты
При использовании этого запроса совместно с настроенной ролью поля Регистратор (как описано в Способе 1) пустые строки гарантированно исчезнут, так как СКД сможет однозначно идентифицировать и проигнорировать пустые значения.
---
По умолчанию виртуальная таблица остатков и оборотов использует метод дополнения, который заставляет систему выводить границы периодов (начало и конец), даже если по аналитике не было никаких движений за выбранный интервал. Это также провоцирует появление пустых строк.
Мы можем скорректировать параметры виртуальной таблицы в запросе:
ОстаткиИОбороты, чтобы открыть окно настройки ее параметров.ДвиженияИГраницыПериода. Изменим его на значение Движения.После изменения этого параметра система перестанет искусственно генерировать строки для незаполненных границ периодов, если за это время не происходило никаких реальных движений по регистру.
---
Очень часто пустые строки в отчете СКД возникают из-за архитектурных ошибок в самом запросе. Распространенный сценарий: разработчик соединяет таблицу регистра накопления с таблицей документов (например, ЗаказПокупателя) левым соединением и выводит в отчет реквизиты из присоединенной таблицы вместо реквизитов самого регистра.
Проанализируем пример некорректного запроса:
ВЫБРАТЬ
Расчеты.Маклер КАК Маклер,
ЗаказПокупателя.Контрагент КАК Контрагент, // ОШИБКА: Поле выбирается из присоединенной таблицы!
Расчеты.СуммаОборот КАК СуммаОборот
ИЗ
РегистрНакопления.РасчетыСМаклерами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК Расчеты
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателя
ПО Расчеты.Заказ = ЗаказПокупателя.Ссылка
Если в регистре накопления есть движения с незаполненным измерением Заказ (или если документ был удален), левое соединение вернет значение NULL для поля Контрагент. В отчете это отобразится как пустая строка с суммами.
Как исправить эту ситуацию:
Контрагент или Маклер) непосредственно из измерений самого регистра накопления. Регистры проектируются так, чтобы содержать в себе всю необходимую для отчетности информацию без лишних соединений.ЕСТЬNULL, заменяя пустые значения на пустые ссылки соответствующего типа.Посмотрим на исправленный и оптимизированный вариант запроса:
ВЫБРАТЬ
Расчеты.Маклер КАК Маклер,
ЕСТЬNULL(Расчеты.Контрагент, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) КАК Контрагент,
Расчеты.СуммаОборот КАК СуммаОборот
ИЗ
РегистрНакопления.РасчетыСМаклерами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК Расчеты
---
Если вам нужно оперативно решить проблему "здесь и сейчас", не меняя структуру запроса и не настраивая роли полей, можно воспользоваться механизмом отборов в настройках компоновки данных. Этот способ просто скрывает пустые строки от пользователя, сохраняя при этом корректность общих итогов по отчету.
Выполним следующие действия в СКД:
Регистратор (или детальные записи, в которых выводятся пустые строки).Регистратор.Благодаря этой настройке СКД отфильтрует все строки, где отсутствует регистратор, и не выведет их пользователю, но при этом общие итоги по отчету (ресурсы) будут рассчитаны верно, с учетом всех движений.
---
Чтобы минимизировать появление подобных проблем при разработке отчетов в будущем, рекомендуем придерживаться простых правил при проектировании метаданных и написании кода проведения:
&НачалоПериода и &КонецПериода, чтобы СКД могла четко очертить границы временных интервалов.Мы подробно разобрали все возможные причины появления пустых строк в отчетах СКД и изучили пять надежных способов их устранения. Выбирайте наиболее подходящий метод для вашей конфигурации и создавайте качественные, удобные отчеты для пользователей.