Как программно заполнить документ Доход в натуральной форме в 1С:ЗУП 3.1 из Excel

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

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

В этой статье мы подробно разберем, как реализовать программное заполнение этого документа, рассмотрим примеры кода для работы с Excel через ADO и выясним, какие реквизиты являются критически важными для корректной записи НДФЛ.

Разбор структуры документа Доход в натуральной форме

Перед тем как переходить к коду, проанализируем внутреннее устройство документа ДоходВНатуральнойФорме. В отличие от простых кадровых приказов, этот документ содержит несколько взаимосвязанных табличных частей (ТЧ):

  1. Начисления — здесь указываются сотрудники, виды вычетов и суммы самого дохода.
  2. НДФЛ — в этой таблице хранится расчет налога. Именно с ней чаще всего возникают проблемы: налог либо не отображается, либо «слетает» при попытке пересчета.
  3. Физические лица — вспомогательная таблица, которая используется системой для оптимизации запросов и корректного формирования аналитики.
  4. Удержания — если доход в натуральной форме влияет на базу исполнительных листов или профсоюзных взносов, данные должны попасть и сюда.

Рассмотрим по шагам, как правильно организовать процесс загрузки.

Шаг 1: Чтение данных из Excel

Для работы с файлами Excel часто используется COM-объект ADODB.Recordset. Это позволяет быстро считывать данные без необходимости установки полноценного пакета Microsoft Office на сервере (при наличии соответствующих драйверов). Разберем пример процедуры чтения:


&НаКлиенте
Процедура ПослеВыбораЛиста(ВыбранныйЭлемент, Об_Конект) Экспорт
    Если ВыбранныйЭлемент = Неопределено Тогда 
        Возврат; 
    КонецЕсли;
    
    СтрокаСписка = ВыбранныйЭлемент.Значение;
    ТекстЗапроса = "SELECT * FROM [" + СтрокаСписка + "]";
    
    Попытка
        RecordSet = Новый COMОбъект("ADODB.Recordset");
        RecordSet.CursorType = 3;
        RecordSet.Open(ТекстЗапроса, Об_Конект);
    Исключение
        Сообщить("Не удалось выполнить запрос к файлу Excel: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;

    Пока НЕ RecordSet.EOF Цикл
        // Здесь происходит логика обработки строк
        RecordSet.MoveNext();
    КонецЦикла;
    
    Об_Конект.Close();
КонецПроцедуры

Обратите внимание на параметр CursorType = 3 (Static cursor). Он позволяет использовать свойство RecordCount и свободно перемещаться по записям, что удобно для отладки процесса загрузки.

Шаг 2: Программное заполнение начислений

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


// Внутри цикла по записям Excel
Сотрудник = ПолучитьСотрудникаПоНаименованию(ФИОСотрудника);
Подразделение = ИнформацияОФизЛиц(Сотрудник); // Получаем основное подразделение сотрудника

СтрокаВР = ВладелецФормы.Объект.Начисления.Добавить();
СтрокаВР.Сотрудник = Сотрудник;
СтрокаВР.Результат = СуммаДоходаИзExcel;
СтрокаВР.Подразделение = Подразделение;
СтрокаВР.ДатаПолученияДохода = ВладелецФормы.Объект.ДатаПолученияДохода;

Шаг 3: Корректное заполнение таблицы НДФЛ

Это самый ответственный этап. Чтобы НДФЛ «прижился» в документе и не исчезал, необходимо заполнить не только сумму налога, но и ключевые разрезы аналитики. Выясним, почему налог может не отображаться: часто программисты забывают про поле КатегорияДохода и Подразделение в самой ТЧ НДФЛ.


СтрокаВРН = ВладелецФормы.Объект.НДФЛ.Добавить();
СтрокаВРН.ФизическоеЛицо = ПолучитьФизЛицоСотрудника(Сотрудник);
СтрокаВРН.Налог = НДФЛ_ИзExcel;
СтрокаВРН.Подразделение = Подразделение; // Обязательно!
СтрокаВРН.КатегорияДохода = Перечисления.КатегорииДоходовНДФЛ.НатуральныйДоход;
СтрокаВРН.МесяцНалоговогоПериода = ВладелецФормы.Объект.ДатаПолученияДохода;

Важный момент: в ЗУП 3.1 учет НДФЛ ведется в разрезе дат получения дохода. Если дата в строке НДФЛ не совпадает с ДатаПолученияДохода в шапке документа или в строке начисления, система при проведении может решить, что налог рассчитан неверно, и затереть его.

Шаг 4: Использование скрытых механизмов (Идентификатор строки)

Если вы посмотрите на документ через Универсальный отчет (как советовали участники форума), вы заметите поле ИдентификаторСтроки. Это уникальное числовое значение, которое связывает строку в ТЧ Начисления со строкой в ТЧ НДФЛ.

Когда мы добавляем строки программно через Добавить(), платформа генерирует идентификаторы. Однако, если мы хотим, чтобы связь была жесткой, рекомендуется:

  1. При добавлении строки в Начисления запомнить её ИдентификаторСтроки.
  2. Присвоить этот же идентификатор соответствующей строке в НДФЛ.

Хотя в простых случаях ЗУП справляется со связью по Физическому лицу, для корректной работы формы «Подробнее о расчете НДФЛ» синхронизация идентификаторов крайне желательна.

Шаг 5: Заполнение таблицы Физические лица

Проанализируем ситуацию, когда документ вроде бы заполнен, но отчеты по нему пустые. Проблема может крыться в пустой ТЧ Физические лица. Рассмотрим, как её заполнить:


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

Эта таблица должна содержать уникальный перечень всех физлиц, фигурирующих в документе. Без неё документ может не пройти валидацию в некоторых процедурах общего модуля ЗарплатаКадрыСоставОбъектов.

Шаг 6: Автоматизация расчета вместо ручного заполнения

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

После заполнения ТЧ Начисления, вызовите следующую процедуру (на стороне сервера):


// ОбъектДокумента - это наш Доход в натуральной форме
ДоходВНатуральнойФормеФормы.РассчитатьНалог(ОбъектДокумента);
ЗарплатаКадрыСоставОбъектов.Рассчитать(ОбъектДокумента);

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

Типичные ошибки при загрузке

Проанализируем основные причины, по которым данные могут «пропадать» или не проводиться:

Использование Универсального отчета (Администрирование -> Печатные формы, отчеты и обработки) — лучший способ проверить, какие именно поля заполняет система при ручном вводе. Создайте эталонный документ вручную, сохраните его и изучите все его таблицы через отчет. Это даст вам точный список реквизитов, которые нужно заполнить программно.

← На главную