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