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

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

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

Причина возникновения проблемы

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

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

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

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

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

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

Способ 2. Добавление реквизита в поля группировки

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

Рассмотрим алгоритм действий:

  1. В настройках отчета выберем нужную группировку (например, БюджетДС).
  2. Перейдем на закладку «Поля группировки».
  3. Добавим туда не только само поле БюджетДС, но и его реквизит — БюджетДС.Код.
  4. Тип группировки при этом должен оставаться «Иерархия» (или «Иерархия только», в зависимости от задачи).

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

Анализ ошибки «Нельзя устанавливать два элемента в иерархии»

Часто программисты пытаются добавить второе поле (тот самый Код) в список группировок с типом «Иерархия». Система при этом выдает ошибку. Проанализируем, почему это происходит. Иерархия в 1С строится по ссылочному типу данных. Система берет ссылку объекта, находит его родителя и строит дерево. Поле Код является строкой или числом, оно не имеет структуры подчинения «родитель-ребенок». Поэтому иерархическая группировка возможна только по ссылочному полю (например, Ссылка или Номенклатура), а все остальные поля должны идти следом как обычные поля группировки или просто выбранные поля.

Способ 3. Использование выбранных полей и дочерних элементов

Если мы хотим оставить структуру группировок чистой, нам нужно правильно настроить закладку «Выбранные поля». Разберем, как это сделать:

  1. Вместо того чтобы просто перетаскивать поле Код в список, развернем основное поле (нажмем на «плюсик» у поля БюджетДС).
  2. Найдем в выпадающем списке Код и добавим именно его.
  3. В списке это будет выглядеть как БюджетДС.Код.

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

Использование условного оформления для иерархии

Чтобы отчет выглядел профессионально, мы можем выделить строки-родители или сами колонки с кодами. Выясним, как сделать так, чтобы код у родителей выделялся жирным шрифтом вместе с наименованием:

  1. Перейдем на вкладку «Условное оформление».
  2. Добавим новое правило. В оформлении выберем Шрифт -> Жирный.
  3. В условии укажем системное поле СистемныеПоля.Уровень больше 0 или используем проверку на тип записи (например, через поле ТипЗаписи).
  4. В области укажем только те поля, которые должны изменить стиль (например, наше поле Код).

Работа с вычисляемыми полями

Бывают случаи, когда код формируется динамически или его нужно преобразовывать (например, убирать префиксы). Рассмотрим пример создания вычисляемого поля, которое будет корректно отображаться в иерархии:

  1. На закладке «Вычисляемые поля» добавим новое поле с заголовком «Чистый код».
  2. В выражении напишем: ПрефиксныеФункции.ПолучитьНомерНаПечать(БюджетДС.Код)
  3. Добавим это поле в выбранные поля отчета.
  4. Чтобы это поле отображалось и у родителей, в выражении ресурсов для этого поля можно указать Максимум(ЧистыйКод), тогда значение будет «пробрасываться» вверх по дереву иерархии.

Итоги и рекомендации

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

Если вы проектируете сложный отчет, где важна производительность, помните, что обращение «через точку» в СКД в выбранных полях не приводит к значительным замедлениям, так как система компоновки оптимизирует SQL-запрос, добавляя только необходимые соединения (LEFT JOIN). Однако, если вы добавляете реквизит в поля группировки, это может повлиять на количество записей и скорость обработки данных, поэтому используйте этот метод только тогда, когда вам действительно нужно группировать данные по сочетанию «Ссылка + Код».

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

← На главную