При работе с Системой компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда при построении иерархического отчета реквизиты (например, Код или Артикул) отображаются некорректно. Они либо выводятся в одной ячейке с наименованием через запятую, либо вовсе отсутствуют в строках-родителях, оставаясь только у детальных записей. Разберем подробно, как настроить отчет так, чтобы код всегда находился в отдельной колонке на всех уровнях иерархии.
По умолчанию СКД настроена на максимально компактное представление данных. Если мы добавляем в выбранные поля основное поле группировки (например, Номенклатура) и его реквизит (Номенклатура.Код), система пытается объединить их в одной колонке. Кроме того, при использовании типа группировки "Иерархия", СКД генерирует «виртуальные» записи для родителей, и если настройки расположения полей не заданы явно, данные реквизитов в этих строках могут не отображаться.
Рассмотрим пошагово основные способы решения этой задачи, начиная от самых простых настроек и заканчивая нюансами работы с полями группировки.
Проанализируем самый быстрый и правильный метод, который позволяет разделить основное поле и его дополнительные данные без изменения структуры запроса. Этот метод основан на использовании стандартных настроек компоновки.
Важный нюанс: Если мы установим это значение в общих настройках всего отчета, то все реквизиты всех полей (код, артикул, ИНН и т.д.) будут выводиться в собственных колонках. Если же нам нужно разделить только конкретное поле, настройки следует применять именно к этой группировке.
Иногда простой настройки расположения недостаточно, особенно если мы хотим, чтобы Код считался частью ключа группировки. Выясним, как принудительно заставить систему выводить данные для иерархических узлов.
Рассмотрим алгоритм действий:
БюджетДС).БюджетДС, но и его реквизит — БюджетДС.Код.В этом случае система включает код в контекст каждой строки иерархии, и он гарантированно будет доступен для вывода в отдельную ячейку.
Часто программисты пытаются добавить второе поле (тот самый Код) в список группировок с типом «Иерархия». Система при этом выдает ошибку. Проанализируем, почему это происходит. Иерархия в 1С строится по ссылочному типу данных. Система берет ссылку объекта, находит его родителя и строит дерево. Поле Код является строкой или числом, оно не имеет структуры подчинения «родитель-ребенок». Поэтому иерархическая группировка возможна только по ссылочному полю (например, Ссылка или Номенклатура), а все остальные поля должны идти следом как обычные поля группировки или просто выбранные поля.
Если мы хотим оставить структуру группировок чистой, нам нужно правильно настроить закладку «Выбранные поля». Разберем, как это сделать:
Код в список, развернем основное поле (нажмем на «плюсик» у поля БюджетДС).Код и добавим именно его.БюджетДС.Код.Посмотрим, что произойдет, если мы добавим поле Код, которое вычисляется в запросе отдельно (как самостоятельное поле набора данных), а не как реквизит ссылки. В такой ситуации для иерархических записей поле может оказаться пустым, так как СКД не всегда может автоматически сопоставить отдельное поле с виртуальным родителем. Поэтому всегда предпочтительнее обращаться к коду «через точку» от основного объекта группировки.
Чтобы отчет выглядел профессионально, мы можем выделить строки-родители или сами колонки с кодами. Выясним, как сделать так, чтобы код у родителей выделялся жирным шрифтом вместе с наименованием:
Шрифт -> Жирный.СистемныеПоля.Уровень больше 0 или используем проверку на тип записи (например, через поле ТипЗаписи).Код).Бывают случаи, когда код формируется динамически или его нужно преобразовывать (например, убирать префиксы). Рассмотрим пример создания вычисляемого поля, которое будет корректно отображаться в иерархии:
ПрефиксныеФункции.ПолучитьНомерНаПечать(БюджетДС.Код)
Максимум(ЧистыйКод), тогда значение будет «пробрасываться» вверх по дереву иерархии.Подводя итог, можно сказать, что наиболее стабильным решением является сочетание двух действий: использование обращения к реквизиту через точку (Поле.Код) и установка настройки «Расположение реквизитов: Отдельно». Это гарантирует, что структура отчета будет сохранена, а данные не перемешаются в одной колонке.
Если вы проектируете сложный отчет, где важна производительность, помните, что обращение «через точку» в СКД в выбранных полях не приводит к значительным замедлениям, так как система компоновки оптимизирует SQL-запрос, добавляя только необходимые соединения (LEFT JOIN). Однако, если вы добавляете реквизит в поля группировки, это может повлиять на количество записей и скорость обработки данных, поэтому используйте этот метод только тогда, когда вам действительно нужно группировать данные по сочетанию «Ссылка + Код».
Рассмотренные методы помогут вам создавать читаемые и информативные иерархические отчеты, которые соответствуют требованиям бизнес-пользователей.