Отчеты и Аналитика · 12 мин
Запрос и компоновка данных в 1С: зачем нужна СКД и как её использовать
Зачем в 1С нужна система компоновки данных (СКД), чем она отличается от обычного запроса и как построить отчёт на СКД без программирования. Примеры и ошибки.
Запрос в 1С — это способ получить данные из информационной базы на встроенном языке запросов, похожем на SQL. Система компоновки данных (СКД) — механизм платформы, который берёт этот запрос и превращает его в готовый отчёт с настройками, группировками, отборами и оформлением. Проще говоря: запрос отвечает за «что выбрать», а компоновка — за «как показать и дать пользователю управлять результатом».
Многие начинающие разработчики путают эти два понятия или считают СКД чем-то необязательным. На практике почти все типовые отчёты в конфигурациях 1С (УТ, ERP, Бухгалтерия, ЗУП) построены именно на СКД. Понимание связки «запрос + компоновка» позволяет создавать собственные отчёты, дорабатывать типовые и давать пользователям гибкие настройки без изменения кода.
Материал ниже объясняет, для чего нужна компоновка данных, чем она отличается от «голого» запроса, как построить первый отчёт на СКД и каких ошибок стоит избегать.
Что такое запрос в 1С и какую задачу он решает
Запрос — это обращение к данным информационной базы на специальном декларативном языке. Вы описываете, какие таблицы нужны, как их соединить, какие условия наложить, а платформа сама формирует оптимальное обращение к СУБД. Результат запроса — таблица значений или выборка, которую можно обойти в коде.
Типичные задачи, где используется запрос без СКД:
- проверка остатков перед проведением документа;
- подбор данных для заполнения табличной части;
- поиск дублей в справочниках;
- выгрузка данных для обмена или печатной формы.
Ограничение «голого» запроса в том, что он возвращает данные в фиксированном виде. Если пользователь захочет тот же отчёт, но с группировкой по менеджерам вместо складов или с отбором по периоду, придётся менять текст запроса или писать код обработки параметров. Именно эту проблему решает компоновка данных.
Для чего нужна система компоновки данных
СКД отделяет логику получения данных от логики их представления. Разработчик один раз описывает набор данных и доступные поля, а дальше отчёт «собирается» автоматически под конкретные настройки. Это даёт три практических результата.
Первый — пользовательская гибкость. В отчёте на СКД пользователь сам меняет период, отборы, группировки, порядок колонок и сортировку через стандартную панель настроек. Ему не нужно просить программиста, чтобы «добавить колонку» или «сгруппировать по контрагентам».
Второй — экономия труда разработчика. Не нужно вручную писать код вывода шапки, итогов, иерархии и оформления: СКД генерирует табличный документ сама. Типовые элементы вроде ресурсов с итогами, иерархических группировок и диаграмм настраиваются мышью в конструкторе.
Третий — единый механизм расшифровки. Пользователь может кликнуть по цифре в отчёте и получить детализированный отчёт по этой ячейке, если разработчик включил расшифровку. Реализовать такое вручную на обычном запросе — заметный объём работы.
Запрос против СКД
Подходит для служебных выборок: проверки, заполнения документов, обменов. Пользователь не может менять структуру результата.
Подходит для аналитики и отчётности: пользователь сам управляет отборами, группировками и колонками. Требует аккуратного запроса и настройки схемы.
Инструменты разработчика для отладки: проверить текст запроса или схему до встраивания в конфигурацию.
Как работает связка запроса и компоновки
Механика СКД выглядит так. В схеме компоновки данных вы создаёте набор данных типа «Запрос» и пишете текст запроса. Затем на закладках схемы указываете ресурсы (числовые поля для итогов), параметры, вычисляемые поля и связи наборов. На закладке «Настройки» задаёте вариант отчёта по умолчанию: структуру группировок, отборы и выбранные поля.
Когда пользователь формирует отчёт, СКД берёт ваш запрос и динамически переписывает его под текущие настройки: добавляет условия отбора, убирает неиспользуемые поля, формирует итоги по группировкам. Это ключевое отличие от ручного подхода — итоговый текст обращения к базе строится платформой, а не фиксирован разработчиком.
Упрощённый пример запроса для отчёта по продажам:
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.Менеджер КАК Менеджер,
СУММА(Продажи.СуммаОборот) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
СГРУППИРОВАТЬ ПО
Продажи.Номенклатура,
Продажи.Менеджер
{ГДЕ
(Продажи.Менеджер = &Менеджер)}
Обратите внимание на конструкцию в фигурных скобках {ГДЕ ...} — это расширение языка запросов для СКД. Оно позволяет платформе подставлять отбор только тогда, когда пользователь его включил. Без таких конструкций отбор будет «зашит» жёстко, и гибкость отчёта исчезнет.
Как построить первый отчёт на СКД: порядок действий
Ниже — рабочая последовательность для внешнего отчёта или отчёта в составе конфигурации. Она одинакова по сути и в управляемых формах типовых решений.
- 1Создайте новый отчёт и добавьте основную схему компоновки данных.
- 2Добавьте набор данных типа «Запрос» и напишите текст запроса, используя виртуальные таблицы с параметрами периода.
- 3На закладке «Ресурсы» отметьте числовые поля, по которым нужны итоги.
- 4На закладке «Параметры» проверьте, что период и другие параметры доступны пользователю; для дат включите стандартный период.
- 5На закладке «Настройки» сформируйте вариант по умолчанию: добавьте группировки, выбранные поля и при необходимости отбор.
- 6Сформируйте отчёт в режиме предприятия и проверьте: итоги сходятся, отборы и группировки переключаются без ошибок.
На этапе настройки не пытайтесь сразу сделать «идеальный» вариант. Достаточно рабочей структуры: одна-две группировки и пара ресурсов. Остальные варианты (по складам, по менеджерам, диаграмма) пользователи или вы сами добавите позже через стандартную кнопку настроек.
Для отладки удобно сначала проверить текст запроса в консоли запросов: убедиться, что данные возвращаются корректно и быстро. Только после этого переносите запрос в схему компоновки — так вы отделите ошибки запроса от ошибок настроек СКД.
// Программное формирование отчёта на СКД
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Схема.НастройкиПоУмолчанию;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Настройки);
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет);
Результат = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(Процессор);Типичные ошибки при работе с запросом в СКД
Большинство проблем с отчётами на СКД связаны не с самой компоновкой, а с тем, как написан запрос и настроены ресурсы. Ниже — то, что встречается чаще всего.
Отдельно стоит сказать про итоги. Если ресурс определён, но итоги не выводятся, проверьте, что поле действительно числовое и что в настройках группировки ресурс присутствует в выбранных полях. Если итоги «не сходятся» с контрольными данными, ищите дубли в соединениях — это самая частая причина расхождений.
Как проверить, что отчёт собран правильно
Проверка отчёта на СКД — это не только «открылся без ошибок». Нужно убедиться в корректности данных и работоспособности настроек.
Как проверить результат
Совпадает с контрольным значением (например, с оборотом по регистру за тот же период)
Итог завышен или занижен — ищите дубли в соединениях или неверные параметры виртуальной таблицы
Отчёт перестраивается, итоги остаются корректными
Ошибка «поле не найдено» — поле группировки не выведено в запросе или не доступно в настройках
Отбор применяется через расширение языка запросов, результат фильтруется
Отбор игнорируется — условие жёстко зашито в тексте запроса без фигурных скобок
Отчёт формируется за разумное время на рабочем объёме данных
Отчёт «висит» — проверьте параметры виртуальных таблиц и наличие индексов по полям отбора
Полезный приём — сравнить отчёт на СКД с простым запросом в консоли на том же периоде и с теми же отборами. Если суммы совпадают, проблема (если она есть) в настройках компоновки, а не в данных. Если расходятся уже на уровне запроса — исправлять нужно сам запрос.
Когда СКД не нужна: альтернативы и границы
СКД — не универсальное решение. Есть задачи, где она избыточна или неудобна.
Как выбрать действие
Ещё одна граница — очень специфичная логика расчёта. Если показатель нельзя получить декларативным запросом (например, сложный итеративный расчёт), его считают кодом во временную таблицу и передают в СКД через набор данных «Объект». Это штатный сценарий, но он требует программирования процессора компоновки.
Удобный приём для изучения СКД: откройте любой типовой отчёт, зайдите в «Ещё — Изменить вариант» и посмотрите, как устроены настройки. Затем в конфигураторе откройте схему этого отчёта и сопоставьте: какие поля запроса стали ресурсами, какие — параметрами. Такая «разборка» типовых решений учит быстрее, чем построение отчётов с нуля.
Частые вопросы
Чем запрос в СКД отличается от запроса в коде?
Синтаксис почти тот же, но в схеме компоновки доступны расширения в фигурных скобках — {ГДЕ}, {ВЫБРАТЬ} и другие. Они позволяют платформе динамически менять итоговый запрос под настройки пользователя. Кроме того, запрос в СКД не выполняется напрямую: его обрабатывает компоновщик макета.
Можно ли использовать СКД без написания запроса?
Да, частично. Конструктор СКД умеет генерировать запрос по выбранным таблицам и полям, а также есть наборы данных типа «Объект» и «Объединение». Но для отчётов по регистрам с периодами и итогами ручной запрос с виртуальными таблицами почти всегда эффективнее.
Почему в отчёте на СКД пустые итоги?
Чаще всего поле не добавлено на закладку «Ресурсы» схемы компоновки. Реже — ресурс добавлен, но не выведен в выбранные поля группировки, либо поле имеет нечисловой тип и его нельзя суммировать.
Как дать пользователю отбор, которого нет в запросе?
Поле, по которому нужен отбор, должно присутствовать в выборке запроса и быть доступным в настройках. Если поля нет в запросе, СКД не сможет по нему отбирать — добавьте его в текст запроса, даже если не выводите в отчёт.
Что быстрее: запрос с отбором или СКД с тем же отбором?
При грамотно написанном запросе скорость сопоставима, потому что СКД в итоге формирует похожий запрос к СУБД. Замедление обычно вызвано не самой компоновкой, а отборами не по индексированным полям, отсутствием параметров у виртуальных таблиц или выводом избыточного числа полей.
Можно ли сохранить настройки отчёта, чтобы не настраивать заново?
Да. В типовых конфигурациях варианты отчёта сохраняются штатно через «Сохранить вариант». Для внешних отчётов настройки можно сохранять в файл через стандартные механизмы хранения настроек компоновки.
Что важно запомнить
Запрос в 1С отвечает за получение данных, а система компоновки данных — за превращение этих данных в гибкий отчёт с пользовательскими настройками. Пишите запрос с параметрами виртуальных таблиц и расширениями в фигурных скобках, помечайте ресурсы, проверяйте итоги на контрольных данных и экспериментируйте со схемой только в копии базы.