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

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

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

Использование интервальных регистров сведений

Разберем основной механизм хранения данных о начислениях в ЗУП 3.1. В отличие от старых версий, где приходилось анализировать движения регистраторов, в актуальной версии существуют так называемые интервальные регистры. Рассмотрим подробнее регистр ПлановыеНачисленияИнтервальный.

Этот регистр является производным от основного регистра ПлановыеНачисления. Его ключевая особенность заключается в том, что система автоматически рассчитывает и хранит в нем «чистые» временные интервалы. Если один документ перекрывает действие другого или вносит изменения в существующее начисление, интервальный регистр пересчитывает записи так, чтобы на любую секунду времени был известный точный состав действующих начислений. Для практического применения этих механизмов можно использовать Постоянные начисления работников на выбранную дату, что позволяет получить корректный срез данных по сотрудникам.

Проанализируем преимущества работы с интервальным регистром:

  1. Данные уже разложены в хронологическом порядке без пересечений.
  2. Каждая запись содержит четкие поля ДатаНачала и ДатаОкончания.
  3. Регистр является независимым, что упрощает построение запросов к нему.

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

Получение размеров начислений через показатели

Выясним важный нюанс: регистр ПлановыеНачисленияИнтервальный хранит только факт наличия начисления и его период. Если нам нужно получить размер (сумму), нам придется обратиться к другому регистру — ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный.

Это связано с тем, что в ЗУП 3.1 состав начислений и значения их показателей (Оклад, Процент надбавки и т.д.) разнесены. Для получения полной картины (Начисление + Период + Размер) необходимо соединить эти два регистра по ключу Сотрудник и периоду. Подобная логика реализована в готовом решении Плановые начисления сотрудников, которое выводит начисления вместе с их стоимостными показателями.

Рассмотрим пример логики запроса:


ВЫБРАТЬ ПЕРВЫЕ 1
    Начисления.Начисление КАК Начисление,
    Начисления.ДатаНачала КАК ДатаНачала,
    Начисления.ДатаОкончания КАК ДатаОкончания,
    Показатели.Значение КАК Размер
ИЗ
    РегистрСведений.ПлановыеНачисленияИнтервальный КАК Начисления
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный КАК Показатели
    ПО Начисления.Сотрудник = Показатели.Сотрудник
    И Начисления.ДатаНачала = Показатели.ДатаНачала
ГДЕ
    Начисления.Сотрудник = &Сотрудник
    И Начисления.Начисление = &ВидРасчета
    И Начисления.ДатаОкончания < &ДатаНачалаТекущегоСобытия
УПОРЯДОЧИТЬ ПО
    Начисления.ДатаНачала УБЫВ

Программный интерфейс (API) и виртуальные таблицы

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

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


// Подготавливаем текст запроса с использованием специального представления
ТекстЗапроса = "ВЫБРАТЬ
               |    Представления_ПлановыеНачисленияСотрудников.Период КАК Период,
               |    Представления_ПлановыеНачисленияСотрудников.Начисление КАК Начисление,
               |    Представления_ПлановыеНачисленияСотрудников.Размер КАК Размер
               |ПОМЕСТИТЬ ВТДанные
               |ИЗ
               |    Представления_ПлановыеНачисленияСотрудников КАК Представления_ПлановыеНачисленияСотрудников";

// Вызываем процедуру трансформации запроса
ЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(ТекстЗапроса);

Функция ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц автоматически заменит конструкцию Представления_ПлановыеНачисленияСотрудников на сложный запрос к нескольким интервальным регистрам. Подробнее о том, как этот программный интерфейс помогает в разработке сложных отчетов, рассказано в статье про Универсальный отчёт для ЗУП. Это самый надежный способ получения данных ФОТ (Фонда оплаты труда), так как он учитывает включение начисления в состав ФОТ и корректно обрабатывает изменения показателей.

Рекомендации по поиску решений в типовых объектах

Если вам требуется реализовать сложную логику отбора (например, с учетом индексации или северных надбавок), рекомендуем обратить внимание на типовой отчет «Динамика плановых начислений» или использовать Анализ плановых начислений сотрудников, который уже содержит механизмы вывода показателей и расчета планового ФОТ на произвольную дату.

Важно помнить: при работе с интервальными регистрами всегда следует проверять поле ЭтоИзменение (если оно доступно в контексте задачи), чтобы отличить первичное назначение начисления от простой корректировки его размера.

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

← На главную