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

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При разработке отчетов на системе компоновки данных (СКД) часто возникает задача вывода данных из разных источников в единую таблицу с сохранением логической связи. Типичный пример — отчет по производству, где нужно показать "Изделие" из одного набора данных (Заказ) и соответствующий ему перечень "Материалов" из другого (Справочник Спецификации). Основная трудность заключается в том, чтобы отчет выглядел аккуратно: без лишних дублей, с правильным расположением ресурсов и возможностью корректной выгрузки в Excel. Разберем по шагам, как реализовать подобную задачу, используя как стандартные настройки, так и продвинутые методы.

Метод 1. Использование структуры «Таблица» вместо списка

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

В этом случае мы настраиваем отчет следующим образом:

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

Метод 2. Вычисляемые поля для управления итогами

Одной из проблем при соединении двух наборов данных (Join) является дублирование числовых показателей. Если к одной строке изделия «приклеивается» 10 строк материалов, то сумма количества изделий может увеличиться в 10 раз. Рассмотрим, как этого избежать с помощью функций языка выражений СКД.

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


ВычислитьВыражение("Сумма(КоличествоИзделия)", "Изделие, Спецификация", "Группировка")

Если нам нужно, чтобы количество отображалось только в первой строке группы (для имитации объединения ячеек), можно применить более сложную конструкцию:

ВычислитьВыражение("КоличествоИзделия", , "Группировка", "Первая", "Первая")

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

Метод 3. Тонкая настройка оформления и расположения полей

Чтобы отчет не выглядел «кривым» и поля располагались в нужном порядке (например, количество изделия перед материалами), проанализируем вкладку «Другие настройки»:

Метод 4. Создание собственного макета оформления

Если стандартные настройки не позволяют добиться нужного расположения колонок, разберем самый гибкий способ — Пользовательские макеты. На вкладке «Макеты» в схеме компоновки можно вручную нарисовать область, которая будет использоваться для вывода конкретной группировки.

Выясним, как это работает:

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

Метод 5. Программное объединение ячеек в «ПриКомпоновкеРезультата»

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

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

Пример программного управления выводом:


ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.НачатьВывод();

Пока Истина Цикл
    ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    Если ЭлементРезультата = Неопределено Тогда
        Прервать;
    КонецЕсли;
    
    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
    
    // Здесь можно анализировать тип элемента и запоминать границы для объединения
КонецЦикла;

ПроцессорВывода.ЗакончитьВывод();

Метод 6. Использование функций агрегации массивов

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


СоединитьСтроки(ВычислитьВыражениеСГруппировкойМассив("Материал", "Материал"), ", ")

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

Важный момент: При соединении наборов данных по полям (например, по ссылке на Спецификацию), убедитесь, что в настройках связей наборов данных правильно указаны условия. Если материалы не выводятся, проверьте флаг "Обязательная связь". Если его снять, изделия будут выводиться даже в том случае, если для них не найдено ни одного материала в спецификации.

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

← На главную