Как правильно написать запрос к виртуальной таблице БазаНачисления регистра расчета и избежать ошибки "Поле не найдено"

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

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

В этой статье мы подробно разберем, почему возникает эта ошибка, как устроены виртуальные таблицы базовых данных регистров расчета, как правильно передавать параметры и где на самом деле хранятся рассчитанные суммы базовых начислений.

Выясняем причину ошибки: почему поле разреза не найдено

Рассмотрим типичную ситуацию. Разработчик пытается выбрать данные из таблицы РегистрРасчета.РасчетСреднегоЗаработка.БазаНачисления и обращается к полю Показатель1Разрез. При этом запрос возвращает ошибку, сообщающую, что такое поле отсутствует.

Причина кроется в динамической природе полей с суффиксом Разрез. Эти поля не существуют в таблице по умолчанию. Платформа 1С генерирует их "на лету" на уровне СУБД только тогда, когда разработчик явным образом указывает имена соответствующих разрезов в параметрах виртуальной таблицы запроса.

Если оставить третий параметр виртуальной таблицы (Разрезы) пустым или передать туда неинициализированное значение, платформа просто не создаст эти колонки в результирующей выборке, что неизбежно приведет к ошибке выполнения запроса.

Разбираем параметры виртуальной таблицы получения базы по шагам

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

РегистрРасчета.<ИмяРегистра>.БазаНачисления(<ИзмеренияОсновногоРегистра>, <ИзмеренияБазовогоРегистра>, <Разрезы>, <Условие>)

Каждый из этих параметров играет ключевую роль в формировании итогового SQL-запроса:

  1. ИзмеренияОсновногоРегистра (тип Массив или СписокЗначений) — указывает измерения текущего (основного) регистра расчета, по которым будет происходить сопоставление данных для расчета базы (например, ФизЛицо, Организация).
  2. ИзмеренияБазовогоРегистра (тип Массив или СписокЗначений) — указывает измерения базового регистра (это может быть этот же регистр или другой, являющийся базовым для текущего), которые будут сопоставляться с измерениями основного регистра. Количество и порядок следования измерений в первом и втором массивах должны строго совпадать. Платформа использует их для связи таблиц по принципу: ОсновнойРегистр.Измерение1 = БазовыйРегистр.Измерение1.
  3. Разрезы (тип Массив или СписокЗначений) — список полей базового регистра, в разрезе которых необходимо детализировать базовые данные. Именно передача имен полей в этот параметр заставляет платформу создавать динамические поля с суффиксом Разрез (например, ВидРасчетаРазрез, ПериодРегистрацииРазрез, Показатель1Разрез). В качестве разрезов можно использовать измерения базового регистра, реквизиты, а также предопределенные системные поля (ВидРасчета, Регистратор, ПериодРегистрации и другие).
  4. Условие (строка запроса) — произвольный фильтр на языке запросов, накладываемый на записи основного регистра расчета, для которых собирается база.

Главное заблуждение: где на самом деле хранится сумма базы?

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

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

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

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

Практический пример: правильное написание запроса на языке 1С

Рассмотрим подробнее пример кода, который решает поставленную задачу. Мы создадим массивы для сопоставления измерений, добавим разрез по показателю и выполним запрос к базе начисления без каких-либо ошибок.


// Шаг 1. Создаем массивы для связи измерений основного и базового регистров
ИзмеренияОсновного = Новый Массив;
ИзмеренияОсновного.Добавить("ФизЛицо");

ИзмеренияБазового = Новый Массив;
ИзмеренияБазового.Добавить("ФизЛицо");

// Шаг 2. Задаем разрезы, по которым хотим детализировать базовые суммы
МассивРазрезов = Новый Массив;
МассивРазрезов.Добавить("Показатель1"); 
МассивРазрезов.Добавить("ВидРасчета"); // Дополнительно сгруппируем по видам расчета

// Шаг 3. Инициализируем запрос и настраиваем текст
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	База.Регистратор КАК Регистратор,
    |	База.ФизЛицо КАК ФизЛицо,
    |	База.ВидРасчетаРазрез КАК ВидРасчетаБазовый,
    |	База.Показатель1Разрез КАК Показатель1Значение,
    |	База.РезультатБаза КАК РезультатБаза,
    |	База.РезультатПолныйБаза КАК РезультатПолныйБаза,
    |	База.ОтработаноДнейБаза КАК ОтработаноДнейБаза
    |ИЗ
    |	РегистрРасчета.РасчетСреднегоЗаработка.БазаНачисления(&ИзмеренияОсновного, &ИзмеренияБазового, &Разрезы, ) КАК База";

// Шаг 4. Устанавливаем параметры в запрос
Запрос.УстановитьПараметр("ИзмеренияОсновного", ИзмеренияОсновного);
Запрос.УстановитьПараметр("ИзмеренияБазового", ИзмеренияБазового);
Запрос.УстановитьПараметр("Разрезы", МассивРазрезов);

// Шаг 5. Выполняем запрос и обходим результаты
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    // Здесь мы можем обрабатывать полученные данные по базовым начислениям
    Сообщить(Строка(Выборка.ФизЛицо) + " - База по " + Строка(Выборка.ВидРасчетаБазовый) + ": " + Строка(Выборка.РезультатБаза));
КонецЦикла;

Подведем итоги совместной работы

Мы проанализировали особенности проектирования запросов к виртуальным таблицам базовых данных в регистрах расчета 1С. Для того чтобы успешно выбирать данные и избегать системных ошибок СУБД, всегда придерживайтесь следующих правил:

  1. Если в запросе вам необходимы поля с суффиксом Разрез, обязательно передавайте их текстовые имена в виде массива в третий параметр виртуальной таблицы.
  2. Для получения числовых показателей начисленной базы (суммы, дни, часы) всегда обращайтесь к полям с суффиксом База (например, РезультатБаза).
  3. Следите за тем, чтобы измерения основного и базового регистров, передаваемые в параметры таблицы, строго соответствовали друг другу по типам данных и порядку добавления в массивы.

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

← На главную