Как программно получить отмененные плановые начисления сотрудников в ЗУП 3.1 через программный интерфейс

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

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

Понятие программного интерфейса в ЗУП 3.1

Прежде чем мы перейдем к техническим деталям, проанализируем ситуацию, описанную автором темы. Существует распространенное мнение, что программный интерфейс — это только те функции, которые явно помечены в комментариях как ПрограммныйИнтерфейс. Однако в крупных решениях вроде ЗУП 3.1 к нему также относятся методы общих модулей, предназначенные для формирования временных таблиц в запросах. Использование функций из модуля ЗарплатаКадрыОбщиеНаборыДанных является официальным и рекомендуемым способом получения данных, так как эти методы инкапсулируют логику работы с разделением данных, учетом исправлений и версионированием метаданных.

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

Решение 1: Использование метода СоздатьВТИмяРегистраСрезПоследних

Этот метод является одним из наиболее мощных инструментов программного интерфейса. Он позволяет создать временную таблицу с данными регистра, применив необходимые фильтры. Чтобы получить отмененные начисления, мы можем проанализировать состояние ресурса Используется. Если на определенную дату значение этого ресурса становится Ложь, значит, начисление было отменено.

Разберем пример кода, который формирует запрос к плановым начислениям через этот интерфейс:


ПараметрыПостроения = ЗарплатаКадрыОбщиеНаборыДанных.ПараметрыПостроенияДляСоздатьВТИмяРегистра();
ПараметрыПостроения.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;

// Формируем описание фильтра по сотрудникам
ОписаниеФильтра = ЗарплатаКадрыОбщиеНаборыДанных.ОписаниеФильтраДляСоздатьВТИмяРегистра(СотрудникиДаты, КолонкиСотрудникиДаты);

// Вызываем метод интерфейса для построения ВТ
ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТИмяРегистраСрезПоследних(
    "ПлановыеНачисления", 
    Запрос.МенеджерВременныхТаблиц, 
    Истина, 
    ОписаниеФильтра, 
    ПараметрыПостроения
);

После выполнения этого кода в менеджере временных таблиц появится таблица ВТПлановыеНачисленияСрезПоследних. Проанализировав записи, где поле Используется равно Ложь, мы найдем факт отмены. Однако этот метод дает нам состояние на конкретную дату. Чтобы получить дату отмены, нам нужно обратиться к механизму интервальных регистров.

Решение 2: Работа с интервальными регистрами

В ЗУП 3.1 для оптимизации расчетов используются так называемые «интервальные» регистры. Одним из таких является ПлановыеНачисленияИнтервальный. В отличие от обычных регистров сведений, здесь каждая запись содержит не только дату начала (Период), но и явную дату окончания (ДатаОкончания).

Рассмотрим преимущества использования интервальных регистров через программный интерфейс:

  1. Прямой доступ к дате завершения: Нам не нужно сравнивать две соседние записи, чтобы понять, когда закончилось начисление. Поле ДатаОкончания содержит эту информацию в явном виде.
  2. Целостность данных: Система автоматически поддерживает актуальность интервалов при проведении кадровых документов.
  3. Производительность: Запросы к интервальным таблицам обычно выполняются быстрее, чем сложные соединения срезов последних.

Для работы с ними мы также можем использовать методы модуля ЗарплатаКадрыОбщиеНаборыДанных, указав в качестве имени регистра "ПлановыеНачисленияИнтервальный". Выясним причину, по которой это решение считается более предпочтительным: оно позволяет получить всю историю изменений (хронологическую цепочку) за один проход запроса.

Решение 3: Функция НачисленияСотрудниковПоПериодам

Если задача стоит максимально широко — получить все изменения плановых начислений за всю историю работы сотрудника, — целесообразно использовать функцию НачисленияСотрудниковПоПериодам из общего модуля ЗарплатаКадрыРасширенный. Эта функция возвращает таблицу значений или формирует временную таблицу, в которой начисления разбиты по периодам их действия.

Проанализируем алгоритм работы с этой функцией:

Решение 4: Программное использование схемы компоновки данных (СКД)

Официальная позиция фирмы «1С» часто сводится к тому, что наиболее стабильным API является использование предопределенных наборов данных СКД. В ЗУП 3.1 существует множество служебных схем, которые используются в типовых отчетах (например, в отчете «История изменения оплаты труда»).

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

  1. Используем модуль ЗарплатаКадрыКомпоновкаДанных для получения описания полей.
  2. Добавляем программный отбор по сотруднику и признаку Действует = Ложь.
  3. Выполняем компоновку и получаем таблицу значений.

Этот путь сложнее в реализации, но он гарантирует, что даже при радикальном изменении структуры регистров (например, если 1С решит перенести данные в другой объект), ваш код продолжит работать, так как он опирается на высокоуровневую логику системы компоновки, которую обновляет сама фирма «1С».

Выводы и рекомендации

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

  1. Если нужно быстро получить данные по списку сотрудников на конкретную дату — используйте СоздатьВТИмяРегистраСрезПоследних.
  2. Если важна дата отмены и хронология — используйте работу с интервальными регистрами через тот же механизм временных таблиц.
  3. Для построения сложных отчетов по истории изменений лучше всего подходит использование СКД и методов модуля ЗарплатаКадрыСоставЗапросов.

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

← На главную