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