СКД в 1С

СКД в 1С: как устроена система компоновки данных и как с ней работать

Коротко

СКД состоит из двух независимых частей. Схема компоновки данных (СхемаКомпоновкиДанных) описывает источник: наборы данных, вычисляемые поля, параметры и поля итога. Настройки (НастройкиКомпоновкиДанных) описывают представление: структуру группировок, выбранные поля, отбор, условное оформление и значения параметров.

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

Что такое система компоновки данных

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

Практическое следствие: итоговый запрос, который уходит в СУБД, не совпадает с текстом запроса из набора данных. Если пользователь не выбрал поле, оно не попадёт в выборку, даже когда оно есть в наборе. Поэтому отлаживать СКД привычным способом «скопировать запрос в консоль» можно только частично — консоль покажет источник, но не итоговую компоновку.

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

Схема компоновки данных: из чего состоит

Схема — это объект СхемаКомпоновкиДанных. В отчёте он доступен через свойство СхемаКомпоновкиДанных, а в универсальной обработке схему можно получить из макета:

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

// Наборы данных — источники: запрос, объект или объединение
Для Каждого Набор Из Схема.НаборыДанных Цикл
    Сообщить(Набор.Имя);
КонецЦикла;

// Параметры схемы — то, что подставляется в запрос
ПараметрПериод = Схема.Параметры.Найти("НачалоПериода");

// Вычисляемые поля — выражения поверх полей наборов
ПолеДоли = Схема.ВычисляемыеПоля.Добавить();
ПолеДоли.ПутьКДанным = "ДоляОтИтога";
ПолеДоли.Заголовок    = "Доля, %";
СхемаКомпоновкиДанных
НаборыДанныхисточники данных схемы
Параметрыпараметры схемы
ВычисляемыеПолявыражения поверх полей наборов
ПоляИтогаправила расчёта итогов
НастройкиПоУмолчаниюстартовые настройки отчёта

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

Настройки: что отделено от схемы

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

Настройки = Схема.НастройкиПоУмолчанию;

// Значения параметров
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачДата);

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

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

Компоновщик настроек: зачем нужен посредник

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

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

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

Порядок вывода отчёта

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

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

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

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

Группировки, ресурсы и итоги

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

Детальные записи — это группировка без полей группировки. Отдельно настраивается вывод общего итога и расположение итогов относительно группировки. Подробности — в статье о группировках и итогах.

Отбор и условное оформление

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

Условное оформление работает по тому же принципу: условие плюс список оформляемых полей. Разборы — в статьях об отборе программно и об условном оформлении.

С чего начать освоение СКД

Порядок, который экономит время новичку и не даёт закопаться в объектной модели:

  • соберите рабочий запрос набора данных и убедитесь, что он возвращает нужные строки;
  • объявите параметры в схеме и научитесь задавать им значения;
  • разберитесь с периодами — это источник большинства расхождений в цифрах;
  • настройте структуру группировок и ресурсы;
  • выведите нужные поля в пользовательские настройки;
  • и только потом беритесь за собственные макеты — до этого хватает автоматических.

Частые ошибки при работе с СКД

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

Частые вопросы про СКД в 1С

Чем схема компоновки данных отличается от настроек?

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

Почему запрос из набора данных не совпадает с тем, что выполняет платформа?

СКД строит итоговый запрос под конкретные настройки: добавляет только выбранные поля, подставляет отбор в условия и формирует итоги по уровням группировок. Итоговые тексты запросов лежат в макете компоновки, который возвращает компоновщик макета.

Можно ли сформировать отчёт СКД программно, без формы?

Да. Нужно получить схему и настройки, построить макет через компоновщик макета, инициализировать процессор компоновки и вывести результат процессором вывода в табличный документ или в таблицу значений.

Тарифы

ИИ Консоль запросов 1С

Лайт

Бесплатно

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно