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

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

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

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

Основные причины отсутствия данных в показателе

Выделим ключевые факторы, из-за которых расчетный нефинансовый показатель возвращает пустое значение при формировании отчета или экземпляра бюджета:

  1. Несоответствие контекстных параметров периода: при вычислении показателя подсистема бюджетирования автоматически передает в компоновщик фиксированные параметры (например, контекстный параметр даты или границы шага бюджета). Если в схеме жестко прописаны произвольные имена параметров (к примеру, &НачалоПериода и &КонецПериода), они не инициализируются платформой, оставаясь в значении Неопределено или NULL, в результате чего условие отбора отсекает все записи.
  2. Несовпадение формата и периодичности даты: дата в поле Период должна строго соответствовать началу бюджетного интервала (день, месяц, квартал). Если в запросе передается точная дата документа со временем или дата внутри месяца, а периодичность бюджета настроена по месяцам, подсистема не может сопоставить данные со шкалой отчета.
  3. Деление на ноль или декартово произведение при соединении: если одна из соединяемых таблиц пуста, простое соединение через запятую (декартово произведение) дает пустой результат. При расчете коэффициента деление на нулевую сумму также приводит к ошибке или значению NULL.
  4. Использование операторов очистки временных таблиц: оператор УНИЧТОЖИТЬ в тексте запроса СКД является избыточным, а в ряде случаев нарушает работу внутреннего генератора макета компоновки данных.
  5. Обращение к реальным таблицам регистров накопления: выборка напрямую из таблицы РегистрНакопления.МатериалыИРаботыВПроизводстве вместо таблицы оборотов приводит к избыточной нагрузке, полному сканированию и проблемам с получением агрегированных итогов за период.

Обязательные требования к структуре полей СКД

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

  1. ЗначениеПоказателя — числовое поле, содержащее итоговый расчетный результат.
  2. Период — поле даты, обязательно приведенное к началу периода (например, НАЧАЛОПЕРИОДА(Период, МЕСЯЦ)).
  3. Валюта — обязательно только в том случае, если вид нефинансового показателя настроен как «Денежный».
  4. Поля аналитик — если показатель детализируется по статьям, подразделениям или номенклатуре, эти поля должны быть сопоставлены в настройках показателя с источником «Из запроса СКД».

Пошаговое исправление схемы и текста запроса

Разберем процесс исправления исходного запроса, в котором рассчитывался коэффициент передачи между подразделениями («БЛЦ» и «ЦРПБиК»).

Шаг 1. Убираем операторы уничтожения таблиц. Компоновщик данных самостоятельно управляет жизненным циклом временных таблиц в сеансе формирования. Конструкции УНИЧТОЖИТЬ необходимо удалить.

Шаг 2. Переходим на виртуальную таблицу оборотов. Вместо фильтрации движений в секции ГДЕ физической таблицы регистра накопления перейдем на использование виртуальной таблицы Обороты с периодичностью Месяц или Авто.

Шаг 3. Согласовываем параметры периода. В подсистеме бюджетирования при расчете нефинансовых показателей дата может передаваться через специальный параметр отчета (например, &Период). В настройках параметров СКД свяжем передаваемые границы с параметрами виртуальной таблицы, либо зададим явное условие равенства периода среза.

Шаг 4. Добавляем защиту от деления на ноль и корректное соединение. Заменим соединение через запятую на левое или полное соединение по ключевым аналитикам и периоду, обернув формулу деления в конструкцию ВЫБОР КОГДА.

Посмотрим на пример оптимизированного запроса для схемы компоновки данных:


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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЕСТЬNULL(ВТ_ПередачаБЛЦ.Период, ВТ_ПередачаЦРПБиК.Период) КАК Период,
    ЕСТЬNULL(ВТ_ПередачаБЛЦ.Номенклатура, ВТ_ПередачаЦРПБиК.Номенклатура) КАК Номенклатура,
    ВЫБОР
        КОГДА (ЕСТЬNULL(ВТ_ПередачаБЛЦ.Количество, 0) + ЕСТЬNULL(ВТ_ПередачаЦРПБиК.Количество, 0)) = 0
            ТОГДА 0
        ИНАЧЕ ЕСТЬNULL(ВТ_ПередачаЦРПБиК.Количество, 0) / (ЕСТЬNULL(ВТ_ПередачаБЛЦ.Количество, 0) + ЕСТЬNULL(ВТ_ПередачаЦРПБиК.Количество, 0))
    КОНЕЦ КАК ЗначениеПоказателя
ИЗ
    ВТ_ПередачаЦРПБиК КАК ВТ_ПередачаЦРПБиК
        ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ПередачаБЛЦ КАК ВТ_ПередачаБЛЦ
        ПО ВТ_ПередачаЦРПБиК.Период = ВТ_ПередачаБЛЦ.Период
            И ВТ_ПередачаЦРПБиК.Номенклатура = ВТ_ПередачаБЛЦ.Номенклатура

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

Для гарантированной передачи данных в подсистему проверим вкладки схемы компоновки данных:

  1. Вкладка «Параметры»: если для показателя критичен конкретный параметр среза даты, убедимся, что для параметров &НачалоПериода и &КонецПериода настроены выражения связи с контекстным параметром периода бюджетирования, либо в секции отбора используется условие ПериодМесяц = &Период. Для фиксированных аналитик (подразделения, номенклатура) снимем признак включения в доступные поля отчета и установим значения по умолчанию.
  2. Вкладка «Настройки»: в структуре отчета обязательно должна присутствовать группировка (как минимум «Детальные записи»), а в выбранных полях должны быть указаны Период и ЗначениеПоказателя. Если структура пустая, макет компоновки при программном выполнении может сформировать пустой результат.
  3. Флаг «Автозаполнение»: флаг на вкладке наборов данных должен быть включен, чтобы платформа могла автоматически дополнять поля отбора и параметров при динамическом формировании отчетов.

Альтернативный подход: фиксация значений документом

Динамический расчет показателя «на лету» при формировании отчетов или бюджетных форм выполняет запрос СКД в реальном времени. Если алгоритм содержит тяжелые выборки и множественные соединения, открытие бюджетных отчетов может существенно замедлиться.

В таких случаях рекомендуется использовать документ «Установка значений нефинансовых показателей» с шаблоном заполнения по настроенной схеме СКД. Расчет выполняется один раз при проведении документа, данные сохраняются в регистре сведений, а подсистема бюджетирования считывает готовые цифры мгновенно без повторного выполнения тяжелых запросов к регистрам накопления.

← На главную