СКД в 1С: система компоновки данных и программное формирование отчёта
Система компоновки данных (СКД) — основной механизм построения отчётов в 1С:Предприятии 8.3. Вы описываете, какие данные нужны и как их группировать, а платформа сама строит запрос, считает итоги и выводит результат. Ниже разобрано, из чего состоит схема компоновки, как задать период, и приведён код для программного формирования отчёта, в том числе вывода результата СКД в таблицу значений.
Задача: построить отчёт и получить его данные из кода
Обычный сценарий выглядит так. Нужно показать остатки товаров на складах с группировкой по складу и итогами, дать пользователю отборы и выбор периода, а иногда ещё и получить те же данные из кода — например, в виде таблицы значений для выгрузки или дальнейшей обработки. Писать вручную запрос, обход, итоги и вывод в табличный документ долго, поэтому для этого и существует СКД.
Что такое СКД и из чего состоит схема компоновки
Система компоновки данных — набор объектов платформы, разделяющий отчёт на описание и исполнение. Описание хранится в схеме компоновки данных: это макет отчёта, который редактируется в конфигураторе. Исполняют схему компоновщик макета и процессор компоновки. Основные части схемы:
- Набор данных — источник данных. Чаще всего это набор данных-запрос с текстом запроса на языке 1С. Есть также набор данных-объект (данные передаются из кода, например таблицей значений) и объединение нескольких наборов.
- Поля — колонки набора. Для каждого можно задать заголовок, тип, роль и ограничения использования.
- Ресурсы — поля, по которым считаются итоги. Для каждого ресурса задают выражение с агрегатной функцией, например
Сумма(КоличествоОстаток). - Параметры — значения, которые передаются в запрос или используются в выражениях: период, организация, дата отчёта.
- Настройки — вариант отчёта: структура группировок, выбранные поля, отборы, порядок, условное оформление и параметры вывода.
Пример текста запроса набора данных (без служебных символов |, как он записывается в конструкторе схемы):
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад КАК Склад,
ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецПериода, ) КАК ТоварыНаСкладахОстатки
Платформа сама определит поля по тексту запроса. Параметр КонецПериода появится на вкладке «Параметры» автоматически. О том, как запрос читает регистр, можно прочитать в статье про запросы в 1С.
Как создать отчёт на СКД
- В конфигураторе добавьте объект конфигурации «Отчёт», в его свойствах найдите «Основная схема компоновки данных» и нажмите кнопку открытия. Если схемы нет, конфигуратор предложит её создать.
- На вкладке «Наборы данных» добавьте набор-запрос и откройте конструктор запроса. После закрытия конструктора поля появятся автоматически.
- На вкладке «Ресурсы» выберите поля, по которым нужны итоги, и убедитесь, что для них указана агрегатная функция.
- На вкладке «Параметры» проверьте типы и значения по умолчанию.
- На вкладке «Настройки» откройте конструктор настроек, задайте вид отчёта, выберите поля, группировки и отборы.
После запуска в режиме «1С:Предприятие» у отчёта появятся кнопки выбора вариантов, настроек и сформированный результат. Выражения и оформление — отдельная большая тема, а здесь сосредоточимся на программной работе.
Период в СКД
Для периода в схеме заводят параметр с типом СтандартныйПериод, обычно с именем Период. Параметры НачалоПериода и КонецПериода, которые используются в запросе, получают значения из выражений на вкладке «Параметры»:
НачалоПериода: &Период.ДатаНачала КонецПериода: &Период.ДатаОкончания
У вычисляемых параметров НачалоПериода и КонецПериода включают флажок «Ограничение доступности», чтобы пользователь не видел их в настройках: в отчёте остаётся одно поле выбора периода. В периоде, выбранном пользователем, дата окончания обычно содержит конец дня, а при выводе даты без времени — начало суток, это важно для границ в запросе. Тонкости работы с датами описаны в статье про дату в запросе. Из кода значение периода задают так:
ПараметрПериод = Компоновщик.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
Новый ПараметрКомпоновкиДанных("Период"));
ПараметрПериод.Использование = Истина;
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДатаСеанса()), КонецМесяца(ТекущаяДатаСеанса()));
Настройки варианта: группировки, отборы, порядок
Схема описывает, какие данные доступны, а настройки определяют, как их показать. Структура настроек — дерево: в корне находятся группировки, внутри них — вложенные группировки, таблицы или диаграммы. Группировка по складу с вложенной группировкой по номенклатуре даёт знакомый отчёт «склад — товары» с итогами на каждом уровне. Строка «Детальные записи» внутри группировки выводит исходные строки набора данных.
Кроме структуры, в настройках задают выбранные поля (какие колонки показывать), отбор (условия на значения полей), порядок сортировки, условное оформление и параметры вывода: заголовок отчёта, расположение итогов, вывод отбора. Один и тот же отчёт может иметь несколько вариантов с разными настройками, а пользователь в режиме «1С:Предприятие» вправе менять их под себя, если вы не ограничили доступность поля в схеме.
Итоги считаются по ресурсам. Выражение ресурса должно содержать агрегатную функцию: Сумма, Количество, Максимум, Минимум или Среднее. Для разных группировок можно указать разные выражения, а также задать порядок расчёта итогов по уровням иерархии.
Программное формирование отчёта: табличный документ
Чтобы сформировать отчёт из кода без формы, нужно пройти цепочку из пяти объектов. Код ниже находится в модуле объекта отчёта и возвращает готовый табличный документ.
Функция СформироватьОтчёт(НачалоПериода, КонецПериода, Склад) Экспорт
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// 1. Компоновщик настроек: источник доступных полей и настройки по умолчанию
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
Компоновщик.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
// 2. Параметры
ЗначениеПараметра = Компоновщик.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
Новый ПараметрКомпоновкиДанных("КонецПериода"));
Если ЗначениеПараметра <> Неопределено Тогда
ЗначениеПараметра.Использование = Истина;
ЗначениеПараметра.Значение = КонецПериода;
КонецЕсли;
// 3. Отбор по складу
ЭлементОтбора = Компоновщик.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Склад;
ЭлементОтбора.Использование = Истина;
// 4. Макет компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Компоновщик.Настройки);
// 5. Процессор компоновки и вывод в табличный документ
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат ТабличныйДокумент;
КонецФункции
Если нужна расшифровка (по двойному щелчку на ячейке), создайте объект ДанныеРасшифровкиКомпоновкиДанных и передайте его третьим параметром и в КомпоновщикМакета.Выполнить(), и в ПроцессорКомпоновки.Инициализировать().
СКД в таблицу значений
Когда результат нужен не для просмотра, а для обработки, вместо табличного документа используют вывод в коллекцию значений. Меняются только последние строки: вместо процессора вывода в табличный документ создаётся процессор вывода в коллекцию значений.
Результат = Новый ТаблицаЗначений; ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Колонки таблицы создаются автоматически по выбранным полям. Но по умолчанию вывод повторяет структуру отчёта: итоги группировок попадают в таблицу вместе с детальными записями. Чтобы получить плоскую таблицу, перед компоновкой макета очистите структуру и задайте нужные поля вручную — тогда на выход пойдут только детальные записи:
Настройки = Компоновщик.Настройки;
Настройки.Структура.Очистить();
Настройки.Выбор.Элементы.Очистить();
Для Каждого ИмяПоля Из СтрРазделить("Склад,Номенклатура,КоличествоОстаток", ",") Цикл
ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
ВыбранноеПоле.Использование = Истина;
КонецЦикла;
Полученная таблица значений далее обрабатывается обычными методами; о них — в статье про таблицу значений.
Варианты и тонкости
- Схему можно подготовить целиком программно:
Новый СхемаКомпоновкиДанных, затем добавлять источники данных, наборы и поля. Этот путь подходит для универсальных обработок, но требует знания свойств всех объектов схемы. - Для набора данных-объекта таблицу значений передают через внешние наборы: вторым параметром
ПроцессорКомпоновки.Инициализировать()идёт структура с именем набора и таблицей. - Имеющиеся пользовательские настройки можно загрузить в компоновщик из хранилища:
Компоновщик.ЗагрузитьНастройки(Настройки).
Типичные ошибки
- Не вызван
ЗагрузитьНастройки(): компоновщик пуст, и отчёт выводит пустой результат или только заголовок. - Параметр найден, но не включён: при
Использование = Ложьзначение игнорируется и применяется значение по умолчанию или возникает ошибка незаполненного параметра. - Отбор по полю, которого нет в наборе данных или у которого запрещено использование в условиях, приводит к ошибке при компоновке.
- В таблицу значений попадают строки итогов, потому что в настройках остались группировки.
- Нарушен порядок аргументов в
Инициализировать(): внешние наборы данных идут вторым параметром, расшифровка — третьим.
Какой вывод выбрать
| Процессор вывода | Результат | Когда использовать |
|---|---|---|
ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент | Табличный документ с форматированием и расшифровкой | Отчёт для пользователя, печать, сохранение в файл |
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений | Таблица значений или дерево значений | Дальнейшая обработка, выгрузка, передача в запрос |
Актуальность для новых версий
СКД работает во всех версиях платформы 8.3, а перечисленные объекты программного интерфейса (КомпоновщикНастроекКомпоновкиДанных, КомпоновщикМакетаКомпоновкиДанных, ПроцессорКомпоновкиДанных) не менялись принципиально. Окно настроек варианта в режиме «1С:Предприятие» в новых релизах 8.3.2x выглядит иначе, чем в 8.3.10, но состав настроек тот же. Стандартные отчёты БСП используют собственные формы и часть настроек хранят в хранилище вариантов отчётов, поэтому в типовых конфигурациях программное управление настройками может отличаться от примеров.
Частые вопросы
Что такое СКД в 1С простыми словами?
СКД — механизм построения отчётов, в котором разработчик декларативно описывает наборы данных, поля, ресурсы и параметры, а платформа сама формирует запрос, группирует данные и выводит результат. Пользователь может менять отборы, группировки и состав полей без участия программиста.
Как сформировать отчёт СКД программно?
Получите схему из макета, инициализируйте компоновщик настроек, загрузите настройки по умолчанию, задайте параметры и отборы. Затем скомпонуйте макет компоновщиком макета, создайте процессор компоновки и выведите результат процессором вывода в табличный документ или таблицу значений.
Как вывести результат СКД в таблицу значений?
Используйте ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений: передайте ему пустую таблицу значений методом УстановитьОбъект() и вызовите Вывести() с процессором компоновки. Колонки создаются по выбранным полям, для плоской таблицы удалите группировки из структуры.
Как передать период в СКД?
Добавьте параметр типа СтандартныйПериод, а в параметрах НачалоПериода и КонецПериода задайте выражения &Период.ДатаНачала и &Период.ДатаОкончания. Программно значение задают объектом Новый СтандартныйПериод с началом и концом.