Работа с регистрами расчета в платформе 1С:Предприятие традиционно считается одной из самых сложных тем для начинающих разработчиков. Механизмы расчета зарплаты, вытеснения периодов и сбора базы требуют глубокого понимания логики работы системы. Часто при попытке написать запрос к виртуальной таблице базы (например, БазаНачисления) разработчики сталкиваются с ошибкой СУБД: "Поле не найдено: ...Разрез".
В этой статье мы подробно разберем, почему возникает эта ошибка, как устроены виртуальные таблицы базовых данных регистров расчета, как правильно передавать параметры и где на самом деле хранятся рассчитанные суммы базовых начислений.
Рассмотрим типичную ситуацию. Разработчик пытается выбрать данные из таблицы РегистрРасчета.РасчетСреднегоЗаработка.БазаНачисления и обращается к полю Показатель1Разрез. При этом запрос возвращает ошибку, сообщающую, что такое поле отсутствует.
Причина кроется в динамической природе полей с суффиксом Разрез. Эти поля не существуют в таблице по умолчанию. Платформа 1С генерирует их "на лету" на уровне СУБД только тогда, когда разработчик явным образом указывает имена соответствующих разрезов в параметрах виртуальной таблицы запроса.
Если оставить третий параметр виртуальной таблицы (Разрезы) пустым или передать туда неинициализированное значение, платформа просто не создаст эти колонки в результирующей выборке, что неизбежно приведет к ошибке выполнения запроса.
Чтобы понять, как правильно управлять структурой получаемой таблицы, проанализируем синтаксис виртуальной таблицы получения базовых данных:
РегистрРасчета.<ИмяРегистра>.БазаНачисления(<ИзмеренияОсновногоРегистра>, <ИзмеренияБазовогоРегистра>, <Разрезы>, <Условие>)
Каждый из этих параметров играет ключевую роль в формировании итогового SQL-запроса:
Массив или СписокЗначений) — указывает измерения текущего (основного) регистра расчета, по которым будет происходить сопоставление данных для расчета базы (например, ФизЛицо, Организация).Массив или СписокЗначений) — указывает измерения базового регистра (это может быть этот же регистр или другой, являющийся базовым для текущего), которые будут сопоставляться с измерениями основного регистра. Количество и порядок следования измерений в первом и втором массивах должны строго совпадать. Платформа использует их для связи таблиц по принципу: ОсновнойРегистр.Измерение1 = БазовыйРегистр.Измерение1.Массив или СписокЗначений) — список полей базового регистра, в разрезе которых необходимо детализировать базовые данные. Именно передача имен полей в этот параметр заставляет платформу создавать динамические поля с суффиксом Разрез (например, ВидРасчетаРазрез, ПериодРегистрацииРазрез, Показатель1Разрез). В качестве разрезов можно использовать измерения базового регистра, реквизиты, а также предопределенные системные поля (ВидРасчета, Регистратор, ПериодРегистрации и другие).Часто начинающие программисты полагают, что в полях вида Показатель1Разрез хранится сама рассчитанная сумма базового начисления. Это серьезная ошибка.
Поля с суффиксом Разрез содержат исключительно значения аналитики, по которой выполняется группировка. Например, если в качестве разреза передан ВидРасчета, то поле ВидРасчетаРазрез будет содержать конкретную ссылку на элемент плана видов расчета (например, "Оклад по дням" или "Премия"), но никак не сумму.
Все суммовые показатели и числовые ресурсы базового регистра (такие как результаты начислений, отработанные дни или часы) возвращаются платформой в специальных полях с суффиксом База. Платформа берет исходные имена ресурсов базового регистра и автоматически дописывает к ним слово "База":
РезультатБаза (а не в обычном поле Результат).РезультатПолныйБаза (а не в РезультатПолный).ОтработаноДнейБаза.Если вы выберете в запросе к виртуальной таблице базовые поля без суффикса База (например, просто Результат или ОтработаноДней), то вы получите данные из текущих записей основного регистра, которые в момент расчета базы чаще всего еще не рассчитаны и содержат нулевые значения.
Рассмотрим подробнее пример кода, который решает поставленную задачу. Мы создадим массивы для сопоставления измерений, добавим разрез по показателю и выполним запрос к базе начисления без каких-либо ошибок.
// Шаг 1. Создаем массивы для связи измерений основного и базового регистров
ИзмеренияОсновного = Новый Массив;
ИзмеренияОсновного.Добавить("ФизЛицо");
ИзмеренияБазового = Новый Массив;
ИзмеренияБазового.Добавить("ФизЛицо");
// Шаг 2. Задаем разрезы, по которым хотим детализировать базовые суммы
МассивРазрезов = Новый Массив;
МассивРазрезов.Добавить("Показатель1");
МассивРазрезов.Добавить("ВидРасчета"); // Дополнительно сгруппируем по видам расчета
// Шаг 3. Инициализируем запрос и настраиваем текст
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| База.Регистратор КАК Регистратор,
| База.ФизЛицо КАК ФизЛицо,
| База.ВидРасчетаРазрез КАК ВидРасчетаБазовый,
| База.Показатель1Разрез КАК Показатель1Значение,
| База.РезультатБаза КАК РезультатБаза,
| База.РезультатПолныйБаза КАК РезультатПолныйБаза,
| База.ОтработаноДнейБаза КАК ОтработаноДнейБаза
|ИЗ
| РегистрРасчета.РасчетСреднегоЗаработка.БазаНачисления(&ИзмеренияОсновного, &ИзмеренияБазового, &Разрезы, ) КАК База";
// Шаг 4. Устанавливаем параметры в запрос
Запрос.УстановитьПараметр("ИзмеренияОсновного", ИзмеренияОсновного);
Запрос.УстановитьПараметр("ИзмеренияБазового", ИзмеренияБазового);
Запрос.УстановитьПараметр("Разрезы", МассивРазрезов);
// Шаг 5. Выполняем запрос и обходим результаты
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Здесь мы можем обрабатывать полученные данные по базовым начислениям
Сообщить(Строка(Выборка.ФизЛицо) + " - База по " + Строка(Выборка.ВидРасчетаБазовый) + ": " + Строка(Выборка.РезультатБаза));
КонецЦикла;
Мы проанализировали особенности проектирования запросов к виртуальным таблицам базовых данных в регистрах расчета 1С. Для того чтобы успешно выбирать данные и избегать системных ошибок СУБД, всегда придерживайтесь следующих правил:
Разрез, обязательно передавайте их текстовые имена в виде массива в третий параметр виртуальной таблицы.База (например, РезультатБаза).Применение этих правил позволит вам писать надежные и производительные запросы для любых механизмов расчета заработной платы и среднего заработка в конфигурациях на платформе 1С:Предприятие.