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