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