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