При переходе на программу «1С:Зарплата и управление персоналом 3.1» разработчики и консультанты часто сталкиваются с задачей расчета начислений (например, премий) за произвольный период, который не совпадает с полным календарным месяцем. В старой версии ЗУП 2.5 или в легендарной версии 7.7 для этого существовали понятные функции вроде глПолучитьБазуВР() или прямые запросы к регистрам расчета. В редакции ЗУП 3.1 архитектура учета кардинально изменилась.
В этой статье мы подробно разберем, как получить расчетную базу за произвольный период в 1С:ЗУП 3. Мы изучим как стандартный интерактивный метод настройки, доступный обычным пользователям, так и особенности программной реализации этой задачи для разработчиков.
Прежде чем приступать к написанию программного кода, проанализируем возможности типового функционала. Разработчики «1С» заложили мощный механизм расчета базы непосредственно в настройки видов начислений и документов конфигурации. Если вам необходимо начислить премию за произвольный интервал времени (например, с 10 по 15 число месяца), выполним следующие шаги:
Программа автоматически определит фактический заработок сотрудников по базовым начислениям именно за указанный интервал. База будет рассчитана пропорционально дням, которые попали в этот период, с учетом графиков работы сотрудников. Это самый надежный и простой способ решения задачи, не требующий доработки конфигурации.
Бывают ситуации, когда расчетную базу необходимо получить программно во внешней обработке, отчете или при создании собственного документа. Посмотрим, почему старые методы запросов больше не работают и как правильно написать код в ЗУП 3.1.
В некоторых старых рекомендациях (как в сообщении 17 форума) предлагается делать прямой запрос к таблицам регистра расчета. Однако в ЗУП 3.1 больше нет регистра ОсновныеНачисленияРаботниковОрганизаций. На смену ему пришел единый регистр расчета Начисления.
Более того, простой запрос с условием по датам вроде БазовыйПериодНачало >= &Начало И БазовыйПериодКонец <= &Конец вернет некорректный результат. Если оклад сотрудника начислен за весь месяц (с 1 по 31 число), а вам нужна база с 10 по 15 число, прямой запрос по условию дат просто отбросит запись оклада целиком, и вы получите нулевую сумму. Платформа должна рассчитывать базу пропорционально рабочим дням.
Для правильного программного расчета базы «на лету» в ЗУП 3.1 используется специализированный программный слой — Менеджер расчета зарплаты. Рассмотрим пример его инициализации и использования:
// Создаем объект менеджера расчета зарплаты
МенеджерРасчета = Обработки.МенеджерРасчетаЗарплаты.Создать();
// Задаем произвольный период сбора данных
ПериодРасчета = Новый СтандартныйПериод;
ПериодРасчета.ДатаНачала = НачалоПериода; // Например, 10.01.2024
ПериодРасчета.ДатаОкончания = КонецПериода; // Например, 15.01.2024
// Инициализируем менеджер данными по организации
МенеджерРасчета.Инициализировать(ПериодРасчета, Организация);
// Заполняем кадровые данные и выполняем расчет базы
// Менеджер автоматически учтет графики работы, вытеснения и кадровые переводы
Этот метод гарантирует, что вы получите абсолютно те же цифры, которые рассчитывает типовой документ конфигурации. Программа сама произведет пропорциональное деление окладов и тарифов за неполный период.
При работе с расчетной базой за неполный период обязательно учитывайте следующие архитектурные особенности ЗУП 3.1:
НеРазделятьПоПериодам.Таким образом, для получения корректной расчетной базы за произвольный период в ЗУП 3.1 следует отдавать предпочтение штатным возможностям настройки документов «Премия» и механизму вытеснений. При программной реализации всегда используйте типовой МенеджерРасчетаЗарплаты вместо прямых запросов к регистру расчета, чтобы избежать ошибок округления и неверного распределения сумм по графику работы.