Как в СКД вывести группу вместо элемента при выполнении условия и избежать пустых значений

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

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

Разбор основной проблемы: почему появляется пустота

Рассмотрим ситуацию, описанную пользователем. В схеме компоновки данных используется следующее выражение в запросе или вычисляемом поле:


ВЫБОР 
    КОГДА Контрагент.ВыводитьГруппу ТОГДА
        Контрагент.Родитель
    ИНАЧЕ
        Контрагент
КОНЕЦ

Проанализируем, что происходит на техническом уровне. Основная причина "пустоты" в отчете — это работа с элементами, которые находятся в корне справочника. У таких элементов поле Родитель физически содержит пустую ссылку (ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)). В интерфейсе 1С пустая ссылка по умолчанию отображается как пустая строка, если не задано иное представление.

Кроме того, если СКД не может однозначно определить тип значения для вычисляемого поля, она может не вывести представление объекта. Выясним, как сделать поведение системы предсказуемым.

Решение 1: Обработка пустых ссылок в языке запросов

Первым делом нам необходимо модифицировать логику так, чтобы система понимала: если родителя нет (корень), нужно выводить сам объект, даже если флаг ВыводитьГруппу установлен. Для этого в запросе следует использовать проверку на пустую ссылку.

Рассмотрим правильный вариант написания условия:


ВЫБОР
    КОГДА Контрагент.ВыводитьГруппу 
          И Контрагент.Родитель <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ТОГДА
        Контрагент.Родитель
    ИНАЧЕ
        Контрагент
КОНЕЦ

В этом случае, если контрагент находится в корне, условие Контрагент.Родитель <> ЗНАЧЕНИЕ(...) не выполнится, и система вернет самого контрагента, предотвращая появление пустой строки в отчете.

Решение 2: Использование функции ЕСТЬNULL (для левых соединений)

Если данные о контрагенте или его родителе выбираются через левое соединение с другой таблицей, в поле может оказаться значение NULL. Важно помнить, что NULL и ПустаяСсылка — это разные понятия в 1С. Проанализируем, как обезопасить отчет в таком случае:


ВЫБОР
    КОГДА ЕСТЬNULL(Контрагент.ВыводитьГруппу, ЛОЖЬ) ТОГДА
        ЕСТЬNULL(Контрагент.Родитель, Контрагент)
    ИНАЧЕ
        Контрагент
КОНЕЦ

Функция ЕСТЬNULL подставит значение самого контрагента, если ссылка на родителя отсутствует в результате соединения таблиц.

Решение 3: Настройка типизации в Вычисляемых полях

Если вы прописываете логику не в запросе, а на закладке "Вычисляемые поля" СКД, система должна четко понимать, какой тип данных возвращается. Посмотрим на алгоритм настройки:

  1. Перейдите на закладку "Вычисляемые поля".
  2. В колонке "Выражение" вставьте вашу формулу.
  3. Найдите колонку "Тип значения". Это критически важный момент!
  4. Нажмите на кнопку выбора и явно укажите тип: СправочникСсылка.Контрагенты.

Когда тип указан явно, СКД активирует механизмы получения стандартного представления для ссылки, и вместо пустоты вы увидите наименование объекта.

Решение 4: Использование выражений представления

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

Попробуйте использовать функцию ПРЕДСТАВЛЕНИЕ:

ПРЕДСТАВЛЕНИЕ(ВыбранноеПоле)

Или более сложную конструкцию, которая гарантирует вывод текста:


ВЫБОР 
    КОГДА ВыбранноеПоле = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ТОГДА "" 
    ИНАЧЕ ПРЕДСТАВЛЕНИЕ(ВыбранноеПоле) 
КОНЕЦ

Решение 5: Отключение автоматической иерархии (Роли полей)

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

  1. Откройте закладку "Набор данных".
  2. Найдите поле, в котором выводится результат.
  3. Проверьте колонку "Роль". Если там указано "Иерархия" или выбрано родительское поле, попробуйте временно очистить эти настройки.
  4. Убедитесь, что поле не является частью автоматической группировки, которая ожидает только элементы определенного уровня.

Решение 6: Группировка по вычисляемому полю

Если ваша задача — не просто вывести текст, а сгруппировать данные по этому "условному родителю", выполните следующие шаги:

  1. Создайте вычисляемое поле (например, ПолеДляГруппировки) с описанной выше логикой выбора.
  2. В настройках отчета (закладка "Настройки") добавьте новую группировку.
  3. В качестве поля группировки выберите именно ваше ПолеДляГруппировки.
  4. В детальных записях оставьте обычного Контрагента.

Важный нюанс: Если вы используете это поле в группировке, убедитесь, что в запросе не включены итоги по родителям, иначе вы получите дублирование данных: один раз по реальной иерархии, второй раз по вашей логике ВЫБОР КОГДА.

Заключение

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

← На главную