Схема компоновки данных в 1С 8.3: от первого набора до быстрого отчёта

· 10 мин

Содержание

Работа в СКД 1С сводится к трём слоям: вы описываете схему (откуда брать данные и какие поля есть), задаёте настройки (что и как показать) и получаете результат — табличный документ, диаграмму или таблицу значений. Схему открывают в Конфигураторе: создайте отчёт в ветке Отчеты или внешний отчёт через Файл → Новый → Внешний отчет, затем нажмите «Открыть схему компоновки данных».

Система компоновки данных одна для всех конфигураций на платформе 8.3: Бухгалтерии, ЗУП, УТ, ERP. Отличаются только объекты метаданных, из которых вы берёте данные. Ниже — порядок, в котором опытный разработчик собирает отчёт, и приёмы, без которых СКД работает медленно или выдаёт задвоенные суммы.

Как устроена компоновка данных: схема, настройки, процессоры

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

ОбъектЧто делает
СхемаКомпоновкиДанныхХранит наборы данных, связи, поля, ресурсы, параметры, макеты
НастройкиКомпоновкиДанныхСтруктура отчёта, выбранные поля, отборы, сортировка, оформление
КомпоновщикМакетаКомпоновкиДанныхСклеивает схему и настройки в макет компоновки, строит итоговый запрос
ПроцессорКомпоновкиДанныхВыполняет запросы и обрабатывает данные по макету
ПроцессорВыводаРезультатаКомпоновкиДанных…Выводит результат в табличный документ или коллекцию значений

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

Редактор схемы состоит из вкладок:

  • 📦 Наборы данных — источники данных;
  • 🔗 Связи наборов данных — как наборы соединяются между собой;
  • 🧮 Вычисляемые поля — поля, которых нет в источнике;
  • ∑ Ресурсы — что считается в итогах групп;
  • ⚙️ Параметры — значения, которые подставляются в запрос;
  • 🖼 Макеты — ручное оформление отдельных областей;
  • 🧩 Вложенные схемы — схемы внутри схемы;
  • 🛠 Настройки — вариант отчёта по умолчанию.

Наборы данных в СКД: запрос, объект, объединение

Начинается работа с вкладки «Наборы данных». Кнопка «Добавить» предлагает три типа.

Тип набораКогда нуженОсобенности
Набор данных — запросПочти всегдаТекст на языке запросов, платформа оптимизирует его под настройки
Набор данных — объектДанные готовит код: таблица значений, результат обработкиДанные передаются через ВнешниеНаборыДанных при вызове процессора
Набор данных — объединениеНужно сложить строки двух наборов (план и факт)Аналог ОБЪЕДИНИТЬ ВСЕ, поля сопоставляются по имени

Как создать набор-запрос

  1. Нажмите «Добавить» → «Добавить набор данных — запрос».
  2. Откройте «Конструктор запроса» и выберите таблицы. Для остатков и оборотов берите виртуальные таблицы регистров: Остатки, Обороты, ОстаткиИОбороты.
  3. Оставьте флажок «Автозаполнение» включённым на старте. Платформа сама создаст поля набора по колонкам запроса.
  4. Перейдите на вкладку «Настройки» и запустите мастер (кнопка с волшебной палочкой) — он соберёт простую структуру. Для первой проверки этого хватит.

Фигурные скобки — приём, который отличает СКД от обычного запроса

В тексте набора можно писать расширение языка запросов в фигурных скобках. Всё, что внутри {}, необязательно: платформа включит это в запрос, только если поле реально используется в настройках.

ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.Контрагент КАК Контрагент,
    Продажи.СуммаОборот КАК Сумма
{ВЫБРАТЬ
    Номенклатура.*,
    Контрагент.*,
    Сумма}
ИЗ
    РегистрНакопления.Продажи.Обороты({(&НачалоПериода)}, {(&КонецПериода)}, , ) КАК Продажи
{ГДЕ
    Продажи.Номенклатура.*,
    Продажи.Контрагент.*}

Что это даёт:

  • 📌 параметры периода попадают внутрь виртуальной таблицы, а не в общее условие ГДЕ после неё — регистр читается быстрее;
  • 📌 отбор по контрагенту, поставленный пользователем, уходит прямо в запрос;
  • 📌 звёздочка .* открывает реквизиты поля для группировок и отборов.

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

Связи между наборами

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

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

Если двум наборам нужен общий список строк (план и факт по статьям), выбирайте не связь, а набор «Объединение». Строки без пары не потеряются.

Поля, вычисляемые выражения и ресурсы

Поля набора видны в нижней таблице вкладки «Наборы данных». Для каждого поля настраивают:

  • Заголовок — как поле называется в отчёте;
  • Ограничение поля и Ограничение реквизитов — флажки «Поле», «Условие», «Группировка», «Порядок» снимают возможность использовать поле в соответствующей роли;
  • Роль — например, «Период» с номером, «Измерение», «Остаток»; от роли зависит, как СКД считает итоги по остаткам и разворачивает период;
  • Оформление — формат числа и даты, например ЧДЦ=2.

Вычисляемые поля

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

ВЫБОР
    КОГДА Сумма > 100000 ТОГДА "Крупная"
    КОГДА Сумма > 10000 ТОГДА "Средняя"
    ИНАЧЕ "Мелкая"
КОНЕЦ

Из вычисляемого поля можно вызвать экспортную функцию общего модуля, но такой вызов выполняется для каждой строки. На 50 000 строк это заметно тормозит отчёт.

Ресурсы и итоги

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

Пример доли продаж в общем итоге:

Сумма(Сумма) / ВычислитьВыражение("Сумма(Сумма)", "ОбщийИтог") * 100

