В конфигурациях 1С (например, 1С:Управление торговлей) многие типовые отчеты предыдущих поколений строились на базе объекта УниверсальныйОтчет, под капотом которого работает ПостроительОтчетов. При модернизации таких отчетов или переносе их в схему компоновки данных (СКД) разработчики часто сталкиваются с ошибками синтаксиса запроса из-за наличия специфических конструкций построителя.
Разберем по шагам, как правильно адаптировать текст запроса, что делать с фигурными скобками и как корректно настроить вывод весовых и количественных показателей в СКД.
Проанализируем причину, почему платформа выдает синтаксическую ошибку при переносе исходного текста запроса в СКД. В текстах запросов для ПостроительОтчетов активно используются конструкции расширения в фигурных скобках, такие как {ВЫБРАТЬ ...}, {ГДЕ ...}, {ИТОГИ ПО ...} и обращения через метасимволы (например, Номенклатура.*).
Хотя СКД также поддерживает расширения языка запросов, синтаксис построителя компоновщику данных напрямую не подходит. Для быстрого перевода отчета на СКД выполним следующие действия:
{ГДЕ ...}, настройки полей {ВЫБРАТЬ ...} и сортировки {УПОРЯДОЧИТЬ ПО ...}.ИТОГИ ... ПО ... построителя отчетов в СКД не нужны. Расчет и группировку итогов схема компоновки берет на себя.Посмотрим на пример адаптации текста запроса:
// Исходный запрос построителя отчетов:
ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СтоимостьОборот КАК Стоимость
{ВЫБРАТЬ
Номенклатура.*,
Количество,
Стоимость}
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, , {Номенклатура.*}) КАК ПродажиОбороты
{ГДЕ
ПродажиОбороты.Номенклатура.*}
{ИТОГИ ПО
Номенклатура.*}
// Очищенный запрос для набора данных СКД:
ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СтоимостьОборот КАК Стоимость
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты
Если задача заключается в выводе продаж в весовом выражении (в килограммах), нам необходимо учесть вес единицы товара и коэффициенты пересчета. В зависимости от архитектуры данных расчет веса можно выполнить двумя путями.
Вариант 1. Расчет непосредственно в тексте запроса:
При перемножении реквизитов обязательно защищаем результат от значений NULL, чтобы исключить потерю сумм при отсутствии веса в карточке товара:
ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СтоимостьОборот КАК Стоимость,
ПродажиОбороты.КоличествоОборот * ЕСТЬNULL(ПродажиОбороты.Номенклатура.Вес, 0) КАК Вес
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты
Вариант 2. Использование вкладки «Вычисляемые поля»:
Вместо усложнения текста запроса можно добавить вычисляемое поле на одноименной вкладке схемы СКД:
ВесКоличество * ЕстьNULL(Номенклатура.Вес, 0)Вес (кг)В отчетах на СКД числовые поля не суммируются в группировках автоматически. Перейдем на вкладку Ресурсы и назначим правила расчета итогов:
Количество, Стоимость и Вес укажем базовое выражение: Сумма(Количество), Сумма(Стоимость), Сумма(Вес).ЦенаЗаКг и пропишем расчетную формулу во избежание деления на ноль:
ВЫБОР
КОГДА Сумма(Вес) = 0 ТОГДА 0
ИНАЧЕ Сумма(Стоимость) / Сумма(Вес)
КОНЕЦ
В старых отчетах интервал задавался единым реквизитом. Чтобы обеспечить пользователю привычный выбор стандартных интервалов («Этот месяц», «Прошлый квартал»), настроим параметры СКД:
ПериодОтчета с типом СтандартныйПериод.НачалоПериода и КонецПериода установим выражения связи:
НачалоПериода: &ПериодОтчета.ДатаНачала
КонецПериода: КонецПериода(&ПериодОтчета.ДатаОкончания, "ДЕНЬ")НачалоПериода и КонецПериода, чтобы скрыть их от пользователя, а параметр ПериодОтчета выведем в пользовательские настройки.