Как исправить ошибку «В схеме источника данных отсутствует поле периода» в произвольном запросе бюджетирования 1С:ERP

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

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

Выясним причину возникновения ошибки

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

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

Использование расширений языка запросов (фигурные скобки)

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

Рассмотрим пример правильного оформления секции отбора:


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

Обратите внимание, что параметры &НачалоПериода и &КонецПериода являются предопределенными для бюджетирования. Система сама передает в них границы интервала, за который формируется бюджет.

Настройка ролей полей в наборе данных

После того как текст запроса написан, необходимо правильно настроить колонку «Роль» на закладке «Наборы данных» в конструкторе СКД. Выясним, что именно нужно изменить:

  1. Найдите поле, отвечающее за дату (например, Период).
  2. В колонке «Роль» нажмите на кнопку выбора.
  3. Убедитесь, что установлен флаг «Период».
  4. Для корректной работы часто требуется указать тип периода (например, День, Месяц) и порядковый номер.
  5. Иногда помогает снятие флажка «Обязательное», если вы формируете выборку сложным образом через временные таблицы.

Особенности работы с временными таблицами

Проанализируем сложный случай, когда запрос содержит несколько временных таблиц (как в примере с производственным календарем). Основная ошибка здесь заключается в том, что поле периода «теряется» в промежуточных расчетах. Рассмотрим, как правильно «протащить» период через весь запрос.

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


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

Переход на виртуальные таблицы

Посмотрим на ситуацию с точки зрения производительности и стандартов 1С. Вместо обращения к физическим таблицам регистров (например, РегистрНакопления.ДенежныеСредстваБезналичные), крайне рекомендуется использовать виртуальные таблицы оборотов (.Обороты). Разберем преимущества этого подхода:

Рассмотрим, как должен выглядеть запрос с использованием виртуальной таблицы:


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

Чек-лист для исправления ошибки

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

  1. Имя поля: Убедитесь, что результирующее поле называется именно Период.
  2. Тип данных: Поле должно иметь тип Дата.
  3. Параметры: Проверьте на закладке «Параметры», что &НачалоПериода и &КонецПериода доступны для редактирования и имеют тип Дата.
  4. Группировки: Если в запросе есть СГРУППИРОВАТЬ ПО, убедитесь, что поле Период включено в группировку.
  5. Периодичность: Если используете виртуальные таблицы, установите периодичность «Авто» в параметрах таблицы в конструкторе запроса.

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

← На главную