Как рассчитать НДФЛ и взносы в 1С:ЗУП 3.1 при заполнении документа «Начисление зарплаты» внешней обработкой

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

Приветствуем вас, коллеги! В этой статье мы подробно и по шагам разберем популярную проблему, с которой сталкиваются разработчики при автоматизации расчета заработной платы в программе 1С:Зарплата и управление персоналом 3.1. Задача звучит следующим образом: внешняя обработка заполнения загружает данные напрямую в табличную часть «Начисления» документа «Начисление зарплаты и взносов», однако при этом автоматически не рассчитываются НДФЛ и страховые взносы. Более того, при попытке интерактивного пересчета строки либо пропадают (особенно у уволенных сотрудников), либо перезаписываются плановыми начислениями.

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

Выясняем причину: почему ломается стандартный расчет

Для начала разберем внутреннюю логику работы документа НачислениеЗарплаты. Когда пользователь заполняет документ интерактивно через кнопку «Заполнить», система выполняет сложный комплексный алгоритм:

  1. Определяется список актуальных сотрудников на основании кадровых данных.
  2. Считываются плановые начисления и показатели из регистров сведений.
  3. Заполняется скрытая для обычного пользователя табличная часть Показатели.
  4. Каждая строка начисления связывается со строкой показателей через уникальный числовой реквизит ИдентификаторСтроки.
  5. На основании полученной математической модели производится расчет результата, а затем — расчет НДФЛ и страховых взносов.

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

Вариант А. Связывание строк и заполнение табличной части «Показатели»

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


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

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

Вариант Б. Программный вызов «Менеджера расчета зарплаты»

Если мы хотим, чтобы НДФЛ и взносы рассчитывались непосредственно в момент выполнения обработки, без необходимости интерактивного нажатия кнопок пользователем, нам потребуется программно запустить расчетный движок 1С:ЗУП. Для этого задействуем специальный объект конфигурации.

Проанализируем шаги реализации этого метода:

  1. Подготавливаем заполненный объект документа со всеми необходимыми строками (включая показатели и идентификаторы строк, как описано в Варианте А).
  2. Вызываем специализированный менеджер расчета зарплаты через общие модули системы.
  3. Переносим рассчитанные таблицы НДФЛ и страховых взносов обратно в документ.

Давайте посмотрим на пример программного вызова расчета:


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

// Заполняем полученные таблицы НДФЛ и Взносов в документ
ДокументОбъект.НДФЛ.Загрузить(ТаблицыРасчета.НДФЛ);
ДокументОбъект.СтраховыеВзносы.Загрузить(ТаблицыРасчета.СтраховыеВзносы);

// Записываем документ с рассчитанными налогами
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

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

Вариант В. Использование механизмов длительных операций формы

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

Давайте разберем, как использовать штатные процедуры фонового расчета:

  1. В модуле формы документа найдем экспортную процедуру ЗаполнениеПослеВыполненияДлительнойОперации. Она отвечает за распределение результатов фонового расчета по вкладкам после завершения вычислений.
  2. В нашей внешней обработке после программного изменения начислений мы можем симулировать интерактивное изменение данных. Для этого вызывается оповещение формы об изменении реквизитов, что автоматически инициирует фоновый расчет силами платформы.
  3. Либо мы можем использовать клиентский вызов общего модуля форм расчета: РасчетЗарплатыРасширенныйКлиент.РассчитатьДокумент(ФормаДокумента). Это наиболее безопасный способ с точки зрения сохранения типовой логики обновлений программы.

Вариант Г. Рекомендуемый альтернативный подход (без программирования в самом документе)

Давайте проанализируем ситуацию с точки зрения долгосрочной поддержки системы. Документ НачислениеЗарплаты является одним из самых сложных и часто изменяемых объектов при обновлениях 1С:ЗУП. Прямое вмешательство в его табличные части внешними обработками часто приводит к ошибкам при обновлении релизов.

Архитекторы 1С рекомендуют использовать более элегантный и надежный двухэтапный подход:

  1. Загрузка во вспомогательный документ: Создаем внешнюю обработку, которая загружает все наши нестандартные начисления (включая данные по уволенным сотрудникам) в типовой документ ДанныеДляРасчетаЗарплаты. Предварительно в программе настраивается соответствующий шаблон ввода данных (например, «Разовые начисления по итогам года»).
  2. Типовой расчет: Пользователь создает стандартный документ Начисление зарплаты и взносов и нажимает кнопку «Заполнить». Программа автоматически подтягивает зарегистрированные данные из «Данных для расчета зарплаты», самостоятельно рассчитывает суммы по формулам и, самое главное, абсолютно корректно и без ошибок начисляет НДФЛ и страховые взносы по всем сотрудникам (включая уволенных).

Этот подход гарантирует стабильную работу системы при любых последующих обновлениях конфигурации 1С:ЗУП и полностью исключает возникновение непредвиденных ошибок в учете по налогам.

← На главную