При разработке отчетов на базе Системы компоновки данных (СКД) в 1С часто возникает задача оптимизации экранного пространства. Типичный пример: в отчете есть иерархическая структура группировок, например, Склад и подчиненная ему Номенклатура. По умолчанию СКД выводит каждую группировку в отдельном столбце. В результате таблица сильно растягивается по горизонтали, а в строках детальных записей образуются пустые ячейки.
Для создания более компактного и профессионального интерфейса гораздо удобнее вывести эти данные в одну колонку. При этом на верхнем уровне группировки (строка склада) в колонке должно отображаться наименование склада, а на подчиненном уровне (строка номенклатуры) — наименование конкретного товара. В этой статье мы подробно разберем, как решить эту задачу несколькими способами: от классического метода настройки ресурсов до штатных механизмов расположения полей в СКД.
Этот метод считается классическим в среде разработчиков 1С. Он основан на базовом свойстве системы компоновки: возможности задавать разные формулы расчета для одного и того же ресурса на разных уровнях группировок. Давайте разберем этот процесс по шагам.
Шаг 1. Создание вычисляемого поля
Для начала нам необходимо создать единый «контейнер», в который СКД будет помещать нужные нам значения в зависимости от контекста строки. Перейдем на вкладку Вычисляемые поля в конструкторе схемы компоновки данных и добавим новую строку:
ЗначениеГруппировки.Объект учета.Шаг 2. Настройка вычисления ресурса
Теперь перейдем на вкладку Ресурсы. Именно здесь происходит основная магия. Нам нужно добавить поле ЗначениеГруппировки в список ресурсов дважды, настроив каждое под свой уровень группировки:
ЗначениеГруппировки.Максимум(Склад) (или Минимум(Склад)). Так как это ссылочное поле, агрегатная функция необходима для того, чтобы СКД воспринимала его как ресурс.Склад.ЗначениеГруппировки.Максимум(Номенклатура).Номенклатура.Почему это работает?
Когда СКД начинает рассчитывать итоги для строки группировки «Склад», она обращается к правилам расчета ресурсов. Видя ограничение «Рассчитывать по: Склад», система берет первую формулу и выводит склад. Переходя на уровень группировки «Номенклатура», СКД игнорирует формулу склада и применяет выражение, назначенное для номенклатуры. На выходе мы получаем идеальное заполнение одной колонки разными типами данных.
Шаг 3. Настройка вывода в отчет
Осталось лишь вывести наше поле. Перейдем на вкладку Настройки. В структуре отчета у нас должны быть настроены две последовательные группировки: сначала Склад, а внутри него — Номенклатура. Перейдем в Выбранные поля и добавим туда наше вычисляемое поле ЗначениеГруппировки вместо стандартных полей склада и номенклатуры.
Если перед нами стоит задача просто визуально объединить группировки в одну левую колонку, СКД предоставляет мощный стандартный инструмент, который вообще не требует создания дополнительных полей и написания формул. Давайте рассмотрим этот лаконичный вариант.
Выполним следующую последовательность действий:
Отдельно (что заставляет СКД рисовать отдельную колонку под каждую группировку).При таком подходе СКД автоматически объединит все колонки группировок в одну общую колонку. На первом уровне дерева будет отображаться склад, а при раскрытии ветки — под ним со смещением вправо отобразится номенклатура. Этот вариант наиболее предпочтителен, если вы хотите сохранить стандартное поведение иерархических списков 1С.
Иногда требуется решить задачу «от обратного». Предположим, мы вывели обе колонки (и склад, и номенклатуру), но хотим, чтобы в строке склада колонка номенклатуры была абсолютно пустой, а в строке номенклатуры — не дублировалось название склада. Для этого мы можем применить механизм Условного оформления.
Проанализируем этот метод по шагам:
Склад и Номенклатура.СистемныеПоля.УровеньВГруппировке Равно 1 (где 1 — уровень Склада).Номенклатура.СистемныеПоля.УровеньВГруппировке Равно 2 (уровень Номенклатуры).Склад.Этот способ позволяет гибко управлять визуальным отображением данных без изменения структуры запроса или ресурсов. Однако учитывайте, что физически в таблице останется две колонки, хотя визуально они будут заполняться «шахматным» порядком.
Для решения сложных задач трансформации данных на разных уровнях группировки разработчики часто прибегают к функциям языка выражений СКД. Одной из самых мощных является функция ВычислитьВыражение(). С её помощью мы можем динамически определять контекст расчета.
Давайте посмотрим на пример использования этой функции в выражении нашего вычисляемого поля. Мы можем сразу написать универсальное выражение на вкладке Вычисляемые поля в колонке Выражение без необходимости плодить ресурсы:
Выбор
Когда ВычислитьВыражение("УровеньВГруппировке()", , "Общая") = 1
Тогда Склад
Иначе Номенклатура
Конец
Разберем, как работает это выражение:
ВычислитьВыражение("УровеньВГруппировке()", , "Общая") динамически вычисляет текущую глубину вложенности строки отчета в контексте всего результата.Выбор...Конец анализирует полученный уровень. Если уровень равен 1, система выводит значение реквизита Склад. Для всех последующих уровней выводится Номенклатура.Этот способ незаменим, когда в отчете используется сложная иерархия с множеством уровней группировки, и вам требуется тонко настраивать логику вывода полей программным путем.