Как перевести старый отчет на построителе отчетов в отчет на СКД

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В конфигурациях 1С (например, 1С:Управление торговлей) многие типовые отчеты предыдущих поколений строились на базе объекта УниверсальныйОтчет, под капотом которого работает ПостроительОтчетов. При модернизации таких отчетов или переносе их в схему компоновки данных (СКД) разработчики часто сталкиваются с ошибками синтаксиса запроса из-за наличия специфических конструкций построителя.

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

Шаг 1. Очистка и адаптация запроса от конструкций Построителя отчетов

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

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

  1. Удалим все фигурные скобки построителя: полностью уберем из тела запроса блоки условий {ГДЕ ...}, настройки полей {ВЫБРАТЬ ...} и сортировки {УПОРЯДОЧИТЬ ПО ...}.
  2. Удалим секцию итогов: конструкции вида ИТОГИ ... ПО ... построителя отчетов в СКД не нужны. Расчет и группировку итогов схема компоновки берет на себя.
  3. Включим автозаполнение: в наборе данных СКД оставим включенным флаг Автозаполнение. Это позволит платформе автоматически генерировать доступные поля выбора, отборы и сортировки в пользовательском режиме.

Посмотрим на пример адаптации текста запроса:


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

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

Шаг 2. Расчет весовых показателей номенклатуры

Если задача заключается в выводе продаж в весовом выражении (в килограммах), нам необходимо учесть вес единицы товара и коэффициенты пересчета. В зависимости от архитектуры данных расчет веса можно выполнить двумя путями.

Вариант 1. Расчет непосредственно в тексте запроса:

При перемножении реквизитов обязательно защищаем результат от значений NULL, чтобы исключить потерю сумм при отсутствии веса в карточке товара:


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

Вариант 2. Использование вкладки «Вычисляемые поля»:

Вместо усложнения текста запроса можно добавить вычисляемое поле на одноименной вкладке схемы СКД:

  1. Путь к данным: Вес
  2. Выражение: Количество * ЕстьNULL(Номенклатура.Вес, 0)
  3. Заголовок: Вес (кг)

Шаг 3. Настройка ресурсов и агрегатных функций

В отчетах на СКД числовые поля не суммируются в группировках автоматически. Перейдем на вкладку Ресурсы и назначим правила расчета итогов:

  1. Для полей Количество, Стоимость и Вес укажем базовое выражение: Сумма(Количество), Сумма(Стоимость), Сумма(Вес).
  2. Если в отчете требуется средняя цена за 1 кг, создадим ресурс ЦенаЗаКг и пропишем расчетную формулу во избежание деления на ноль:

ВЫБОР
	КОГДА Сумма(Вес) = 0 ТОГДА 0
	ИНАЧЕ Сумма(Стоимость) / Сумма(Вес)
КОНЕЦ

Шаг 4. Удобный выбор периода в настройках

В старых отчетах интервал задавался единым реквизитом. Чтобы обеспечить пользователю привычный выбор стандартных интервалов («Этот месяц», «Прошлый квартал»), настроим параметры СКД:

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