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

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

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

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

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

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

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

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

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

Схема компоновки данных — основа отчёта. Это описание того, откуда берутся данные (наборы данных), как они связаны, какие поля доступны, какие параметры и вычисляемые поля существуют. Схема создаётся в конфигураторе и хранится в макете отчёта или в самом объекте «Отчёт».

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

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

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

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

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

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

Наборы данных и связи между ними

Данные в схему попадают через наборы данных. Основных типа три: запрос (текст на встроенном языке запросов), объект (например, таблица значений, заполненная программно) и объединение (объединение нескольких наборов). Чаще всего используется запрос — его платформа умеет оптимизировать при формировании макета.

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

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

Какой тип набора данных выбрать

Запрос

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

Объект

Для данных из внешних источников или программных расчётов. Гибко, но весь набор загружается в память, оптимизации запроса нет.

Объединение

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

Настройки отчёта: что может менять пользователь

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

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

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

Как создать простой отчёт на СКД: пошагово

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

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

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

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

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

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

Процессор = Новый ПроцессорКомпоновкиДанных;

Процессор.Инициализировать(Макет);

Результат = Новый ТабличныйДокумент;

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

ПроцессорВывода.УстановитьДокумент(Результат);

ПроцессорВывода.Вывести(Процессор);

Вычисляемые поля, ресурсы и параметры

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

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

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

Типичные ошибки при работе со СКД
01
Не отметить поле как ресурс — итоги по группировкам и общий итог выводятся пустыми
02
Считать отношение через вычисляемое поле вместо ресурса — средняя цена или процент по группе оказываются неверными
03
Соединять большие таблицы связью наборов вместо одного запроса — отчёт формируется минутами на больших объёмах
04
Фильтровать данные в коде после компоновки вместо отборов СКД — параметры не видны пользователю, а отчёт выбирает лишние данные
05
Использовать в запросе полное соединение там, где нужно левое, — из отчёта пропадают строки без оборотов

Производительность и ограничения СКД

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

Особенность СКД — она дописывает запрос сама, и иногда неоптимально. Если отчёт тормозит, полезно посмотреть итоговый запрос, который реально ушёл в СУБД (через технологический журнал или консоль кода). Часто выясняется, что отбор попал не в параметры виртуальной таблицы, а в итоговое условие, и база перебирает лишние записи.

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

Когда СКД не нужна: альтернативы

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

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

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

Маршрут решения

СКД или ручной вывод

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

Часто задаваемые вопросы

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

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

Можно ли использовать СКД без программирования?

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

Почему в отчёте пустые итоги, хотя данные есть?

Чаще всего поле не добавлено в ресурсы схемы компоновки — СКД считает итоги только по ресурсам. Откройте схему, закладку «Ресурсы» и проверьте, что нужные поля там отмечены, а выражение агрегирования (обычно Сумма) задано корректно.

Как пользователю сохранить свои настройки отчёта?

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

СКД работает только в управляемых формах?

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

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

Да, через механизм расширений конфигурации: расширение позволяет добавить свой вариант отчёта или изменить схему, не затрагивая типовой объект. Это сохраняет возможность автоматического обновления конфигурации.

Итог

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

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