В типовых конфигурациях, таких как 1С:ERP 2.2 (и более новых версиях), алгоритм расчета НДФЛ жестко зашит в программный код общих модулей. Это обусловлено сложностью учета: налог рассчитывается нарастающим итогом с начала года, учитываются вычеты, статусы налогоплательщиков и различные виды доходов. Однако при адаптации программы под международные требования (например, законодательство Азербайджана) часто возникает необходимость заменить стандартную логику на простую формулу, например: Налог = (Оклад - НеоблагаемыйМинимум) * Ставка.
В рамках этой статьи мы разберем, как программно вмешаться в процесс расчета, какие модули за это отвечают и как правильно реализовать обход табличных частей документа НачислениеЗарплаты для корректного пересчета налогов.
Для начала проанализируем, где именно происходит расчет. Зарплатный блок в ERP 2.2 идентичен конфигурации ЗУП 3.1. Весь расчет сосредоточен не в модуле формы документа, а в специализированных серверных модулях. Основные процедуры по налогам следует искать в:
Важно понимать, что простое изменение цифр в коде этих модулей может "сломать" обновления конфигурации. Поэтому правильнее всего использовать Расширения и механизм &После или &Вместо для перехвата процедур расчета.
Рассмотрим ситуацию, когда необходимо реализовать кнопку на форме документа, которая будет пересчитывать НДФЛ по заданной формуле (например, 14% с превышения 173 манат). Рассмотрим типичную ошибку начинающих разработчиков и правильный вариант реализации.
Ошибка в реализации цикла: часто программисты пытаются привязаться к "текущим данным" формы, из-за чего налог для всех сотрудников рассчитывается на основе данных только одной (выделенной) строки.
Правильный подход: нам необходимо сопоставить строки из табличной части Начисления со строками в табличной части НДФЛ по ключевому полю (обычно это Сотрудник или Физлицо). Проанализируем пример кода для реализации такой логики:
&НаСервере
Процедура ПересчитатьНДФЛНаСервере()
// Создаем таблицу для накопления итогов по начислениям сотрудников
ТаблицаНачислений = Объект.Начисления.Выгрузить();
ТаблицаНачислений.Свернуть("Сотрудник", "Результат");
// Обходим табличную часть НДФЛ
Для Каждого СтрокаНДФЛ Из Объект.НДФЛ Цикл
// Ищем суммарный доход сотрудника в накопленной таблице
ПараметрыПоиска = Новый Структура("Сотрудник", СтрокаНДФЛ.Сотрудник);
НайденныеСтроки = ТаблицаНачислений.НайтиСтроки(ПараметрыПоиска);
Если НайденныеСтроки.Количество() > 0 Тогда
ДоходСотрудника = НайденныеСтроки[0].Результат;
// Применяем формулу: (Доход - 173) * 14%
// Внимание: 173 - это пример необлагаемого минимума
Если ДоходСотрудника > 173 Тогда
СтрокаНДФЛ.Налог = (ДоходСотрудника - 173) * 0.14;
Иначе
СтрокаНДФЛ.Налог = 0;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Обновляем общие итоги в подвале документа
Объект.Удержано = Объект.НДФЛ.Итог("Налог");
КонецПроцедуры
Рассмотрим более надежный способ, который позволит системе автоматически использовать вашу формулу при типовом расчете. Мы выяснили, что за заполнение данных отвечает менеджер расчета. Для внесения правок выполним следующие шаги:
РасчетНДФЛ процедуру, отвечающую за финальное вычисление суммы налога (например, РассчитатьНДФЛ).&После.Такой подход гарантирует, что данные будут корректно попадать не только в документ, но и в регистры накопления (например, РасчетыНалогоплательщиковСБюджетомПоНДФЛ), что критично для формирования ведомостей на выплату зарплаты.
Часто вместе с НДФЛ требуется изменить расчет страховых взносов. В ERP 2.2 на вкладке "Взносы" колонки (такие как ТФОМС, ФФОМС и др.) могут быть скрыты программно в зависимости от настроек учетной политики. Проанализируем, как сделать их видимыми:
Для активации колонок перейдите в НСИ и администрирование -> Организации -> Учетная политика. Там необходимо убедиться, что выбран соответствующий вид тарифа страховых взносов. Если типовые тарифы не подходят, можно программно включить видимость через форму документа:
// В процедуре ПриСозданииНаСервере или через ИзменитьФорму
Элементы.ВзносыТФОМС.Видимость = Истина;
Элементы.ВзносыТФОМС.Доступность = Истина;
Однако помните, что просто включить видимость недостаточно — нужно также прописать алгоритм заполнения этих полей в модуле УчетСтраховыхВзносов, аналогично тому, как мы рассматривали для НДФЛ.
При написании собственного кода для пересчета налога всегда учитывайте следующие моменты:
НДФЛ (например, по разным подразделениям или категориям дохода). Всегда суммируйте налог корректно.Налог в конфигурации или расширении позволяет хранить дробную часть (Число 15, 2).Объект.Удержано), в Ведомость на выплату попадет неверная сумма "К выплате". Сумма к выплате рассчитывается как Начисления - Удержания - Налоги.Таким образом, для качественного изменения формулы НДФЛ в 1С:ERP 2.2 лучше всего использовать комбинацию расширения существующих механизмов расчета и тщательного тестирования на сложных случаях (отпуска, больничные, перерасчеты за прошлые периоды).