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