Решение задач 1С:Предприятие 8 на примерах

СКД в 1С: система компоновки данных и программное формирование отчёта

Отчёты и СКДОпубликовано

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

Задача: построить отчёт и получить его данные из кода

Обычный сценарий выглядит так. Нужно показать остатки товаров на складах с группировкой по складу и итогами, дать пользователю отборы и выбор периода, а иногда ещё и получить те же данные из кода — например, в виде таблицы значений для выгрузки или дальнейшей обработки. Писать вручную запрос, обход, итоги и вывод в табличный документ долго, поэтому для этого и существует СКД.

Что такое СКД и из чего состоит схема компоновки

Система компоновки данных — набор объектов платформы, разделяющий отчёт на описание и исполнение. Описание хранится в схеме компоновки данных: это макет отчёта, который редактируется в конфигураторе. Исполняют схему компоновщик макета и процессор компоновки. Основные части схемы:

  • Набор данных — источник данных. Чаще всего это набор данных-запрос с текстом запроса на языке 1С. Есть также набор данных-объект (данные передаются из кода, например таблицей значений) и объединение нескольких наборов.
  • Поля — колонки набора. Для каждого можно задать заголовок, тип, роль и ограничения использования.
  • Ресурсы — поля, по которым считаются итоги. Для каждого ресурса задают выражение с агрегатной функцией, например Сумма(КоличествоОстаток).
  • Параметры — значения, которые передаются в запрос или используются в выражениях: период, организация, дата отчёта.
  • Настройки — вариант отчёта: структура группировок, выбранные поля, отборы, порядок, условное оформление и параметры вывода.

Пример текста запроса набора данных (без служебных символов |, как он записывается в конструкторе схемы):

ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Склад КАК Склад,
    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецПериода, ) КАК ТоварыНаСкладахОстатки

Платформа сама определит поля по тексту запроса. Параметр КонецПериода появится на вкладке «Параметры» автоматически. О том, как запрос читает регистр, можно прочитать в статье про запросы в 1С.

Как создать отчёт на СКД

  1. В конфигураторе добавьте объект конфигурации «Отчёт», в его свойствах найдите «Основная схема компоновки данных» и нажмите кнопку открытия. Если схемы нет, конфигуратор предложит её создать.
  2. На вкладке «Наборы данных» добавьте набор-запрос и откройте конструктор запроса. После закрытия конструктора поля появятся автоматически.
  3. На вкладке «Ресурсы» выберите поля, по которым нужны итоги, и убедитесь, что для них указана агрегатная функция.
  4. На вкладке «Параметры» проверьте типы и значения по умолчанию.
  5. На вкладке «Настройки» откройте конструктор настроек, задайте вид отчёта, выберите поля, группировки и отборы.

После запуска в режиме «1С:Предприятие» у отчёта появятся кнопки выбора вариантов, настроек и сформированный результат. Выражения и оформление — отдельная большая тема, а здесь сосредоточимся на программной работе.

Период в СКД

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

НачалоПериода: &Период.ДатаНачала
КонецПериода:  &Период.ДатаОкончания

У вычисляемых параметров НачалоПериода и КонецПериода включают флажок «Ограничение доступности», чтобы пользователь не видел их в настройках: в отчёте остаётся одно поле выбора периода. В периоде, выбранном пользователем, дата окончания обычно содержит конец дня, а при выводе даты без времени — начало суток, это важно для границ в запросе. Тонкости работы с датами описаны в статье про дату в запросе. Из кода значение периода задают так:

ПараметрПериод = Компоновщик.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
    Новый ПараметрКомпоновкиДанных("Период"));
ПараметрПериод.Использование = Истина;
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДатаСеанса()), КонецМесяца(ТекущаяДатаСеанса()));

Настройки варианта: группировки, отборы, порядок

Схема описывает, какие данные доступны, а настройки определяют, как их показать. Структура настроек — дерево: в корне находятся группировки, внутри них — вложенные группировки, таблицы или диаграммы. Группировка по складу с вложенной группировкой по номенклатуре даёт знакомый отчёт «склад — товары» с итогами на каждом уровне. Строка «Детальные записи» внутри группировки выводит исходные строки набора данных.

Кроме структуры, в настройках задают выбранные поля (какие колонки показывать), отбор (условия на значения полей), порядок сортировки, условное оформление и параметры вывода: заголовок отчёта, расположение итогов, вывод отбора. Один и тот же отчёт может иметь несколько вариантов с разными настройками, а пользователь в режиме «1С:Предприятие» вправе менять их под себя, если вы не ограничили доступность поля в схеме.

Итоги считаются по ресурсам. Выражение ресурса должно содержать агрегатную функцию: Сумма, Количество, Максимум, Минимум или Среднее. Для разных группировок можно указать разные выражения, а также задать порядок расчёта итогов по уровням иерархии.

Программное формирование отчёта: табличный документ

Чтобы сформировать отчёт из кода без формы, нужно пройти цепочку из пяти объектов. Код ниже находится в модуле объекта отчёта и возвращает готовый табличный документ.

