Как построить отчёт на СКД в 1С: от набора данных до готового вывода

· 9 мин

Содержание

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

DDS (Dynamic Data Set) — так в англоязычной среде называют набор данных системы компоновки данных (СКД). Это сердце любого отчёта на СКД: именно набор данных определяет, откуда берутся строки и какие поля в них доступны. Всё остальное — группировки, итоги, оформление — надстраивается поверх него.

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

С чего начинается отчёт: объект и схема компоновки

Отчёт на СКД живёт внутри объекта метаданных «Отчёт». Есть два пути:

  • Отчёт в конфигурации. В дереве метаданных правой кнопкой по ветке Отчёты → Добавить. Такой отчёт встроен в прикладное решение и попадает к пользователям при обновлении.
  • Внешний отчёт. В Конфигураторе Файл → Новый → Внешний отчёт. Файл .erf можно подключить к рабочей базе без изменения конфигурации — через Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки (нужны права администратора и включённая соответствующая функциональная опция).

У созданного объекта есть реквизит Основная схема компоновки данных. Нажмите ссылку Открыть схему компоновки данных — платформа предложит создать макет типа «Схема компоновки данных» и откроет его редактор. Именно здесь и собирается весь отчёт.

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

Редактор схемы — это набор закладок: Наборы данных, Связи наборов данных, Вычисляемые поля, Ресурсы, Параметры, Макеты, Вложенные схемы и Настройки. Проходим их по порядку, но ключевых две: Наборы данных (откуда данные) и Настройки (как показать).

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

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

Понимать архитектуру полезно, чтобы не искать проблему не там:

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

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

Набор данных: запрос, объект или объединение

На закладке Наборы данных нажмите зелёный плюс и выберите тип. Их три.

Набор данных — запрос. Самый частый случай. В поле запроса пишете текст на языке запросов 1С или собираете его Конструктором запроса (кнопка над полем). Галочка Автозаполнение слева отвечает за то, чтобы поля набора заполнялись из запроса автоматически — если её снять, список полей останется пустым и в отчёте не будет колонок.

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

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

Для запроса минимальный пример — обороты по регистру накопления за период:

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

После написания запроса поля Номенклатура, Количество, Выручка появятся на закладке Наборы данных в нижней таблице. Там же задаются заголовки колонок, роли и ограничения доступа к полям.

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

Параметры и отборы: как управлять выборкой

Параметры в запросе пишутся с амперсандом: &НачалоПериода, &КонецПериода, &Организация. Как только вы их используете, платформа сама добавит их на закладку Параметры.

Там у каждого параметра есть важные колонки:

  • Тип — проверьте, что он корректный (Дата, СправочникСсылка.Организации и т. д.).
  • Значение — значение по умолчанию.
  • Использование — Автоматически (показывать, если задействован), Всегда или Запрещено. Если поставить Запрещено, параметр исчезнет из настроек, и период перестанет влиять на отчёт.
  • Включать в доступные поля — разрешает пользователю менять параметр в пользовательских настройках.

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

Отбор — это уже не вход в запрос, а фильтр по готовым полям. Настраивается на закладке Настройки → Отбор. Перетащите нужное поле, выберите условие (Равно, В списке, Содержит) и значение.

Разница принципиальна для скорости:

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

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

Группировки и структура вывода

Это закладка Настройки, левая часть — дерево Структура. Пустая схема ничего не покажет: нужно явно сказать, как группировать строки.

Правой кнопкой по корню структуры → Новая группировка. В открывшемся окне выберите поле группировки (например, Номенклатура) или оставьте пустым — тогда получится детальная (без группировки) запись построчно.

Внутрь группировки можно вложить следующую — так строится иерархия «Склад → Номенклатура → Документ». Кроме группировок, в структуру добавляются Таблица (кросс-таблица со строками и колонками) и Диаграмма.

Дальше задайте, что именно выводить:

  1. На закладке Выбранные поля перетащите поля и ресурсы, которые должны попасть в отчёт. Поле, которого здесь нет, не появится в результате, даже если оно есть в наборе данных.
  2. На закладке Сортировка укажите порядок строк внутри группировок.
  3. На закладке Условное оформление можно подсветить, например, отрицательную прибыль красным — задаёте условие и формат.

Чтобы числа складывались в итоги, поле должно быть ресурсом. На закладке Ресурсы переносите поле вправо и задаёте выражение, обычно Сумма(Выручка). Теперь по каждой группировке и в целом по отчёту появится итог. Без ресурса колонка с суммами покажет значения строк, но итоговой строки не будет.

Вычисляемое поле (закладка Вычисляемые поля) помогает, когда колонки нет в запросе. Например, поле Маржа с выражением Выручка - Себестоимость. Его затем тоже можно сделать ресурсом.

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

Оптимизация запроса и схемы

«Оптимизировать код в СКД» — это на 80% оптимизировать запрос набора данных. Самое дорогое в отчёте — чтение из базы, а не компоновка.

Что реально ускоряет:

  • 📊 Виртуальные таблицы вместо ручных сверток. Для остатков и оборотов берите Остатки, Обороты, ОстаткиИОбороты регистра, а не считайте их суммированием записей ГРУППИРОВАТЬ ПО. СУБД сделает это эффективнее.
  • 🎯 Фильтр в источнике. Период, организацию и прочие сужающие условия передавайте в параметры виртуальной таблицы — читайте только нужное.
  • 🧩 Поменьше полей. Не тащите в набор колонки, которые не выводите. Каждое лишнее соединение по ссылке — обращение к другой таблице.
  • 🔗 Соединения вместо подзапросов в условиях. Коррелированный подзапрос внутри ГДЕ часто превращается в построчный перебор.
  • 🚫 Без ВЫБРАТЬ * и обращения к .Представление в наборе. Представление считается для каждой строки; если оно нужно только в шапке, выводите ссылку.

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

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

КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(
    Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию);

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

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

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

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

Тяжёлые отчёты имеет смысл формировать в фоновом задании на сервере, чтобы не держать сеанс пользователя. Это экономит и память, и нервы при больших выборках.

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

Большая часть проблем — не в платформе, а в настройках схемы. Самые частые разберём по симптомам:

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

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

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

Чем DDS отличается от обычного запроса?
Запрос только достаёт строки. DDS (набор данных СКД) добавляет к нему слой компоновки: группировки, итоги, параметры, оформление и пользовательские настройки — всё это без написания кода вывода.
Можно ли сделать отчёт на СКД без Конфигуратора?
Схему компоновки редактируют в Конфигураторе или в режиме разработки внешнего отчёта. В пользовательском режиме меняются только настройки готового отчёта — группировки, отбор, поля, но не сам набор данных.
Как показать в отчёте данные из двух регистров?
Либо соедините их в одном запросе, либо сделайте два набора данных и свяжите их на закладке Связи наборов данных по общему полю (например, по номенклатуре).
Почему пользователь не видит часть настроек?
У параметров и полей есть флажок включения в доступные/пользовательские настройки. Если он снят, настройка видна только разработчику в схеме, а в режиме предприятия скрыта.
Нужен ли код, чтобы вывести отчёт?
Для обычного отчёта на форме — нет, платформа выводит результат сама. Код нужен только при встраивании СКД в обработку, печатную форму или фоновое формирование.