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

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

Приветствуем вас, уважаемые коллеги! Сегодня мы детально разберем одну из классических и весьма коварных проблем, с которой часто сталкиваются разработчики при построении отчетов в Системе компоновки данных (СКД) на платформе 1С. Речь идет о появлении нежелательных пустых строк в отчете, когда мы пытаемся вывести независимые группировки на одном уровне иерархии.

Особенно ярко эта проблема проявляется при попытке объединить в одном отчете данные из разных табличных частей одного документа — например, перечень товаров и список выполненных работ из документа ЗаказНаряд. Давайте проанализируем ситуацию, выясним глубинную причину такого поведения системы компоновки и разберем по шагам несколько эффективных способов решения этой задачи.

Почему в СКД появляются пустые строки при объединении данных?

Для начала давайте детально изучим механизм возникновения этой проблемы. Предположим, у нас есть документ ЗаказНаряд, содержащий две табличные части: Товары и Работы. Нам необходимо вывести их в один отчет на одном уровне группировки. Для этого мы пишем запрос с использованием конструкции ОБЪЕДИНИТЬ ВСЕ.

Посмотрим на пример такого запроса:


ВЫБРАТЬ ПЕРВЫЕ 100
    ЗаказНарядРаботы.Ссылка КАК Ссылка,
    ЗаказНарядРаботы.Работа КАК Работа,
    NULL КАК Номенклатура
ИЗ
    Документ.ЗаказНаряд.Работы КАК ЗаказНарядРаботы

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ ПЕРВЫЕ 100
    ЗаказНарядТовары.Ссылка КАК Ссылка,
    NULL КАК Работа,
    ЗаказНарядТовары.Номенклатура КАК Номенклатура
ИЗ
    Документ.ЗаказНаряд.Товары КАК ЗаказНарядТовары

Когда этот запрос выполняется, СУБД возвращает плоскую таблицу. В строках, полученных из первой части запроса (работы), колонка Номенклатура будет содержать значение NULL. В строках из второй части (товары) колонка Работа также будет содержать NULL.

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

Давайте рассмотрим подробнее четыре практических способа решения этой проблемы, начиная от самых простых и заканчивая наиболее правильными с точки зрения архитектуры базы данных.

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

Этот способ является наиболее быстрым и лаконичным, поскольку использует встроенный стандартный механизм платформы 1С. Мы можем указать системе компоновки данных, что при построении группировок пустые значения типа NULL следует просто игнорировать.

Разберем этот процесс по шагам:

  1. Откроем нашу схему компоновки данных и перейдем на вкладку «Наборы данных».
  2. В списке полей нашего набора данных найдем поля Работа и Номенклатура.
  3. Обратим внимание на колонку «Роль». Нажмем на кнопку выбора (три точки) в этой колонке для поля Работа.
  4. В открывшемся диалоговом окне редактирования роли поля найдем параметр «Игнорировать значения NULL» и установим напротив него флажок.
  5. Повторим аналогичную операцию для поля Номенклатура.
  6. Сохраним схему и сформируем отчет заново.

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

Способ 2. Установка точечного отбора на уровне конкретной группировки

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

Рассмотрим, как настроить такую фильтрацию:

  1. Перейдем на вкладку «Настройки» в схеме компоновки данных.
  2. В окне структуры отчета выделим группировку по полю Работа.
  3. В нижней части экрана перейдем на вкладку «Отбор». Обратите внимание, что мы настраиваем отбор не для всего отчета, а именно для выделенной группировки!
  4. Добавим новое условие отбора: поле Работа — вид сравнения «Заполнено».
  5. Чтобы в шапке или подвале отчета не выводилась служебная информация об этом техническом фильтре, перейдем на вкладку «Другие настройки» для этой же группировки. Найдем параметр «Выводить отбор» и установим для него значение «Не выводить».
  6. Теперь выделим в структуре отчета соседнюю группировку по полю Номенклатура и проделаем аналогичные действия: добавим отбор по условию Номенклатура Заполнено и отключим вывод этого отбора на печать.

