Как программно изменить отработанные часы и результат расчета в 1С:ЗУП 8?

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

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

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

Особенности механизмов расчета времени и зарплаты

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

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

  1. Изменения сбросятся при первом же автоматическом пересчете документа.
  2. Данные в регистрах учета рабочего времени останутся прежними, что приведет к ошибкам при последующем расчете среднего заработка для отпускных и больничных листов.
  3. Связанные таблицы расчета НДФЛ, страховых взносов и удержаний не обновятся автоматически.

Способ 1. Использование пользовательского показателя расчета

Наиболее правильный и безопасный с точки зрения архитектуры подход — изменить формулу начисления, вынеся отработанное время или корректирующий коэффициент в отдельный показатель расчета зарплаты.

Для реализации этого варианта выполним следующие шаги:

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

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

Способ 2. Корректировка через первичные документы учета времени

Если задача заключается именно в изменении отработанного времени сотрудника, рекомендуется не вмешиваться в алгоритмы расчетного менеджера, а сформировать программно первичные учетные документы:

  1. Программно создаем и проводим документ Индивидуальный график или Табель учета рабочего времени на нужный период.
  2. Записываем в документ требуемые часы и виды времени (например, Явка, Ночные и т.д.).
  3. При стандартном заполнении или подборе сотрудников в документ Начисление зарплаты и взносов программа автоматически считает данные из регистра Данные об отработанном времени и рассчитает правильный результат без дополнительных доработок кода документа.

Способ 3. Програмное заполнение табличных частей и запуск расчета

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

Разберем примерный алгоритм взаимодействия со служебными механизмами:

  1. Заполняем состав сотрудников, используя типовую процедуру подбора. Это необходимо для корректного формирования всех служебных реквизитов и ключей строк.
  2. Заполняем табличную часть Показатели нужными значениями для каждого сотрудника и вида расчета.
  3. Вызываем встроенную процедуру пересчета документа.

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


// Пример заполнения показателей и вызова пересчета в контексте формы документа
&НаКлиенте
Процедура ЗаполнитьИРассчитатьДокумент()
    
    // 1. Программно заполняем показатели в табличной части "Показатели"
    Для Каждого СтрПоказатель Из Объект.Показатели Цикл
        Если СтрПоказатель.ИмяПоказателя = "ОтработаноЧасов" Тогда
            СтрПоказатель.Значение = ПолучитьСкорректированныеЧасы(СтрПоказатель.Сотрудник);
        КонецЕсли;
    КонецЦикла;
    
    // 2. Вызываем служебный пересчет документа или конкретных сотрудников
    // В зависимости от версии конфигурации вызываются методы формы или модулей
    РассчитатьДокументНаСервере();
    
КонецПроцедуры

На стороне сервера для выполнения полного расчета используется обработка МенеджерРасчетаЗарплаты. Проанализируем ее работу: она принимает объект документа или структуру параметров, рассчитывает математику формул с учетом времени и заполняет закладки Начисления, НДФЛ, Взносы и Удержания.

Способ 4. Перехват сбора данных через расширение конфигурации

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

Проанализируем порядок действий при таком подходе:

  1. В расширении подключаем аннотацию &Вместо или &После к процедуре сбора таблиц показателей и времени для расчетного менеджера.
  2. В моменте, когда программа уже собрала исходные данные из регистров, но еще не передала их в математический вычислитель, модифицируем значения часов в полученной таблице значений.
  3. Передаем скорректированную таблицу далее в стандартный алгоритм расчета.

В результате процедура расчета отработает штатно, сформирует верные суммы начислений, НДФЛ и взносов, а исходный код конфигурации останется без изменений.

← На главную