Как правильно получить удержания сотрудников в запросе 1С:ЗУП 3.1 и связать их с физическими лицами

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

При разработке кастомных отчетов по заработной плате в программе «1С:Зарплата и управление персоналом 3.1» программисты часто сталкиваются с архитектурными особенностями хранения данных. Одна из типичных проблем — попытка связать данные по сотрудникам с регистрами удержаний, в которых вместо измерения Сотрудник используется измерение ФизическоеЛицо. Другая распространенная ошибка — использование регистров сведений плановых показателей вместо регистров фактических расчетов.

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

Разница между сущностями «Сотрудник» и «Физическое лицо» в ЗУП 3.1

Для начала проанализируем, почему разработчики фирмы «1С» разделили эти понятия на уровне метаданных и почему в регистрах удержаний используется именно физическое лицо:

  1. Физическое лицо (справочник ФизическиеЛица) — это конкретный человек, гражданин. Удержания (особенно исполнительные листы, алименты, штрафы) по закону накладываются на гражданина, а не на его трудовой договор. Если человек уволится и устроится заново или будет работать по внутреннему совместительству, исполнительный лист все равно должен охватывать все его доходы внутри компании.
  2. Сотрудник (справочник Сотрудники) — это элемент, обозначающий конкретный трудовой договор или рабочее место. У одного физического лица в рамках одной организации может быть несколько элементов в справочнике сотрудников (например, основное место работы и внутреннее совместительство).

Если нам необходимо связать таблицу, где фигурирует Сотрудник (например, графики работы или начисления), с таблицей удержаний, где указано только ФизическоеЛицо, мы можем легко сделать это через обращение к реквизиту. В языке запросов 1С поддерживается разыменование ссылок через точку.

Рассмотрим пример правильного левого соединения в запросе:


ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПлановыеУдержания КАК ПлановыеУдержания
    ПО ТаблицаРабДней.Сотрудник.ФизическоеЛицо = ПлановыеУдержания.ФизическоеЛицо

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

Почему нельзя брать суммы из регистра «Плановые удержания»

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

Таким образом, использовать ресурс Размер из регистра сведений ПлановыеУдержания для отчетов по фактически выплаченной зарплате категорически нельзя.

Где хранятся фактические суммы удержаний в ЗУП 3.1

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

Вариант 1. Регистр накопления «Начисления удержания по сотрудникам»

Это самый универсальный и рекомендуемый регистр для построения любых отчетов по взаиморасчетам. Именно на нем базируются такие типовые отчеты, как «Расчетный листок» и «Анализ начислений и удержаний». Его главное преимущество — наличие измерения Сотрудник, что исключает необходимость сложных соединений.

Посмотрим на пример запроса для получения фактических сумм удержаний из этого регистра:


ВЫБРАТЬ
    НачисленияУдержания.ПериодРегистрации КАК Месяц,
    НачисленияУдержания.Сотрудник КАК Сотрудник,
    СУММА(НачисленияУдержания.Результат) КАК СуммаУдержано
ИЗ
    РегистрНакопления.НачисленияУдержанияПоСотрудникам КАК НачисленияУдержания
ГДЕ
    НачисленияУдержания.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода
    И НачисленияУдержания.Сотрудник = &Сотрудник
    И НачисленияУдержания.ГруппаНачисленияУдержанияВыплаты = ЗНАЧЕНИЕ(Перечисление.ГруппыНачисленияУдержанияВыплаты.Удержания)
СГРУППИРОВАТЬ ПО
    НачисленияУдержания.ПериодРегистрации,
    НачисленияУдержания.Сотрудник

Важный нюанс: Обратите внимание на условие фильтрации ГруппаНачисленияУдержанияВыплаты = ЗНАЧЕНИЕ(Перечисление.ГруппыНачисленияУдержанияВыплаты.Удержания). Данный регистр содержит абсолютно все операции (начисления, выплаты, НДФЛ). Если не установить данный отбор, в итоговую сумму попадут лишние показатели. Фильтрация по этой группе позволяет отсечь начисленную зарплату, НДФЛ и выплаты через кассу/банк, оставив только чистые удержания (алименты, профсоюзы, добровольные взносы и т.д.).

Вариант 2. Регистр расчета «Удержания»

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

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


ВЫБРАТЬ
    ТаблицаУдержаний.ПериодРегистрации КАК Месяц,
    ТаблицаУдержаний.Сотрудник КАК Сотрудник,
    ТаблицаУдержаний.ВидРасчета КАК ВидУдержания,
    СУММА(ТаблицаУдержаний.Результат) КАК СуммаУдержано
ИЗ
    РегистрРасчета.Удержания КАК ТаблицаУдержаний
ГДЕ
    ТаблицаУдержаний.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода
    И ТаблицаУдержаний.Сотрудник = &Сотрудник
СГРУППИРОВАТЬ ПО
    ТаблицаУдержаний.ПериодРегистрации,
    ТаблицаУдержаний.Сотрудник,
    ТаблицаУдержаний.ВидРасчета

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

Отказ от жесткого кодирования удержаний в запросах

В исходном запросе разработчик использовал фильтрацию видов расчета по кодам:

ПлановыеУдержания.Удержание.Код В (&КодУдержанияИсп, &КодУдержанияВозн, &КодУдержанияТК)

Рассмотрим, почему это плохая практика программирования в 1С:

Как сделать правильно: У каждого предопределенного или созданного пользователем удержания в справочнике Удержания есть реквизит НазначениеУдержания (тип: Перечисление.НазначенияУдержаний). Гораздо надежнее и безопаснее делать отбор по этому реквизиту.

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


ГДЕ
    ТаблицаУдержаний.ВидРасчета.НазначениеУдержания = ЗНАЧЕНИЕ(Перечисление.НазначенияУдержаний.ИсполнительныйЛист)

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

Резюме и рекомендации

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

  1. Никогда не используйте регистры сведений плановых удержаний (ПлановыеУдержания) для получения итоговых сумм удержанного дохода.
  2. Для получения фактических сумм используйте регистр накопления НачисленияУдержанияПоСотрудникам с обязательным отбором по группе Удержания, либо регистр расчета Удержания.
  3. Если вам все же необходимо соединить таблицу сотрудников с таблицей физических лиц, используйте разыменование ссылки через точку: Сотрудник.ФизическоеЛицо.
  4. Избегайте жесткого кодирования (фильтрации по кодам или наименованиям видов расчета). Используйте реквизит НазначениеУдержания.
← На главную