Почему документ «Отсутствие (болезнь, прогул, неявка)» не учитывается при расчете зарплаты в 1С:ЗУП 3.1?

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

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

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

Внутренний механизм ЗУП: скрытая табличная часть «Начисления»

Чтобы понять, почему программа «не видит» проведенное отсутствие, проанализируем техническое устройство документа Отсутствие (болезнь, прогул, неявка). В этом документе есть скрытая табличная часть под названием Начисления. Данная табличная часть не отображается на форме пользователю при обычной работе, но именно она является ключевым связующим звеном для расчетных механизмов программы.

Когда кадровик или расчетчик проводит документ отсутствия, специальный программный класс — Менеджер расчета — анализирует плановые начисления сотрудника и записывает в эту скрытую ТЧ соответствующие строки. Именно на основании записей в этой ТЧ при расчете зарплаты происходит автоматическое вытеснение оклада или тарифной ставки за дни невыхода. Если по какой-то причине ТЧ Начисления в документе отсутствия оказалась пустой, то для документа Начисление зарплаты и взносов этого отсутствия просто не существует, хотя в кадровых регистрах (и в табеле Т-13) оно зафиксировано.

Логическая коллизия: как пользователи сами ломают расчет

Рассмотрим подробнее реальный пример из практики, когда из-за последовательности действий пользователей скрытая ТЧ оказывается пустой. Проанализируем ситуацию совместной работы двух кадровиков:

  1. Кадровик А оформляет документ Отпуск без сохранения оплаты на сотрудника с 1 по 5 число текущего месяца. На этот момент система фиксирует, что все эти дни заняты неоплачиваемым отпуском.
  2. Позже выясняется новая информация: отпуск без сохранения оплаты фактически начнется только с 2 числа, а 1 числа сотрудник просто не вышел на работу без объяснения причин (прогул или неявка).
  3. Кадровик Б, еще не зная о том, что первый документ отпуска будет изменен, создает документ Отсутствие (болезнь, прогул, неявка) строго на 1 число.
  4. В момент проведения документа неявки программа запускает Менеджер расчета. Система видит, что на 1 число уже зарегистрирован документ с более высоким приоритетом — Отпуск без сохранения оплаты. Поскольку приоритет отпуска выше, менеджер расчета принимает решение, что фиксировать неявку в ТЧ Начисления не нужно. Документ проводится, но его скрытая ТЧ остается абсолютно пустой.
  5. После этого Кадровик А заходит в исходный документ отпуска за свой счет и исправляет дату начала на 2 число. Конфликт периодов визуально устранен.
  6. При формировании Табеля Т-13 программа динамически собирает кадровые данные и красиво рисует на 1 число код «НН» (поскольку на этот день теперь действует только документ неявки).
  7. Однако скрытая ТЧ в документе Отсутствие (болезнь, прогул, неявка) автоматически не перезаполнилась! Она так и осталась пустой.
  8. Расчетчик запускает расчет зарплаты — и сотрудник получает полную оплату оклада за 1 число, так как вытеснения не произошло.

Подобные коллизии возникают очень часто при изменении документов «задним числом», исправлении периодов или некорректной последовательности ввода кадровых сведений разными пользователями.

Влияние настроек прав доступа и ролей

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

В нормальном режиме кадровик вносит документ, и документ проводится только по кадровому контуру. Затем расчетчик должен открыть этот документ, проверить его и установить признак «Расчет утвердил». При установке этого флага и проведении документа расчетчиком как раз и отрабатывает заполнение ТЧ Начисления. Если же у кадровика есть избыточные права, флаг утверждения может взводиться автоматически, но при этом полноценный расчет ТЧ не происходит из-за отсутствия у кадровика доступа к тарифным ставкам или другим расчетным механизмам базы. Документ становится якобы «утвержденным», но пустые таблицы внутри него приводят к потере вытеснения при расчете оклада.

Программное решение проблемы (для разработчиков)

Если в вашей базе скопилось несколько десятков таких «дефектных» документов с пустыми скрытыми табличными частями, перевыбирать в каждом из них сотрудников вручную под полными правами крайне неэффективно. Напишем и разберем по шагам программный код, который можно оформить в виде внешней обработки для автоматического перезаполнения скрытых данных.

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

Ниже представлен рабочий пример кода для решения этой задачи:


// Создаем Менеджер расчета на основании данных проблемного документа отсутствия
МенеджерРасчета = РасчетЗарплатыРасширенный.СоздатьМенеджерРасчета(оДокумент.ПериодРегистрации, оДокумент.Организация);

// Указываем исключаемый регистратор, чтобы менеджер расчета не спотыкался о самого себя
МенеджерРасчета.ИсключаемыйРегистратор = оДокумент.Ссылка;
МенеджерРасчета.ИсправленныйДокумент = оДокумент.ИсправленныйДокумент;
МенеджерРасчета.ЭтоИсправлениеТекущимПериодом = ИсправлениеДокументовЗарплатаКадры.ЭтоИсправлениеТекущимПериодом(оДокумент, оДокумент.ИсправленныйДокумент, "ПериодРегистрации");

// Настраиваем параметры расчета
МенеджерРасчета.НастройкиРасчета.РассчитыватьНачисления = Истина;
МенеджерРасчета.НастройкиРасчета.СохранятьИсправления = Истина;

// Получаем структуру таблицы исходных данных для заполнения
ТаблицаНачислений = МенеджерРасчета.ТаблицаИсходныеДанныеНачисленияЗарплатыПоНачислениям();

// Добавляем строку с параметрами неявки сотрудника
НоваяСтрока = ТаблицаНачислений.Добавить();
НоваяСтрока.Сотрудник = оДокумент.Сотрудник;
НоваяСтрока.Начисление = оДокумент.ВидОтсутствия;
НоваяСтрока.ДатаНачала = оДокумент.ДатаНачала;
НоваяСтрока.ДатаОкончания = оДокумент.ДатаОкончания;

// Заполняем и рассчитываем данные с помощью методов конфигурации
МенеджерРасчета.ЗаполнитьНачисленияСотрудникаЗаПериод(оДокумент.Сотрудник, ТаблицаНачислений);
МенеджерРасчета.РассчитатьЗарплату();

// Переносим рассчитанные результаты из менеджера расчета обратно в документ
Для Каждого СтрокаМенеджер Из МенеджерРасчета.Зарплата Цикл
    Попытка
        оДокумент[СтрокаМенеджер.Ключ].Загрузить(СтрокаМенеджер.Значение);    
    Исключение
        // Исключение может возникнуть, если имя ключа не совпадает с ТЧ документа
    КонецПопытки;
EndЦикла;

// После успешного заполнения ТЧ документ необходимо записать и провести
оДокумент.Записать(РежимЗаписиДокумента.Проведение);

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

Рекомендации для предотвращения ошибки

Чтобы минимизировать появление пустых ТЧ в документах начислений в будущем, рекомендуем внедрить следующие организационные и технические меры:

← На главную