Приветствуем вас, коллеги! В этой статье мы подробно и по шагам разберем популярную проблему, с которой сталкиваются разработчики при автоматизации расчета заработной платы в программе 1С:Зарплата и управление персоналом 3.1. Задача звучит следующим образом: внешняя обработка заполнения загружает данные напрямую в табличную часть «Начисления» документа «Начисление зарплаты и взносов», однако при этом автоматически не рассчитываются НДФЛ и страховые взносы. Более того, при попытке интерактивного пересчета строки либо пропадают (особенно у уволенных сотрудников), либо перезаписываются плановыми начислениями.
Давайте подробно проанализируем внутреннее устройство механизмов расчета в 1С:ЗУП 3.1, выясним технические причины такого поведения системы и рассмотрим несколько эффективных вариантов решения проблемы — от программного вызова процедур расчета до изменения самой архитектуры интеграции.
Для начала разберем внутреннюю логику работы документа НачислениеЗарплаты. Когда пользователь заполняет документ интерактивно через кнопку «Заполнить», система выполняет сложный комплексный алгоритм:
Показатели.ИдентификаторСтроки.Если наша внешняя обработка просто добавляет строки напрямую в коллекцию Начисления, этот отлаженный механизм нарушается. Программа «не видит» связи между начислениями и показателями, у нее отсутствуют идентификаторы строк, а также нет признака ручной корректировки. В результате при попытке общего пересчета система считает ваши строки некорректными «фантомами» и либо затирает их плановыми окладами, либо полностью удаляет (так как у уволенных сотрудников плановые начисления уже прекращены).
Рассмотрим первый практический способ решения. Чтобы стандартный расчет НДФЛ и взносов отработал корректно по кнопкам на форме документа, мы должны принудительно связать загружаемые строки начислений со строками показателей. Давайте посмотрим на пример кода, который необходимо реализовать в модуле внешней обработки заполнения.
// Пример заполнения начислений со связыванием показателей
Для Каждого СтрокаДанных Из ТаблицаЗагрузки Цикл
// 1. Создаем уникальный идентификатор строки
ТекущийИдентификатор = ДокументОбъект.Начисления.Количество() + 1;
// 2. Добавляем строку в ТЧ "Начисления"
НоваяСтрокаНачисления = ДокументОбъект.Начисления.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрокаНачисления, СтрокаДанных);
НоваяСтрокаНачисления.ИдентификаторСтроки = ТекущийИдентификатор;
// Указываем программе, что строка введена вручную (фиксируем ее)
НоваяСтрокаНачисления.ФиксацияСтроки = Истина;
// 3. Обязательно добавляем связанную строку в скрытую ТЧ "Показатели"
НоваяСтрокаПоказателя = ДокументОбъект.Показатели.Добавить();
НоваяСтрокаПоказателя.ИдентификаторСтроки = ТекущийИдентификатор;
НоваяСтрокаПоказателя.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Результат");
НоваяСтрокаПоказателя.Значение = СтрокаДанных.Результат;
НоваяСтрокаПоказателя.Сотрудник = СтрокаДанных.Сотрудник;
КонецЦикла;
Благодаря установке флага ФиксацияСтроки (или аналогичных системных реквизитов ручного изменения в зависимости от конкретного релиза ЗУП) и связыванию по полю ИдентификаторСтроки, механизм пересчета больше не будет очищать загруженные строки для уволенных и действующих сотрудников. Нажатие кнопок пересчета НДФЛ и взносов на форме документа теперь приведет к корректному результату.
Если мы хотим, чтобы НДФЛ и взносы рассчитывались непосредственно в момент выполнения обработки, без необходимости интерактивного нажатия кнопок пользователем, нам потребуется программно запустить расчетный движок 1С:ЗУП. Для этого задействуем специальный объект конфигурации.
Проанализируем шаги реализации этого метода:
Давайте посмотрим на пример программного вызова расчета:
// Инициализируем менеджер расчета зарплаты
ПараметрыРасчета = РасчетЗарплатыРасширенный.ПодготовитьПараметрыРасчетаДляДокумента(ДокументОбъект);
ТаблицыРасчета = РасчетЗарплатыРасширенный.Рассчитать(ДокументОбъект.Ссылка, ПараметрыРасчета);
// Заполняем полученные таблицы НДФЛ и Взносов в документ
ДокументОбъект.НДФЛ.Загрузить(ТаблицыРасчета.НДФЛ);
ДокументОбъект.СтраховыеВзносы.Загрузить(ТаблицыРасчета.СтраховыеВзносы);
// Записываем документ с рассчитанными налогами
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Важный нюанс: Имена функций и состав параметров API расчета могут незначительно меняться от релиза к релизу ЗУП 3.1. Поэтому всегда сверяйтесь с кодом общего модуля РасчетЗарплатыРасширенный в вашей текущей конфигурации.
В современных версиях ЗУП 3.1 расчет выполняется в фоновом режиме на сервере, чтобы интерфейс пользователя не зависал при обработке больших объемов данных. Мы можем встроить вызов нашей заполняющей обработки непосредственно в логику формы документа.
Давайте разберем, как использовать штатные процедуры фонового расчета:
ЗаполнениеПослеВыполненияДлительнойОперации. Она отвечает за распределение результатов фонового расчета по вкладкам после завершения вычислений.РасчетЗарплатыРасширенныйКлиент.РассчитатьДокумент(ФормаДокумента). Это наиболее безопасный способ с точки зрения сохранения типовой логики обновлений программы.Давайте проанализируем ситуацию с точки зрения долгосрочной поддержки системы. Документ НачислениеЗарплаты является одним из самых сложных и часто изменяемых объектов при обновлениях 1С:ЗУП. Прямое вмешательство в его табличные части внешними обработками часто приводит к ошибкам при обновлении релизов.
Архитекторы 1С рекомендуют использовать более элегантный и надежный двухэтапный подход:
ДанныеДляРасчетаЗарплаты. Предварительно в программе настраивается соответствующий шаблон ввода данных (например, «Разовые начисления по итогам года»).Начисление зарплаты и взносов и нажимает кнопку «Заполнить». Программа автоматически подтягивает зарегистрированные данные из «Данных для расчета зарплаты», самостоятельно рассчитывает суммы по формулам и, самое главное, абсолютно корректно и без ошибок начисляет НДФЛ и страховые взносы по всем сотрудникам (включая уволенных).Этот подход гарантирует стабильную работу системы при любых последующих обновлениях конфигурации 1С:ЗУП и полностью исключает возникновение непредвиденных ошибок в учете по налогам.