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