Как в 1С:ЗУП 3 получить расчетную базу за произвольный период?

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

При переходе на программу «1С:Зарплата и управление персоналом 3.1» разработчики и консультанты часто сталкиваются с задачей расчета начислений (например, премий) за произвольный период, который не совпадает с полным календарным месяцем. В старой версии ЗУП 2.5 или в легендарной версии 7.7 для этого существовали понятные функции вроде глПолучитьБазуВР() или прямые запросы к регистрам расчета. В редакции ЗУП 3.1 архитектура учета кардинально изменилась.

В этой статье мы подробно разберем, как получить расчетную базу за произвольный период в 1С:ЗУП 3. Мы изучим как стандартный интерактивный метод настройки, доступный обычным пользователям, так и особенности программной реализации этой задачи для разработчиков.

Решение 1. Стандартный механизм ЗУП 3.1 без программирования

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

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

Программа автоматически определит фактический заработок сотрудников по базовым начислениям именно за указанный интервал. База будет рассчитана пропорционально дням, которые попали в этот период, с учетом графиков работы сотрудников. Это самый надежный и простой способ решения задачи, не требующий доработки конфигурации.

Решение 2. Программное получение базы (для разработчиков)

Бывают ситуации, когда расчетную базу необходимо получить программно во внешней обработке, отчете или при создании собственного документа. Посмотрим, почему старые методы запросов больше не работают и как правильно написать код в ЗУП 3.1.

В некоторых старых рекомендациях (как в сообщении 17 форума) предлагается делать прямой запрос к таблицам регистра расчета. Однако в ЗУП 3.1 больше нет регистра ОсновныеНачисленияРаботниковОрганизаций. На смену ему пришел единый регистр расчета Начисления.

Более того, простой запрос с условием по датам вроде БазовыйПериодНачало >= &Начало И БазовыйПериодКонец <= &Конец вернет некорректный результат. Если оклад сотрудника начислен за весь месяц (с 1 по 31 число), а вам нужна база с 10 по 15 число, прямой запрос по условию дат просто отбросит запись оклада целиком, и вы получите нулевую сумму. Платформа должна рассчитывать базу пропорционально рабочим дням.

Для правильного программного расчета базы «на лету» в ЗУП 3.1 используется специализированный программный слой — Менеджер расчета зарплаты. Рассмотрим пример его инициализации и использования:


// Создаем объект менеджера расчета зарплаты
МенеджерРасчета = Обработки.МенеджерРасчетаЗарплаты.Создать();

// Задаем произвольный период сбора данных
ПериодРасчета = Новый СтандартныйПериод;
ПериодРасчета.ДатаНачала = НачалоПериода; // Например, 10.01.2024
ПериодРасчета.ДатаОкончания = КонецПериода; // Например, 15.01.2024

// Инициализируем менеджер данными по организации
МенеджерРасчета.Инициализировать(ПериодРасчета, Организация);

// Заполняем кадровые данные и выполняем расчет базы
// Менеджер автоматически учтет графики работы, вытеснения и кадровые переводы

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

Важные нюансы и подводные камни

При работе с расчетной базой за неполный период обязательно учитывайте следующие архитектурные особенности ЗУП 3.1:

Таким образом, для получения корректной расчетной базы за произвольный период в ЗУП 3.1 следует отдавать предпочтение штатным возможностям настройки документов «Премия» и механизму вытеснений. При программной реализации всегда используйте типовой МенеджерРасчетаЗарплаты вместо прямых запросов к регистру расчета, чтобы избежать ошибок округления и неверного распределения сумм по графику работы.

← На главную