Цена за единицу в итогах группы — частый случай, когда простое суммирование врёт. Задайте ресурс выражением Сумма(Сумма) / Сумма(Количество), а не Сумма(Цена): сумма цен трёх строк по 100 рублей даст 300, а реальная средняя цена — 100.

Деление в ресурсе упадёт на группе с нулевым количеством. Оберните выражение: ВЫБОР КОГДА Сумма(Количество) = 0 ТОГДА 0 ИНАЧЕ Сумма(Сумма) / Сумма(Количество) КОНЕЦ.

Параметры и отборы: что пользователь вводит перед формированием

Параметры данных

Параметры из текста запроса (&НачалоПериода, &Организация) появляются на вкладке «Параметры» автоматически. Здесь им задают тип, значение по умолчанию и поведение.

Типовой приём для периода:

  1. Добавьте параметр Период типа СтандартныйПериод.
  2. У параметра НачалоПериода в колонке «Выражение» напишите &Период.ДатаНачала.
  3. У КонецПериода — КонецПериода(&Период.ДатаОкончания, "День").
  4. У обоих технических параметров включите «Ограничение доступности», чтобы пользователь видел только одно поле «Период».

Флажок «Доступен список значений» разрешает передать в параметр несколько значений — тогда в запросе пишите В (&Склады).

Отборы

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

Чтобы отбор появился на форме отчёта рядом с кнопкой «Сформировать»:

  1. Выделите элемент отбора или параметр.
  2. Откройте «Свойства элемента пользовательских настроек» в контекстном меню.
  3. Включите «Включать в пользовательские настройки» и режим редактирования «Быстрый доступ».

Если на форме нужно поле «Организация», которое пользователь может оставить пустым, делайте его отбором с флажком использования, а не обязательным параметром. Пустой обязательный параметр остановит формирование.

Структура отчёта, оформление и макеты

Структура

На закладке «Настройки» в верхнем окне строится дерево отчёта. Элементы структуры:

  • 📑 Группировка — строки, сгруппированные по полям;
  • 📊 Таблица — строки и колонки, кросс-таблица (номенклатура по месяцам);
  • 📈 Диаграмма — точки, серии и значения;
  • 📋 Детальные записи — группировка без полей, выводит каждую строку источника.

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

Периоды без пропусков

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

Условное оформление

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

Макеты

Если стандартный вывод не подходит — нужна печатная форма со своей шапкой или объединёнными ячейками — переходите на вкладку «Макеты». Там добавляют макет группировки, макет заголовка группировки, макет поля или ресурса. В ячейках макета указывают параметры, а в свойствах макета связывают параметры с выражениями полей.

Макет жёстко привязан к имени группировки. Пользователь переименует или удалит её в своих настройках — макет перестанет применяться без всякого сообщения.

Вывод результата из кода

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

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

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Настройки, , ,
    Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет);

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

Для вывода в табличный документ генератор не указывают, а процессор вывода берут ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент с методом УстановитьДокумент(ТабДок).

Если в схеме есть набор-объект, передайте данные вторым параметром метода Инициализировать:

ВнешниеНаборы = Новый Структура("Данные", ТаблицаИзКода);
Процессор.Инициализировать(Макет, ВнешниеНаборы);

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

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

Отладка и ускорение отчёта на СКД

Как увидеть итоговый запрос

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

Поставьте точку останова после строки КомпоновщикМакета.Выполнить(...) и вычислите в отладчике:

Макет.НаборыДанных.НаборДанных1.Запрос

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

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

Что ускоряет отчёт

ПриёмЭффектЦена
Параметры периода внутри виртуальной таблицы {(&НачалоПериода)}Регистр читается только за нужный периодНет
Отказ от обращения через точку к реквизитам ссылок в вычисляемых поляхМеньше скрытых соединенийРеквизит выбирают в запросе
Связь наборов по полному ключу с предварительной группировкойНет задвоения и лишних строкСложнее текст запроса
Временные таблицы в пакете вместо вложенных запросовОптимизатор СУБД строит план стабильнееСКД работает с пакетом: результатом считается последний запрос
Ограничение полей флажками «Ограничение поля»Пользователь не группирует по тяжёлым реквизитамМеньше свободы в настройках

Проверить прирост просто: замерьте время формирования до и после через «Замер производительности» в Конфигураторе в режиме отладки.

Разбор частых сбоев

Диагностика: выберите симптом

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

Можно ли изменить отчёт на СКД без Конфигуратора?
Структуру, отборы, поля и оформление пользователь меняет в настройках варианта прямо в режиме «Предприятие». Запрос, связи и вычисляемые поля схемы меняются только в Конфигураторе или через внешний отчёт.
Как доработать типовой отчёт и не снять конфигурацию с поддержки?
Используйте расширение конфигурации: заимствуйте отчёт и замените схему в расширении. Основная конфигурация остаётся на поддержке, обновления ставятся без сравнения.
Чем набор-объект отличается от запроса по скорости?
Набор-объект получает уже готовую таблицу из памяти, СКД не может отправить отборы в базу. Для больших данных запрос почти всегда быстрее.
Почему остатки на начало и конец группы не суммируются?
Для полей остатков нужна роль «Остаток» с привязкой к полю периода. Тогда СКД берёт начальный остаток первого периода группы и конечный остаток последнего, а не складывает их.
Можно ли выгрузить результат СКД в Excel?
Да. Результат в табличном документе сохраняется через Файл → Сохранить как в формате xlsx. Из кода — методом Записать табличного документа с типом ТипФайлаТабличногоДокумента.XLSX.