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