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

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

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

Почему в отчете появляются лишние строки?

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

Если в периоде не было движений по конкретному набору измерений, но остаток есть, СКД все равно должна его показать. При группировке по регистратору возникает конфликт: у начального и конечного остатка нет документа-регистратора. В результате система выводит пустую ячейку (значение Неопределено), что пользователь видит как лишнюю строку в отчете. Иногда таких строк может быть больше одной, если настройки дополнения периодов выполнены некорректно.

Способ 1. Использование NULL и настройки «Игнорировать NULL»

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

Рассмотрим подробнее реализацию этого метода по шагам:

  1. Модификация запроса. Нам необходимо в тексте запроса явно обработать поле Регистратор. Если значение регистратора равно Неопределено (что характерно для итоговых записей остатков), мы заменяем его на NULL.

    Обратите внимание на типичную ошибку новичков: сравнение через = NULL или <> NULL в 1С не работает привычным образом. Нужно использовать оператор ЕСТЬ NULL или сравнивать с НЕОПРЕДЕЛЕНО.

    
    ВЫБОР
        КОГДА ТоварыНаСкладахОстаткиИОбороты.Регистратор = НЕОПРЕДЕЛЕНО
            ТОГДА NULL
        ИНАЧЕ ТоварыНаСкладахОстаткиИОбороты.Регистратор
    КОНЕЦ КАК Регистратор
    
  2. Настройка роли поля в СКД. Перейдем на закладку «Наборы данных» в схеме компоновки. Найдем наше поле Регистратор и нажмем на кнопку редактирования в колонке «Роль».
  3. В открывшемся окне найдем флажок «Игнорировать значения NULL» и установим его. Именно эта настройка заставит компоновщик пропустить те самые служебные строки, которые мы пометили как NULL в запросе.

Способ 2. Правильная настройка иерархии периодов

Разберем ситуацию, когда отчет сложный и простой подмены на NULL недостаточно. Для корректного расчета остатков в СКД (особенно если вы используете несколько периодов) крайне важно соблюдать строгую иерархию в ролях полей. Если иерархия нарушена, СКД может «запутаться» и выводить лишние строки дополнения там, где они не нужны.

Выясним причину важности настройки ролей:

Проанализируем ситуацию с виртуальными таблицами: если вы выводите данные из таблицы ОстаткиИОбороты, система обычно пытается назначить роли автоматически. Однако при использовании объединений (UNION) или вложенных запросов автоматика часто дает сбой. В таких случаях ручная проверка каждой роли — единственный путь к чистому отчету.

Способ 3. Управление методом дополнения периодов

Иногда корень проблемы кроется в параметрах самой виртуальной таблицы в конструкторе запроса. Посмотрим на параметры таблицы ОстаткиИОбороты. Там есть параметр МетодДополнения.

Существует два основных варианта:

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

Если ваша задача — получить просто список документов с оборотами (без акцента на входящий/исходящий остаток в каждой строке), попробуйте переключить метод дополнения на «Движения».

Способ 4. Настройка расположения итогов

Рассмотрим еще один нюанс, упомянутый в обсуждении. Иногда лишние строки — это не записи данных, а визуальное отображение группировок или общих итогов. В настройках отчета (вкладка «Настройки» -> «Параметры вывода») найдите пункт «Расположение общих итогов по вертикали».

Попробуйте установить значение «Нет». В некоторых случаях это визуально схлопывает пустые области, которые СКД резервирует под итоговые значения по регистратору. Хотя это скорее «косметический» ремонт, он может помочь, если вы не хотите менять логику запроса.

Резюме и рекомендации

Подводя итог, можно сказать, что универсального «магического» флажка не существует, так как поведение СКД продиктовано математической логикой расчета остатков. Однако комбинация «Запрос с ВЫБОР + Роль с Игнорировать NULL» является золотым стандартом решения проблемы.

Совет: Всегда проверяйте, как ваш отчет ведет себя при отсутствии данных за период. Если после ваших манипуляций отчет стал «чистым», но при этом пропали конечные остатки в пустых периодах — значит, вы переборщили с фильтрацией NULL и нужно возвращаться к настройке ролей периодов. Работа с СКД требует внимательности к мелочам, но понимание механизмов дополнения периодов делает вас на порядок выше как специалиста.

← На главную