Этот метод гарантирует, что группировка по работам будет строиться только по тем строкам, где поле работы действительно заполнено, полностью исключая пустые строки.

Способ 3. Объединение полей в запросе (Рекомендуемый подход)

Давайте проанализируем ситуацию с точки зрения архитектуры данных. Очень часто и товары, и работы в конфигурациях 1С (особенно в типовых решениях, таких как «Управление нашей фирмой» или «ERP Управление предприятием») хранятся в одном и том же справочнике — СправочникСсылка.Номенклатура. Если это так, то выводить их в разные колонки и группировки часто нет никакой реальной необходимости.

Гораздо правильнее и изящнее будет объединить эти поля на уровне самого SQL-запроса в одну общую колонку, а разделение на товары и услуги производить с помощью дополнительного булева флага или типа номенклатуры. Это полностью решит проблему пустых строк, так как группировка в СКД будет всего одна.

Посмотрим на пример измененного запроса:


ВЫБРАТЬ ПЕРВЫЕ 100
    ЗаказНарядРаботы.Ссылка КАК Ссылка,
    ЗаказНарядРаботы.Работа КАК НоменклатураИлиРабота,
    ИСТИНА КАК ЭтоРабота
ИЗ
    Документ.ЗаказНаряд.Работы КАК ЗаказНарядРаботы

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ ПЕРВЫЕ 100
    ЗаказНарядТовары.Ссылка КАК Ссылка,
    ЗаказНарядТовары.Номенклатура КАК НоменклатураИлиРабота,
    ЛОЖЬ КАК ЭтоРабота
ИЗ
    Документ.ЗаказНаряд.Товары КАК ЗаказНарядТовары

После такого изменения запроса наши настройки в СКД станут максимально простыми:

  1. В структуре отчета мы делаем всего одну группировку по полю НоменклатураИлиРабота вместо двух параллельных.
  2. Так как в каждой строке это поле гарантированно заполнено (там всегда будет либо конкретный товар, либо конкретная услуга), появление пустых строк из-за NULL физически невозможно.
  3. Дополнительное булево поле ЭтоРабота мы можем использовать для условного оформления. Например, мы можем настроить выделение строк с работами курсивом, изменить цвет текста или вывести в отдельной колонке текстовый признак «Товар» / «Услуга».

Этот способ является наиболее профессиональным, так как он упрощает структуру схемы компоновки данных и делает отчет более производительным.

Способ 4. Скрытие строк через Условное Оформление

Бывают ситуации, когда вносить изменения в запрос нежелательно (например, если отчет типовой и находится на поддержке), а роли полей не отрабатывают из-за того, что вместо NULL из базы приходят пустые ссылки (""). В таком случае мы можем прибегнуть к визуальной маскировке пустых строк с помощью механизма условного оформления СКД.

Давайте настроим условное оформление по шагам:

  1. Перейдем на вкладку «Настройки» нашей схемы компоновки данных.
  2. Перейдем на вкладку «Условное оформление».
  3. Добавим новый элемент оформления.
  4. В появившемся окне в поле «Оформление» найдем свойство «Максимальная высота» и установим для него значение 0.1 (или 1). Также можно использовать свойство «Видимость» со значением Ложь, однако на некоторых версиях платформы 1С полное отключение видимости строки группировки может сбивать границы сетки таблицы, тогда как мизерная высота строки делает ее абсолютно невидимой без побочных визуальных эффектов.
  5. В поле «Условие» добавим новое условие: Работа Не заполнено (или Номенклатура Не заполнено в зависимости от того, какую именно пустую группировку мы маскируем).
  6. В поле «Оформляемые поля» укажем те поля нашей группировки, которые выводят пустые значения.

Используя этот обходной путь, мы добьемся визуальной чистоты отчета, скрыв технические пустые строки от конечного пользователя.

Резюме

Мы рассмотрели четыре различных подхода к решению проблемы пустых строк в СКД. Подводя итог, дадим краткую рекомендацию по выбору метода:

Надеемся, эти практические рекомендации помогут вам создавать красивые, быстрые и безошибочные отчеты на платформе 1С. Успешной вам разработки!

← На главную