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

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

Запрос и компоновка данных в 1С: зачем нужна СКД и как её использовать

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

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

Многие начинающие разработчики путают эти два понятия или считают СКД чем-то необязательным. На практике почти все типовые отчёты в конфигурациях 1С (УТ, ERP, Бухгалтерия, ЗУП) построены именно на СКД. Понимание связки «запрос + компоновка» позволяет создавать собственные отчёты, дорабатывать типовые и давать пользователям гибкие настройки без изменения кода.

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

Что такое запрос в 1С и какую задачу он решает

Запрос — это обращение к данным информационной базы на специальном декларативном языке. Вы описываете, какие таблицы нужны, как их соединить, какие условия наложить, а платформа сама формирует оптимальное обращение к СУБД. Результат запроса — таблица значений или выборка, которую можно обойти в коде.

Типичные задачи, где используется запрос без СКД:

  • проверка остатков перед проведением документа;
  • подбор данных для заполнения табличной части;
  • поиск дублей в справочниках;
  • выгрузка данных для обмена или печатной формы.

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

Для чего нужна система компоновки данных

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

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

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

Третий — единый механизм расшифровки. Пользователь может кликнуть по цифре в отчёте и получить детализированный отчёт по этой ячейке, если разработчик включил расшифровку. Реализовать такое вручную на обычном запросе — заметный объём работы.

Запрос против СКД

Запрос в коде

Подходит для служебных выборок: проверки, заполнения документов, обменов. Пользователь не может менять структуру результата.

Отчёт на СКД

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

Консоль запросов / консоль СКД

Инструменты разработчика для отладки: проверить текст запроса или схему до встраивания в конфигурацию.

Как работает связка запроса и компоновки

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

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

Упрощённый пример запроса для отчёта по продажам:

ВЫБРАТЬ

Продажи.Номенклатура КАК Номенклатура,

Продажи.Менеджер КАК Менеджер,

СУММА(Продажи.СуммаОборот) КАК Сумма

ИЗ

РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи

СГРУППИРОВАТЬ ПО

Продажи.Номенклатура,

Продажи.Менеджер

{ГДЕ

(Продажи.Менеджер = &Менеджер)}

Обратите внимание на конструкцию в фигурных скобках {ГДЕ ...} — это расширение языка запросов для СКД. Оно позволяет платформе подставлять отбор только тогда, когда пользователь его включил. Без таких конструкций отбор будет «зашит» жёстко, и гибкость отчёта исчезнет.

Как построить первый отчёт на СКД: порядок действий

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

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

На этапе настройки не пытайтесь сразу сделать «идеальный» вариант. Достаточно рабочей структуры: одна-две группировки и пара ресурсов. Остальные варианты (по складам, по менеджерам, диаграмма) пользователи или вы сами добавите позже через стандартную кнопку настроек.

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

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

Типичные ошибки при работе с запросом в СКД

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

Типичные ошибки
01
Отбор по измерениям в секции ГДЕ вместо параметров виртуальной таблицы — отчёт читает всю таблицу и работает медленно.
02
Поле не добавлено в ресурсы, но выведено в группировку с итогами — в итоговых строках пусто или ноль.
03
Использование СОЕДИНЕНИЕ вместо ЛЕВОЕ СОЕДИНЕНИЕ — из отчёта пропадают строки, где нет связанных данных.
04
Жёстко прописанный отбор в тексте запроса без фигурных скобок — пользователь не может его отключить.
05
Дублирование строк из-за соединения с таблицей, где несколько записей на ключ, — суммы в отчёте завышены.
06
Вывод в отчёт полей «на всякий случай» — лишние поля замедляют компоновку и загромождают настройки.

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

Как проверить, что отчёт собран правильно

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

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

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

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

Совпадает с контрольным значением (например, с оборотом по регистру за тот же период)

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

Итог завышен или занижен — ищите дубли в соединениях или неверные параметры виртуальной таблицы

Изменение группировки пользователем
Норма

Отчёт перестраивается, итоги остаются корректными

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

Ошибка «поле не найдено» — поле группировки не выведено в запросе или не доступно в настройках

Отбор по произвольному полю
Норма

Отбор применяется через расширение языка запросов, результат фильтруется

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

Отбор игнорируется — условие жёстко зашито в тексте запроса без фигурных скобок

Скорость формирования
Норма

Отчёт формируется за разумное время на рабочем объёме данных

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

Отчёт «висит» — проверьте параметры виртуальных таблиц и наличие индексов по полям отбора

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

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

СКД — не универсальное решение. Есть задачи, где она избыточна или неудобна.

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

Как выбрать действие

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

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

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

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

Чем запрос в СКД отличается от запроса в коде?

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

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

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

Почему в отчёте на СКД пустые итоги?

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

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

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

Что быстрее: запрос с отбором или СКД с тем же отбором?

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

Можно ли сохранить настройки отчёта, чтобы не настраивать заново?

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

Итог

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

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