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