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