К статье
Практический материал

Отчеты и Аналитика · 11 мин

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

Как работает система компоновки данных в 1С: схема, наборы данных, запросы, настройки отчёта, ресурсы и типичные ошибки при разработке отчётов на СКД.

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

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

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

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

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

Набор данных — это источник информации. Чаще всего используется набор типа «Запрос» с текстом на встроенном языке запросов 1С. Также доступны наборы типа «Объект» (например, таблица значений, сформированная кодом) и «Объединение», объединяющее несколько наборов в один. Если данных одним запросом получить нельзя, наборы связываются на закладке «Связи наборов данных» по ключевым полям.

Ресурсы — это числовые поля, по которым считаются итоги: сумма, количество, среднее, минимум, максимум. Без указания ресурса поле будет выводиться только в детальных записях, а в группировках итог по нему отсутствует. Ресурсу можно задать выражение агрегирования и ограничить, по каким группировкам он рассчитывается.

Как СКД формирует отчёт: этапы выполнения

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

Далее процессор компоновки данных выполняет запрос, обходит результат, вычисляет ресурсы и иерархию группировок, а процессор вывода превращает это в табличный документ, диаграмму или сводную таблицу. Если в схеме есть набор «Объект» или события вроде «ПриКомпоновкеРезультата», на этих этапах подключается код на встроенном языке.

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

Наборы данных и запросы: как писать правильно

Запрос в СКД подчиняется особым правилам. Поля, доступные пользователю для отбора, описываются в конструкции ГДЕ либо через фигурные скобки — расширение языка запросов для СКД. Например, условие {ГДЕ (Продажи.Организация = &Организация)} будет применено только если пользователь заполнил соответствующий отбор. Аналогично работают конструкции {ВЫБРАТЬ} и {СОЕДИНЕНИЕ} — платформа включает их в финальный запрос только при необходимости.

Параметры виртуальных таблиц (период, отборы регистров) следует задавать через параметры СКД, а не жёстко в тексте. Для параметров типа «Дата» часто используют выражения &НачалоПериода и &КонецПериода, при этом на закладке «Параметры» для дат удобно включать флажок «Включать в доступные поля» и ограничивать доступность, чтобы пользователь не видел служебные параметры.

Когда использовать набор «Объект»

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

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

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

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

Отборы бывают жёсткие (заданные в настройках схемы и скрытые от пользователя) и пользовательские. Если отбор должен быть обязательным, задайте его в настройках и уберите поле из доступных для отбора у пользователя — иначе он сможет снять фильтр и получить чрезмерно тяжёлый отчёт по всей базе.

Отчёт пустойОтбор или параметры отсекают данные

Проверьте параметры периода и отборы; временно отключите все отборы

Итоги не сходятсяПоле не добавлено в ресурсы или неверная связь наборов

Проверьте закладку «Ресурсы» и связи наборов данных

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

Перенесите условия в параметры виртуальных таблиц запроса

Программная работа с СКД

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

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

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

События модуля отчёта

В модуле объекта отчёта доступны обработчики «ПриКомпоновкеРезультата» и «ОбработкаПроверкиЗаполнения». Первый позволяет полностью взять формирование на себя: стандартную обработку отключают, инициализируют процессор вручную и передают внешние наборы данных. Это стандартный способ отладки СКД-отчётов в конфигураторе — точка останова в этом обработчике срабатывает при каждом формировании.

Типичные ошибки и ограничения

Большинство проблем с СКД сводится к нескольким повторяющимся причинам. Их знание сокращает отладку с часов до минут.

Типичные ошибки
01
Поле есть в запросе, но не выводится в группировках: оно не добавлено в ресурсы или не выбрано в настройках группировки
02
Отбор по полю «не работает»: поле не включено в доступные поля отбора на закладке «Настройки» или запрещено в схеме
03
Задвоение строк: связь наборов данных настроена без учёта всех ключевых полей или соединение в запросе дублирует записи
04
Параметр-период игнорируется: параметр объявлен в тексте запроса, но не описан на закладке «Параметры», и СКД не управляет его доступностью
05
Ошибка «Поле не найдено» после доработки: в настройках варианта осталась ссылка на удалённое поле — нужно обновить настройки варианта

Из ограничений стоит помнить: СКД не умеет напрямую обращаться к внешним источникам без набора «Объект» или внешних источников данных, сложные рекурсивные расчёты лучше выносить в код, а очень большие выборки без отборов могут привести к превышению памяти на сервере. Для тяжёлых отчётов обязательно задавайте обязательные параметры периода.

Проверка результата и FAQ

Контрольные точки

Как проверить результат

Итоги по ресурсам
Норма

Совпадают с контрольным запросом или сверкой по регистру

Тревожный признак

Итоги завышены или занижены — проверяйте соединения и связи наборов

Работа отборов
Норма

При установке отбора данные фильтруются, запрос выполняется быстро

Тревожный признак

Отбор не влияет на результат или отчёт «зависает»

Варианты отчёта
Норма

Каждый вариант открывается без ошибок и показывает свою структуру

Тревожный признак

Ошибка «Поле не найдено» при открытии варианта

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

Итог

Что важно запомнить

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

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

Чем СКД отличается от обычного запроса с выводом в табличный документ?

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

Почему отчёт на СКД формируется очень долго?

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

Можно ли использовать СКД без создания объекта «Отчёт»?

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

Как отладить, какой запрос реально выполняет СКД?

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

Как дать пользователю отбор, но запретить его снятие?

Задайте условие в настройках схемы и на закладке «Отбор» в режиме настроек отметьте элемент как недоступный для редактирования, либо вынесите поле из доступных полей отбора. Альтернатива — жёсткое условие в тексте запроса через параметр, который заполняется программно.

Когда вместо СКД лучше выбрать другой инструмент?

Для простых печатных форм с фиксированным макетом проще табличный документ и запрос. Для аналитики в реальном времени по большим объёмам рассмотрите внешние BI-инструменты или агрегатные таблицы. СКД оптимальна для интерактивных отчётов внутри 1С с пользовательскими настройками.