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