Приветствуем вас, уважаемые коллеги! Сегодня мы детально разберем одну из классических и весьма коварных проблем, с которой часто сталкиваются разработчики при построении отчетов в Системе компоновки данных (СКД) на платформе 1С. Речь идет о появлении нежелательных пустых строк в отчете, когда мы пытаемся вывести независимые группировки на одном уровне иерархии.
Особенно ярко эта проблема проявляется при попытке объединить в одном отчете данные из разных табличных частей одного документа — например, перечень товаров и список выполненных работ из документа ЗаказНаряд. Давайте проанализируем ситуацию, выясним глубинную причину такого поведения системы компоновки и разберем по шагам несколько эффективных способов решения этой задачи.
Для начала давайте детально изучим механизм возникновения этой проблемы. Предположим, у нас есть документ ЗаказНаряд, содержащий две табличные части: Товары и Работы. Нам необходимо вывести их в один отчет на одном уровне группировки. Для этого мы пишем запрос с использованием конструкции ОБЪЕДИНИТЬ ВСЕ.
Посмотрим на пример такого запроса:
ВЫБРАТЬ ПЕРВЫЕ 100
ЗаказНарядРаботы.Ссылка КАК Ссылка,
ЗаказНарядРаботы.Работа КАК Работа,
NULL КАК Номенклатура
ИЗ
Документ.ЗаказНаряд.Работы КАК ЗаказНарядРаботы
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ПЕРВЫЕ 100
ЗаказНарядТовары.Ссылка КАК Ссылка,
NULL КАК Работа,
ЗаказНарядТовары.Номенклатура КАК Номенклатура
ИЗ
Документ.ЗаказНаряд.Товары КАК ЗаказНарядТовары
Когда этот запрос выполняется, СУБД возвращает плоскую таблицу. В строках, полученных из первой части запроса (работы), колонка Номенклатура будет содержать значение NULL. В строках из второй части (товары) колонка Работа также будет содержать NULL.
Когда СКД начинает строить группировки по полям Работа и Номенклатура, расположенным на одном уровне, она обрабатывает абсолютно все записи выборки. Для группировки Работа значение NULL является полноценным и уникальным значением. СКД честно создает под него группировочную строку. Аналогично происходит и с группировкой по полю Номенклатура — для строк с работами СКД выведет отдельную пустую строку группировки, так как там поле Номенклатура равно NULL. В результате в отчете появляются раздражающие пустые строки перед реальными данными.
Давайте рассмотрим подробнее четыре практических способа решения этой проблемы, начиная от самых простых и заканчивая наиболее правильными с точки зрения архитектуры базы данных.
Этот способ является наиболее быстрым и лаконичным, поскольку использует встроенный стандартный механизм платформы 1С. Мы можем указать системе компоновки данных, что при построении группировок пустые значения типа NULL следует просто игнорировать.
Разберем этот процесс по шагам:
Работа и Номенклатура.Работа.Номенклатура.Важное примечание: данный способ сработает безупречно только в том случае, если в базе данных и в результате запроса действительно присутствует значение NULL. Если же в процессе компоновки или из-за особенностей виртуальных таблиц NULL неявно преобразуется в пустую ссылку соответствующего справочника (например, ПустаяСсылка) или в значение Неопределено, данный флаг не решит проблему. В таком случае система все равно продолжит выводить пустые строки для этих типов данных.
Если глобальный отбор на уровне всего отчета исключит нужные нам записи (например, отфильтровав все строки, где Работа не заполнена, мы потеряем товары), то мы можем применить локальный отбор непосредственно внутри структуры настроек СКД к конкретным группировкам.
Рассмотрим, как настроить такую фильтрацию:
Работа.Работа — вид сравнения «Заполнено».Номенклатура и проделаем аналогичные действия: добавим отбор по условию Номенклатура Заполнено и отключим вывод этого отбора на печать.Этот метод гарантирует, что группировка по работам будет строиться только по тем строкам, где поле работы действительно заполнено, полностью исключая пустые строки.
Давайте проанализируем ситуацию с точки зрения архитектуры данных. Очень часто и товары, и работы в конфигурациях 1С (особенно в типовых решениях, таких как «Управление нашей фирмой» или «ERP Управление предприятием») хранятся в одном и том же справочнике — СправочникСсылка.Номенклатура. Если это так, то выводить их в разные колонки и группировки часто нет никакой реальной необходимости.
Гораздо правильнее и изящнее будет объединить эти поля на уровне самого SQL-запроса в одну общую колонку, а разделение на товары и услуги производить с помощью дополнительного булева флага или типа номенклатуры. Это полностью решит проблему пустых строк, так как группировка в СКД будет всего одна.
Посмотрим на пример измененного запроса:
ВЫБРАТЬ ПЕРВЫЕ 100
ЗаказНарядРаботы.Ссылка КАК Ссылка,
ЗаказНарядРаботы.Работа КАК НоменклатураИлиРабота,
ИСТИНА КАК ЭтоРабота
ИЗ
Документ.ЗаказНаряд.Работы КАК ЗаказНарядРаботы
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ПЕРВЫЕ 100
ЗаказНарядТовары.Ссылка КАК Ссылка,
ЗаказНарядТовары.Номенклатура КАК НоменклатураИлиРабота,
ЛОЖЬ КАК ЭтоРабота
ИЗ
Документ.ЗаказНаряд.Товары КАК ЗаказНарядТовары
После такого изменения запроса наши настройки в СКД станут максимально простыми:
НоменклатураИлиРабота вместо двух параллельных.NULL физически невозможно.ЭтоРабота мы можем использовать для условного оформления. Например, мы можем настроить выделение строк с работами курсивом, изменить цвет текста или вывести в отдельной колонке текстовый признак «Товар» / «Услуга».Этот способ является наиболее профессиональным, так как он упрощает структуру схемы компоновки данных и делает отчет более производительным.
Бывают ситуации, когда вносить изменения в запрос нежелательно (например, если отчет типовой и находится на поддержке), а роли полей не отрабатывают из-за того, что вместо NULL из базы приходят пустые ссылки (""). В таком случае мы можем прибегнуть к визуальной маскировке пустых строк с помощью механизма условного оформления СКД.
Давайте настроим условное оформление по шагам:
0.1 (или 1). Также можно использовать свойство «Видимость» со значением Ложь, однако на некоторых версиях платформы 1С полное отключение видимости строки группировки может сбивать границы сетки таблицы, тогда как мизерная высота строки делает ее абсолютно невидимой без побочных визуальных эффектов.Работа Не заполнено (или Номенклатура Не заполнено в зависимости от того, какую именно пустую группировку мы маскируем).Используя этот обходной путь, мы добьемся визуальной чистоты отчета, скрыв технические пустые строки от конечного пользователя.
Мы рассмотрели четыре различных подхода к решению проблемы пустых строк в СКД. Подводя итог, дадим краткую рекомендацию по выбору метода:
NULL присутствуют пустые ссылки — примените локальные фильтры из Способа 2 или визуальное скрытие из Способа 4.Надеемся, эти практические рекомендации помогут вам создавать красивые, быстрые и безошибочные отчеты на платформе 1С. Успешной вам разработки!