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

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

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

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

Метод №1: Динамический вывод через вычисляемые поля и ресурсы

Этот метод считается классическим в среде разработчиков 1С. Он основан на базовом свойстве системы компоновки: возможности задавать разные формулы расчета для одного и того же ресурса на разных уровнях группировок. Давайте разберем этот процесс по шагам.

Шаг 1. Создание вычисляемого поля

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

  1. В колонке Путь к данным укажем имя нашего нового поля, например: ЗначениеГруппировки.
  2. Колонку Выражение оставим абсолютно пустой. Нам не нужно вычислять это поле на уровне детальных записей.
  3. Зададим понятный Заголовок, например: Объект учета.

Шаг 2. Настройка вычисления ресурса

Теперь перейдем на вкладку Ресурсы. Именно здесь происходит основная магия. Нам нужно добавить поле ЗначениеГруппировки в список ресурсов дважды, настроив каждое под свой уровень группировки:

  1. Настройка для Склада:
    • Добавляем строку с полем ЗначениеГруппировки.
    • В поле Выражение пишем: Максимум(Склад) (или Минимум(Склад)). Так как это ссылочное поле, агрегатная функция необходима для того, чтобы СКД воспринимала его как ресурс.
    • В колонке Рассчитывать по... выбираем только группировку Склад.
  2. Настройка для Номенклатуры:
    • Добавляем вторую строку с тем же полем ЗначениеГруппировки.
    • В поле Выражение пишем: Максимум(Номенклатура).
    • В колонке Рассчитывать по... выбираем только группировку Номенклатура.

Почему это работает?

Когда СКД начинает рассчитывать итоги для строки группировки «Склад», она обращается к правилам расчета ресурсов. Видя ограничение «Рассчитывать по: Склад», система берет первую формулу и выводит склад. Переходя на уровень группировки «Номенклатура», СКД игнорирует формулу склада и применяет выражение, назначенное для номенклатуры. На выходе мы получаем идеальное заполнение одной колонки разными типами данных.

Шаг 3. Настройка вывода в отчет

Осталось лишь вывести наше поле. Перейдем на вкладку Настройки. В структуре отчета у нас должны быть настроены две последовательные группировки: сначала Склад, а внутри него — Номенклатура. Перейдем в Выбранные поля и добавим туда наше вычисляемое поле ЗначениеГруппировки вместо стандартных полей склада и номенклатуры.

Метод №2: Использование настройки «Расположение полей группировок» (Без программирования)

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

Выполним следующую последовательность действий:

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

При таком подходе СКД автоматически объединит все колонки группировок в одну общую колонку. На первом уровне дерева будет отображаться склад, а при раскрытии ветки — под ним со смещением вправо отобразится номенклатура. Этот вариант наиболее предпочтителен, если вы хотите сохранить стандартное поведение иерархических списков 1С.

Метод №3: Использование Условного оформления для скрытия значений

Иногда требуется решить задачу «от обратного». Предположим, мы вывели обе колонки (и склад, и номенклатуру), но хотим, чтобы в строке склада колонка номенклатуры была абсолютно пустой, а в строке номенклатуры — не дублировалось название склада. Для этого мы можем применить механизм Условного оформления.

Проанализируем этот метод по шагам:

  1. Добавим в выбранные поля отчета стандартные поля Склад и Номенклатура.
  2. Перейдем на вкладку Условное оформление в настройках компоновки.
  3. Создаем первое правило для очистки Номенклатуры на верхнем уровне:
    • В оформлении выберем свойство Текст и установим для него значение — пустая строка (просто включаем флажок, оставляя поле ввода незаполненным).
    • В условии укажем системный параметр проверки уровня: СистемныеПоля.УровеньВГруппировке Равно 1 (где 1 — уровень Склада).
    • В оформляемых полях выберем Номенклатура.
  4. Создаем второе правило для очистки Склада на нижнем уровне:
    • Аналогично задаем в оформлении Текст как пустую строку.
    • В условии прописываем: СистемныеПоля.УровеньВГруппировке Равно 2 (уровень Номенклатуры).
    • В оформляемых полях указываем Склад.

Этот способ позволяет гибко управлять визуальным отображением данных без изменения структуры запроса или ресурсов. Однако учитывайте, что физически в таблице останется две колонки, хотя визуально они будут заполняться «шахматным» порядком.

Метод №4: Использование функции языка выражений СКД «ВычислитьВыражение»

Для решения сложных задач трансформации данных на разных уровнях группировки разработчики часто прибегают к функциям языка выражений СКД. Одной из самых мощных является функция ВычислитьВыражение(). С её помощью мы можем динамически определять контекст расчета.

Давайте посмотрим на пример использования этой функции в выражении нашего вычисляемого поля. Мы можем сразу написать универсальное выражение на вкладке Вычисляемые поля в колонке Выражение без необходимости плодить ресурсы:


Выбор 
    Когда ВычислитьВыражение("УровеньВГруппировке()", , "Общая") = 1 
        Тогда Склад 
    Иначе Номенклатура 
Конец

Разберем, как работает это выражение:

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

← На главную