СКД в 1С: как устроена система компоновки данных и как с ней работать
СКД состоит из двух независимых частей. Схема компоновки данных
(СхемаКомпоновкиДанных) описывает источник: наборы данных, вычисляемые поля,
параметры и поля итога. Настройки (НастройкиКомпоновкиДанных)
описывают представление: структуру группировок, выбранные поля, отбор, условное оформление
и значения параметров.
Отчёт собирается по цепочке: схема плюс настройки → КомпоновщикМакетаКомпоновкиДанных
строит макет → ПроцессорКомпоновкиДанных выполняет запросы → процессор вывода
переносит результат в табличный документ. Большинство ошибок «отчёт выводит не то» — это
не ошибка запроса, а несоответствие между схемой и настройками.
Что такое система компоновки данных
Система компоновки данных 1С 8.3 — это декларативный механизм построения отчётов. Разработчик описывает, откуда берутся данные и как их показать, а платформа сама строит запрос под конкретные настройки: добавляет только выбранные поля, подставляет отбор в условия, считает итоги по нужным уровням и выводит результат.
Практическое следствие: итоговый запрос, который уходит в СУБД, не совпадает с текстом запроса из набора данных. Если пользователь не выбрал поле, оно не попадёт в выборку, даже когда оно есть в наборе. Поэтому отлаживать СКД привычным способом «скопировать запрос в консоль» можно только частично — консоль покажет источник, но не итоговую компоновку.
Схема компоновки данных: из чего состоит
Схема — это объект СхемаКомпоновкиДанных. В отчёте он доступен через свойство
СхемаКомпоновкиДанных, а в универсальной обработке схему можно получить из макета:
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Наборы данных — источники: запрос, объект или объединение
Для Каждого Набор Из Схема.НаборыДанных Цикл
Сообщить(Набор.Имя);
КонецЦикла;
// Параметры схемы — то, что подставляется в запрос
ПараметрПериод = Схема.Параметры.Найти("НачалоПериода");
// Вычисляемые поля — выражения поверх полей наборов
ПолеДоли = Схема.ВычисляемыеПоля.Добавить();
ПолеДоли.ПутьКДанным = "ДоляОтИтога";
ПолеДоли.Заголовок = "Доля, %";
Ключевое ограничение: выражение вычисляемого поля работает с полями наборов данных, а не с произвольным кодом конфигурации. Подробный разбор синтаксиса и функций — в статье о вычисляемых полях СКД.
Настройки: что отделено от схемы
Настройки — это отдельный объект НастройкиКомпоновкиДанных. Одна и та же схема
может обслуживать несколько вариантов отчёта, потому что структура группировок, отбор,
оформление и значения параметров лежат не в схеме, а в настройках.
Настройки = Схема.НастройкиПоУмолчанию;
// Значения параметров
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачДата);
// Структура: группировки и вложенность
Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(
Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Склад");
Разделение схемы и настроек объясняет самую частую путаницу новичка: параметр объявляется в схеме, а значение ему задаётся в настройках. Как задавать значения из кода — в статье о параметрах СКД программно.
Компоновщик настроек: зачем нужен посредник
Напрямую настройки почти никогда не редактируют. Между схемой и настройками стоит
КомпоновщикНастроекКомпоновкиДанных: он знает состав доступных полей, умеет
отделять пользовательские настройки от основных и проверять, что настройка ещё применима
к схеме.
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
Компоновщик.Инициализировать(
Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
Компоновщик.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
Компоновщик.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Склад", ТекущийСклад);
ИтоговыеНастройки = Компоновщик.ПолучитьНастройки();
Порядок вывода отчёта
Чтобы понимать, где искать причину проблемы, нужно держать в голове полную цепочку. Она одинакова и для отчёта на форме, и для программного формирования:
- схема и настройки объединяются компоновщиком макета;
КомпоновщикМакетаКомпоновкиДанных.Выполнить()возвращает макет компоновки — в нём уже лежат итоговые тексты запросов;ПроцессорКомпоновкиДанных.Инициализировать()выполняет запросы и готовит выборку;- процессор вывода переносит элементы результата в табличный документ.
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, ИтоговыеНастройки);
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Новый ТабличныйДокумент);
Результат = ПроцессорВывода.Вывести(Процессор);
Группировки, ресурсы и итоги
Структура настроек определяет уровни группировок, а ресурсы считаются по этим уровням. Один и тот же ресурс на разных уровнях даёт разные числа: сумма по складу, сумма по номенклатуре внутри склада и общий итог считаются независимо.
Детальные записи — это группировка без полей группировки. Отдельно настраивается вывод общего итога и расположение итогов относительно группировки. Подробности — в статье о группировках и итогах.
Отбор и условное оформление
Отбор в СКД задаётся на уровне настроек и попадает в условия итогового запроса, поэтому он быстрее ручной фильтрации результата. Отбор можно задать как для всего отчёта, так и для отдельной группировки.
Условное оформление работает по тому же принципу: условие плюс список оформляемых полей. Разборы — в статьях об отборе программно и об условном оформлении.
С чего начать освоение СКД
Порядок, который экономит время новичку и не даёт закопаться в объектной модели:
- соберите рабочий запрос набора данных и убедитесь, что он возвращает нужные строки;
- объявите параметры в схеме и научитесь задавать им значения;
- разберитесь с периодами — это источник большинства расхождений в цифрах;
- настройте структуру группировок и ресурсы;
- выведите нужные поля в пользовательские настройки;
- и только потом беритесь за собственные макеты — до этого хватает автоматических.
Частые ошибки при работе с СКД
- Значение параметра задано, но не применяется. У значения параметра
выключено
Использование— присвоения значения напрямую недостаточно. - Поле есть в наборе, но пустое в отчёте. Поле не выбрано в настройках, поэтому не попало в итоговый запрос.
- Правка настроек «на лету» ничего не меняет. Настройки изменены после того, как компоновщик макета уже отработал: макет строится один раз.
- Ресурс считает не то. Ресурс рассчитывается по уровню группировки, а не по всей выборке — проверяйте, по каким уровням он настроен.
- Конец периода отсекает последний день. Дата без времени означает начало суток, поэтому документы последнего дня в отчёт не попадают.
- Отбор задан в запросе, а не в настройках. Тогда пользователь не может его изменить, а СКД не может оптимизировать условие.
Частые вопросы про СКД в 1С
Чем схема компоновки данных отличается от настроек?
Схема описывает источник данных: наборы, параметры, вычисляемые поля и поля итога. Настройки описывают представление: структуру группировок, выбранные поля, отбор, оформление и значения параметров. Одна схема может обслуживать несколько вариантов отчёта именно потому, что представление вынесено в отдельный объект.
Почему запрос из набора данных не совпадает с тем, что выполняет платформа?
СКД строит итоговый запрос под конкретные настройки: добавляет только выбранные поля, подставляет отбор в условия и формирует итоги по уровням группировок. Итоговые тексты запросов лежат в макете компоновки, который возвращает компоновщик макета.
Можно ли сформировать отчёт СКД программно, без формы?
Да. Нужно получить схему и настройки, построить макет через компоновщик макета, инициализировать процессор компоновки и вывести результат процессором вывода в табличный документ или в таблицу значений.
ИИ Консоль запросов 1С
Старт
Популярный выборДля индивидуального использования
- До 5ти конфигураций
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Для интенсивного использования или команд
- До 15-ти конфигураций
-
≈ 300 задач Подробнее про лимиты
- Техническая поддержка
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты