Как построить отчёт на СКД в 1С: от набора данных до готового вывода
Содержание
Чтобы сделать DDS в 1С, добавьте в конфигурацию объект «Отчёт» (или создайте внешний отчёт), откройте у него основную схему компоновки данных и на закладке Наборы данных задайте источник — запрос, объект или объединение. Дальше на закладке Настройки добавляете группировки, ресурсы и параметры — отчёт готов к запуску в 1С:Предприятии.
DDS (Dynamic Data Set) — так в англоязычной среде называют набор данных системы компоновки данных (СКД). Это сердце любого отчёта на СКД: именно набор данных определяет, откуда берутся строки и какие поля в них доступны. Всё остальное — группировки, итоги, оформление — надстраивается поверх него.
Ниже — как создать набор данных, написать под него запрос, настроить параметры и отборы, собрать структуру отчёта и не упереться в тормоза. Работаем в платформе 8.3 с интерфейсом «Такси», примеры одинаково годятся для управляемых и для внешних отчётов.
С чего начинается отчёт: объект и схема компоновки
Отчёт на СКД живёт внутри объекта метаданных «Отчёт». Есть два пути:
- Отчёт в конфигурации. В дереве метаданных правой кнопкой по ветке
Отчёты→Добавить. Такой отчёт встроен в прикладное решение и попадает к пользователям при обновлении. - Внешний отчёт. В Конфигураторе
Файл→Новый→Внешний отчёт. Файл.erfможно подключить к рабочей базе без изменения конфигурации — черезАдминистрирование→Печатные формы, отчёты и обработки→Дополнительные отчёты и обработки(нужны права администратора и включённая соответствующая функциональная опция).
У созданного объекта есть реквизит Основная схема компоновки данных. Нажмите ссылку Открыть схему компоновки данных — платформа предложит создать макет типа «Схема компоновки данных» и откроет его редактор. Именно здесь и собирается весь отчёт.
Для разовой выгрузки удобнее внешний отчёт: его не нужно вносить в конфигурацию и обновлять базу. Для типовой задачи, которую будут использовать все, лучше встроенный.
Редактор схемы — это набор закладок: Наборы данных, Связи наборов данных, Вычисляемые поля, Ресурсы, Параметры, Макеты, Вложенные схемы и Настройки. Проходим их по порядку, но ключевых две: Наборы данных (откуда данные) и Настройки (как показать).
Как устроена схема компоновки данных
Схема — это описание отчёта, а не сам результат. Она хранит три вещи: источники строк, правила расчёта итогов и настройки вывода по умолчанию.
Понимать архитектуру полезно, чтобы не искать проблему не там:
- Наборы данных — источники. Каждый набор отдаёт плоскую таблицу полей.
- Вычисляемые поля — дополнительные колонки, которых нет в источнике (например,
Выручка - Себестоимость). Считаются на языке выражений СКД. - Ресурсы — поля, по которым берутся итоги (сумма, количество, максимум). Без ресурса число не свернётся в итог группировки.
- Параметры — входные значения: период, организация, склад. Через них пользователь управляет выборкой.
- Настройки — дерево структуры отчёта: группировки, выбранные поля, отбор, сортировка, условное оформление.
При запуске платформа берёт схему, применяет текущие настройки, строит макет компоновки, прогоняет через него данные из наборов и выводит результат в табличный документ. Вы описываете «что», а не «как рисовать построчно».
Набор данных: запрос, объект или объединение
На закладке Наборы данных нажмите зелёный плюс и выберите тип. Их три.
Набор данных — запрос. Самый частый случай. В поле запроса пишете текст на языке запросов 1С или собираете его Конструктором запроса (кнопка над полем). Галочка Автозаполнение слева отвечает за то, чтобы поля набора заполнялись из запроса автоматически — если её снять, список полей останется пустым и в отчёте не будет колонок.
Набор данных — объект. Данные подаёт код: вы формируете таблицу значений или другой объект и передаёте его в компоновку как внешний источник. Пригодится, когда строки нельзя получить одним запросом (например, результат обращения к внешнему сервису).
Набор данных — объединение. Контейнер, внутрь которого вкладываются несколько наборов. Строки объединяются (аналог ОБЪЕДИНИТЬ ВСЕ). Удобно, когда данные из разных источников надо показать единым списком с одинаковыми колонками.
Для запроса минимальный пример — обороты по регистру накопления за период:
ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.ВыручкаОборот КАК Выручка
ИЗ
РегистрНакопления.Продажи.Обороты(
&НачалоПериода,
&КонецПериода,
,
) КАК ПродажиОбороты
После написания запроса поля Номенклатура, Количество, Выручка появятся на закладке Наборы данных в нижней таблице. Там же задаются заголовки колонок, роли и ограничения доступа к полям.
Если набора данных два и больше, одними полями дело не ограничится: их нужно связать на закладке Связи наборов данных, иначе строки перемножатся (декартово произведение) и в отчёте появятся дубли.
Параметры и отборы: как управлять выборкой
Параметры в запросе пишутся с амперсандом: &НачалоПериода, &КонецПериода, &Организация. Как только вы их используете, платформа сама добавит их на закладку Параметры.
Там у каждого параметра есть важные колонки:
- Тип — проверьте, что он корректный (
Дата,СправочникСсылка.Организациии т. д.). - Значение — значение по умолчанию.
- Использование —
Автоматически(показывать, если задействован),ВсегдаилиЗапрещено. Если поставитьЗапрещено, параметр исчезнет из настроек, и период перестанет влиять на отчёт. - Включать в доступные поля — разрешает пользователю менять параметр в пользовательских настройках.
Для периода удобнее один параметр типа СтандартныйПериод (даёт готовый выбор «Этот месяц», «Прошлый квартал»). Тогда начало и конец вычисляются из него выражениями &Период.ДатаНачала и &Период.ДатаОкончания.
Отбор — это уже не вход в запрос, а фильтр по готовым полям. Настраивается на закладке Настройки → Отбор. Перетащите нужное поле, выберите условие (Равно, В списке, Содержит) и значение.
Разница принципиальна для скорости:
| Механизм | Где работает | Когда применять |
|---|---|---|
| Параметр виртуальной таблицы | внутри запроса к СУБД | период, организация — то, что сужает данные в источнике |
Условие ГДЕ в запросе | внутри запроса к СУБД | жёсткие, всегда действующие ограничения |
| Отбор в настройках СКД | после выборки, в компоновке | гибкие фильтры, которые пользователь меняет на лету |
Период и организацию почти всегда передавайте в параметры виртуальной таблицы, а не в отбор настроек — иначе СКД сначала вытянет все данные, а отфильтрует потом, и отчёт будет тормозить.
Группировки и структура вывода
Это закладка Настройки, левая часть — дерево Структура. Пустая схема ничего не покажет: нужно явно сказать, как группировать строки.
Правой кнопкой по корню структуры → Новая группировка. В открывшемся окне выберите поле группировки (например, Номенклатура) или оставьте пустым — тогда получится детальная (без группировки) запись построчно.
Внутрь группировки можно вложить следующую — так строится иерархия «Склад → Номенклатура → Документ». Кроме группировок, в структуру добавляются Таблица (кросс-таблица со строками и колонками) и Диаграмма.
Дальше задайте, что именно выводить:
- На закладке
Выбранные поляперетащите поля и ресурсы, которые должны попасть в отчёт. Поле, которого здесь нет, не появится в результате, даже если оно есть в наборе данных. - На закладке
Сортировкаукажите порядок строк внутри группировок. - На закладке
Условное оформлениеможно подсветить, например, отрицательную прибыль красным — задаёте условие и формат.
Чтобы числа складывались в итоги, поле должно быть ресурсом. На закладке Ресурсы переносите поле вправо и задаёте выражение, обычно Сумма(Выручка). Теперь по каждой группировке и в целом по отчёту появится итог. Без ресурса колонка с суммами покажет значения строк, но итоговой строки не будет.
Вычисляемое поле (закладка Вычисляемые поля) помогает, когда колонки нет в запросе. Например, поле Маржа с выражением Выручка - Себестоимость. Его затем тоже можно сделать ресурсом.
Готовую структуру стоит сохранить как вариант отчёта. В режиме предприятия пользователь настраивает группировки и отбор под себя и сохраняет их через команду сохранения настроек — у каждого получается свой вид одного и того же отчёта. Разработчик задаёт эти варианты по умолчанию прямо в схеме: закладка Настройки и есть настройки «из коробки», которые видит пользователь при первом открытии. То, что доступно пользователю для правки, определяется флажками включения полей и параметров в пользовательские настройки — это удобно разграничивает «скелет отчёта» и «ручки», которые разрешено крутить.
Оптимизация запроса и схемы
«Оптимизировать код в СКД» — это на 80% оптимизировать запрос набора данных. Самое дорогое в отчёте — чтение из базы, а не компоновка.
Что реально ускоряет:
- 📊 Виртуальные таблицы вместо ручных сверток. Для остатков и оборотов берите
Остатки,Обороты,ОстаткиИОборотырегистра, а не считайте их суммированием записейГРУППИРОВАТЬ ПО. СУБД сделает это эффективнее. - 🎯 Фильтр в источнике. Период, организацию и прочие сужающие условия передавайте в параметры виртуальной таблицы — читайте только нужное.
- 🧩 Поменьше полей. Не тащите в набор колонки, которые не выводите. Каждое лишнее соединение по ссылке — обращение к другой таблице.
- 🔗 Соединения вместо подзапросов в условиях. Коррелированный подзапрос внутри
ГДЕчасто превращается в построчный перебор. - 🚫 Без
ВЫБРАТЬ *и обращения к.Представлениев наборе. Представление считается для каждой строки; если оно нужно только в шапке, выводите ссылку.
Отдельная история — программный вывод отчёта. Когда СКД встраивают в обработку или печатную форму, схему прогоняют кодом. Полный цикл выглядит так:
СхемаКомпоновки = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(
Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
СхемаКомпоновки, КомпоновщикНастроек.Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Здесь КомпоновщикМакета собирает макет из схемы и настроек, ПроцессорКомпоновкиДанных прогоняет данные, а ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент рисует результат в табличный документ. Значения параметров перед выводом задаются через КомпоновщикНастроек.Настройки.ПараметрыДанных.
Тяжёлые отчёты имеет смысл формировать в фоновом задании на сервере, чтобы не держать сеанс пользователя. Это экономит и память, и нервы при больших выборках.
Типичные ошибки при работе с СКД
Большая часть проблем — не в платформе, а в настройках схемы. Самые частые разберём по симптомам:
Автозаполнение у набора-запроса либо поля не перенесены в Выбранные поля настроек. Включите автозаполнение и добавьте поля в структуру.Ресурсы с выражением Сумма(...) — тогда появятся итоги по группировкам.Связи наборов данных, либо в запросе соединение даёт дубли. Проверьте связи и ключи соединения.Запрещено, либо фильтр задан отбором настроек поверх уже выбранных данных, а не параметром виртуальной таблицы. Передайте условие в источник.Ещё одна неочевидная ловушка — порядок полей в группировке. Если вложенная группировка стоит выше по иерархии, чем нужно, итоги «разъедутся». Структуру читайте сверху вниз: верхний уровень — самая крупная группа.
Частые вопросы
Чем DDS отличается от обычного запроса?
Можно ли сделать отчёт на СКД без Конфигуратора?
Как показать в отчёте данные из двух регистров?
Связи наборов данных по общему полю (например, по номенклатуре).