Процесс автоматизации загрузки данных в 1С:Зарплата и управление персоналом 3.1 (ЗУП) часто сопряжен с трудностями, особенно когда речь идет о сложных документах, таких как Доход в натуральной форме. Основная сложность заключается в том, что данные в этом документе распределены по нескольким табличным частям, которые должны быть строго синхронизированы между собой. Если заполнить только начисления, но пропустить служебные поля в таблице НДФЛ, система может очистить налог при проведении или некорректно отобразить данные в отчетах.
В этой статье мы подробно разберем, как реализовать программное заполнение этого документа, рассмотрим примеры кода для работы с Excel через ADO и выясним, какие реквизиты являются критически важными для корректной записи НДФЛ.
Перед тем как переходить к коду, проанализируем внутреннее устройство документа ДоходВНатуральнойФорме. В отличие от простых кадровых приказов, этот документ содержит несколько взаимосвязанных табличных частей (ТЧ):
Рассмотрим по шагам, как правильно организовать процесс загрузки.
Для работы с файлами 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 и свободно перемещаться по записям, что удобно для отладки процесса загрузки.
При итерации по строкам файла Excel нам необходимо найти сотрудника в базе и добавить строку в табличную часть Начисления. Важным нюансом является то, что для документа требуется указать подразделение, даже если оно подтягивается автоматически при ручном вводе. Программная инициализация этого не делает.
// Внутри цикла по записям Excel
Сотрудник = ПолучитьСотрудникаПоНаименованию(ФИОСотрудника);
Подразделение = ИнформацияОФизЛиц(Сотрудник); // Получаем основное подразделение сотрудника
СтрокаВР = ВладелецФормы.Объект.Начисления.Добавить();
СтрокаВР.Сотрудник = Сотрудник;
СтрокаВР.Результат = СуммаДоходаИзExcel;
СтрокаВР.Подразделение = Подразделение;
СтрокаВР.ДатаПолученияДохода = ВладелецФормы.Объект.ДатаПолученияДохода;
Это самый ответственный этап. Чтобы НДФЛ «прижился» в документе и не исчезал, необходимо заполнить не только сумму налога, но и ключевые разрезы аналитики. Выясним, почему налог может не отображаться: часто программисты забывают про поле КатегорияДохода и Подразделение в самой ТЧ НДФЛ.
СтрокаВРН = ВладелецФормы.Объект.НДФЛ.Добавить();
СтрокаВРН.ФизическоеЛицо = ПолучитьФизЛицоСотрудника(Сотрудник);
СтрокаВРН.Налог = НДФЛ_ИзExcel;
СтрокаВРН.Подразделение = Подразделение; // Обязательно!
СтрокаВРН.КатегорияДохода = Перечисления.КатегорииДоходовНДФЛ.НатуральныйДоход;
СтрокаВРН.МесяцНалоговогоПериода = ВладелецФормы.Объект.ДатаПолученияДохода;
Важный момент: в ЗУП 3.1 учет НДФЛ ведется в разрезе дат получения дохода. Если дата в строке НДФЛ не совпадает с ДатаПолученияДохода в шапке документа или в строке начисления, система при проведении может решить, что налог рассчитан неверно, и затереть его.
Если вы посмотрите на документ через Универсальный отчет (как советовали участники форума), вы заметите поле ИдентификаторСтроки. Это уникальное числовое значение, которое связывает строку в ТЧ Начисления со строкой в ТЧ НДФЛ.
Когда мы добавляем строки программно через Добавить(), платформа генерирует идентификаторы. Однако, если мы хотим, чтобы связь была жесткой, рекомендуется:
Начисления запомнить её ИдентификаторСтроки.НДФЛ.Хотя в простых случаях ЗУП справляется со связью по Физическому лицу, для корректной работы формы «Подробнее о расчете НДФЛ» синхронизация идентификаторов крайне желательна.
Проанализируем ситуацию, когда документ вроде бы заполнен, но отчеты по нему пустые. Проблема может крыться в пустой ТЧ Физические лица. Рассмотрим, как её заполнить:
НоваяСтрокаФизЛицо = ВладелецФормы.Объект.ФизическиеЛица.Добавить();
НоваяСтрокаФизЛицо.ФизическоеЛицо = ФизЛицоСотрудника;
Эта таблица должна содержать уникальный перечень всех физлиц, фигурирующих в документе. Без неё документ может не пройти валидацию в некоторых процедурах общего модуля ЗарплатаКадрыСоставОбъектов.
Вместо того чтобы вручную переносить суммы НДФЛ и удержаний из Excel, что чревато ошибками округления и расхождениями с алгоритмами 1С, рассмотрим более изящный способ. Мы можем программно заполнить только начисления (доходы), а расчет налогов и удержаний доверить типовым механизмам конфигурации.
После заполнения ТЧ Начисления, вызовите следующую процедуру (на стороне сервера):
// ОбъектДокумента - это наш Доход в натуральной форме
ДоходВНатуральнойФормеФормы.РассчитатьНалог(ОбъектДокумента);
ЗарплатаКадрыСоставОбъектов.Рассчитать(ОбъектДокумента);
Метод РассчитатьНалог заполнит таблицу НДФЛ на основании введенных доходов, учитывая все вычеты и статус налогоплательщика. Метод Рассчитать из общего модуля произведет расчет прочих зависимых величин, например, удержаний по исполнительным листам, если в их базу входит данный вид дохода.
Проанализируем основные причины, по которым данные могут «пропадать» или не проводиться:
Дата получения дохода в документе относится к одному месяцу, а Месяц начисления в шапке — к другому.Натуральный доход. Если оставить поле пустым, 1С не поймет, как отразить это в 6-НДФЛ.Использование Универсального отчета (Администрирование -> Печатные формы, отчеты и обработки) — лучший способ проверить, какие именно поля заполняет система при ручном вводе. Создайте эталонный документ вручную, сохраните его и изучите все его таблицы через отчет. Это даст вам точный список реквизитов, которые нужно заполнить программно.