Функция СформироватьОтчёт(НачалоПериода, КонецПериода, Склад) Экспорт

    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

    // 1. Компоновщик настроек: источник доступных полей и настройки по умолчанию
    Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
    Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    Компоновщик.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

    // 2. Параметры
    ЗначениеПараметра = Компоновщик.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
        Новый ПараметрКомпоновкиДанных("КонецПериода"));
    Если ЗначениеПараметра <> Неопределено Тогда
        ЗначениеПараметра.Использование = Истина;
        ЗначениеПараметра.Значение = КонецПериода;
    КонецЕсли;

    // 3. Отбор по складу
    ЭлементОтбора = Компоновщик.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Склад;
    ЭлементОтбора.Использование = Истина;

    // 4. Макет компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Компоновщик.Настройки);

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

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

    Возврат ТабличныйДокумент;

КонецФункции

Если нужна расшифровка (по двойному щелчку на ячейке), создайте объект ДанныеРасшифровкиКомпоновкиДанных и передайте его третьим параметром и в КомпоновщикМакета.Выполнить(), и в ПроцессорКомпоновки.Инициализировать().

СКД в таблицу значений

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

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

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

Настройки = Компоновщик.Настройки;
Настройки.Структура.Очистить();
Настройки.Выбор.Элементы.Очистить();

Для Каждого ИмяПоля Из СтрРазделить("Склад,Номенклатура,КоличествоОстаток", ",") Цикл
    ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ВыбранноеПоле.Использование = Истина;
КонецЦикла;

Полученная таблица значений далее обрабатывается обычными методами; о них — в статье про таблицу значений.

Варианты и тонкости

  • Схему можно подготовить целиком программно: Новый СхемаКомпоновкиДанных, затем добавлять источники данных, наборы и поля. Этот путь подходит для универсальных обработок, но требует знания свойств всех объектов схемы.
  • Для набора данных-объекта таблицу значений передают через внешние наборы: вторым параметром ПроцессорКомпоновки.Инициализировать() идёт структура с именем набора и таблицей.
  • Имеющиеся пользовательские настройки можно загрузить в компоновщик из хранилища: Компоновщик.ЗагрузитьНастройки(Настройки).

Типичные ошибки

  • Не вызван ЗагрузитьНастройки(): компоновщик пуст, и отчёт выводит пустой результат или только заголовок.
  • Параметр найден, но не включён: при Использование = Ложь значение игнорируется и применяется значение по умолчанию или возникает ошибка незаполненного параметра.
  • Отбор по полю, которого нет в наборе данных или у которого запрещено использование в условиях, приводит к ошибке при компоновке.
  • В таблицу значений попадают строки итогов, потому что в настройках остались группировки.
  • Нарушен порядок аргументов в Инициализировать(): внешние наборы данных идут вторым параметром, расшифровка — третьим.

Какой вывод выбрать

Процессор выводаРезультатКогда использовать
ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокументТабличный документ с форматированием и расшифровкойОтчёт для пользователя, печать, сохранение в файл
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначенийТаблица значений или дерево значенийДальнейшая обработка, выгрузка, передача в запрос

Актуальность для новых версий

СКД работает во всех версиях платформы 8.3, а перечисленные объекты программного интерфейса (КомпоновщикНастроекКомпоновкиДанных, КомпоновщикМакетаКомпоновкиДанных, ПроцессорКомпоновкиДанных) не менялись принципиально. Окно настроек варианта в режиме «1С:Предприятие» в новых релизах 8.3.2x выглядит иначе, чем в 8.3.10, но состав настроек тот же. Стандартные отчёты БСП используют собственные формы и часть настроек хранят в хранилище вариантов отчётов, поэтому в типовых конфигурациях программное управление настройками может отличаться от примеров.

Частые вопросы

Что такое СКД в 1С простыми словами?

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

Как сформировать отчёт СКД программно?

Получите схему из макета, инициализируйте компоновщик настроек, загрузите настройки по умолчанию, задайте параметры и отборы. Затем скомпонуйте макет компоновщиком макета, создайте процессор компоновки и выведите результат процессором вывода в табличный документ или таблицу значений.

Как вывести результат СКД в таблицу значений?

Используйте ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений: передайте ему пустую таблицу значений методом УстановитьОбъект() и вызовите Вывести() с процессором компоновки. Колонки создаются по выбранным полям, для плоской таблицы удалите группировки из структуры.

Как передать период в СКД?

Добавьте параметр типа СтандартныйПериод, а в параметрах НачалоПериода и КонецПериода задайте выражения &Период.ДатаНачала и &Период.ДатаОкончания. Программно значение задают объектом Новый СтандартныйПериод с началом и концом.

Сервер 1С:Предприятия и кластер: состав, порты, консоль, rac и веб-сервер

Базы данных и СУБД

Устройство сервера 1С и кластера, порты по умолчанию, консоль администрирования и управление сеансами через rac, кэш сервера, установка на Windows и Linux и публикация базы на веб-сервере.

Регистры в 1С: виды регистров и движения документа по регистру накопления

Алгоритмы

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

XML в 1С программно: запись, чтение, DOM и выгрузка данных

Интеграция и веб-сервисы

Готовые примеры работы с XML на встроенном языке 1С: запись и чтение, DOM с XPath, преобразование XML в структуру, выгрузка справочника и разбор ошибок парсинга.

Работа с JSON в 1С: чтение, запись, даты и типичные ошибки

Интеграция и веб-сервисы

Практическое руководство по JSON в 1С: чтение строки и файла, Структура против Соответствия, запись массивов, даты, сериализация через XDTO и разбор частых ошибок.