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