При выгрузке ведомостей на выплату заработной платы в банк через электронный документооборот пользователи и разработчики 1С часто сталкиваются с ситуацией, когда банк отклоняет сформированный XML-файл из-за несоответствия формата, отсутствия обязательных тегов или наличия лишних полей. Рассмотрим причины возникновения таких ошибок, архитектуру формирования XML-файлов обмена и способы приведения структуры выгрузки к требованиям Сбербанка.
Проанализируем, как устроен процесс выгрузки данных по зарплатным проектам. Формирование пакета документов начинается с процедуры сбора данных шапки и строк ведомостей, после чего вызываются специализированные методы подсистемы обмена с банками.
В конфигурации за эту функциональность отвечают общие модули ОбменСБанкамиПоЗарплатнымПроектам и ОбменСБанкамиПоЗарплатнымПроектамПереопределяемый. Основная процедура запускает сбор данных и передает управление генератору файлов:
Процедура ВыгрузитьФайлыДляОбменаСБанком(МассивДокументов, МассивОписанийФайлов, ПлатежныйДокумент = Неопределено) Экспорт
Отказ = Ложь;
// Проверка проведения документов и корректности зарплатных проектов
// ...
ВидОперации = "ВедомостьНаВыплатуЗарплатыВБанк";
ДатаПолученияДанных = ТекущаяДатаСеанса;
СтруктураПараметровДляФормированияФайла = Новый Структура;
СтруктураПараметровДляФормированияФайла.Вставить("ВидОперации", ВидОперации);
СтруктураПараметровДляФормированияФайла.Вставить("ДанныеШапки", ДанныеШапкиДокументовДляПолученияТекстаФайла(МассивДокументов, ДатаПолученияДанных, ПлатежныйДокумент));
СтруктураПараметровДляФормированияФайла.Вставить("ДанныеСтрок", ДанныеСтрокДокументовДляПолученияТекстаФайла(МассивДокументов, ДатаПолученияДанных, ПлатежныйДокумент));
СтруктураПараметровДляФормированияФайла.Вставить("КорневыеСвойства", ОбменСБанкамиПоЗарплатнымПроектам.КорневыеСвойства(ВидОперации));
СтруктураПараметровДляФормированияФайла.Вставить("СоответствиеПолейФайла", ОбменСБанкамиПоЗарплатнымПроектам.СоответствиеПолейФайла(ВидОперации));
СтруктураПараметровДляФормированияФайла.Вставить("ОбязательныеПоляФайла", ОбменСБанкамиПоЗарплатнымПроектам.ОбязательныеПоляФайла(ВидОперации));
СтруктураПараметровДляФормированияФайла.Вставить("СоответствиеПреобразованияЗначений", ОбменСБанкамиПоЗарплатнымПроектам.СоответствиеПреобразованияЗначений(ВидОперации));
СтруктураПараметровДляФормированияФайла.Вставить("СоответствиеТипов", ОбменСБанкамиПоЗарплатнымПроектам.СоответствиеТипов(ВидОперации));
СтруктураПараметровДляФормированияФайла.Вставить("ПлатежныйДокумент", ПлатежныйДокумент);
ОбменСБанкамиПоЗарплатнымПроектам.СоздатьФайлыДляОбменаСБанком(МассивДокументов, МассивОписанийФайлов, СтруктураПараметровДляФормированияФайла);
КонецПроцедуры
Структура и состав тегов выгружаемого XML-файла определяются специальной картой соответствия полей, которая формируется в функции СоответствиеПолейФайла.
Прежде чем переходить к доработке программного кода, проверим настройки в пользовательском интерфейсе. В большинстве случаев несовпадение формата вызвано тем, что в карточке зарплатного проекта выбран стандарт, не поддерживаемый конкретным отделением банка или устаревший для используемой версии клиент-банка.
Разберем порядок настройки по шагам:
Если банковская система требует индивидуальный состав узлов (например, запрещает передачу тегов НомерРеестра или ДатаРеестра в шапке документа), скорректируем таблицу сопоставления полей.
Посмотрим на структуру функции СоответствиеПолейФайла:
Функция СоответствиеПолейФайла(ВидОперации, ФорматФайла = Неопределено) Экспорт
СоответствиеПолей = Новый Соответствие;
Если ВидОперации = "ВедомостьНаВыплатуЗарплатыВБанк" Тогда
СоответствиеПолей.Вставить("ДатаФормирования", "ДатаФормирования");
СоответствиеПолей.Вставить("НомерДоговора", "НомерДоговора");
СоответствиеПолей.Вставить("НаименованиеОрганизации", "ПолноеНаименованиеОрганизации");
СоответствиеПолей.Вставить("ИНН", "ИННОрганизации");
СоответствиеПолей.Вставить("РасчетныйСчетОрганизации", "НомерРасчетногоСчетаОрганизации");
СоответствиеПолей.Вставить("БИК", "БИКБанка");
СоответствиеПолей.Вставить("ИдПервичногоДокумента", "ИдПервичногоДокумента");
// При необходимости исключаем неиспользуемые банком поля:
// СоответствиеПолей.Вставить("НомерРеестра", "НомерДокумента");
// СоответствиеПолей.Вставить("ДатаРеестра", "ДатаДокумента");
СоответствиеЗачислениеЗарплаты = Новый Соответствие;
СоответствиеЗачислениеЗарплаты.Вставить("Нпп", "НомерСтроки");
СоответствиеЗачислениеЗарплаты.Вставить("Фамилия", "Фамилия");
СоответствиеЗачислениеЗарплаты.Вставить("Имя", "Имя");
СоответствиеЗачислениеЗарплаты.Вставить("Отчество", "Отчество");
СоответствиеЗачислениеЗарплаты.Вставить("ОтделениеБанка", "ОтделениеБанка");
СоответствиеЗачислениеЗарплаты.Вставить("ФилиалОтделенияБанка", "ФилиалОтделенияБанка");
СоответствиеЗачислениеЗарплаты.Вставить("ЛицевойСчет", "НомерЛицевогоСчета");
СоответствиеЗачислениеЗарплаты.Вставить("Сумма", "СуммаКВыплате");
СоответствиеПолей.Вставить("ЗачислениеЗарплаты", СоответствиеЗачислениеЗарплаты);
СоответствиеПолей.Вставить("ВидЗачисления", "ВидЗачисления");
СоответствиеПолей.Вставить("ПлатежноеПоручение", "НомерПлатежногоПоручения");
СоответствиеПолей.Вставить("ДатаПлатежногоПоручения", "ДатаПлатежногоПоручения");
СоответствиеКонтрольныеСуммы = Новый Соответствие;
СоответствиеКонтрольныеСуммы.Вставить("КоличествоЗаписей", "КоличествоЗаписей");
СоответствиеКонтрольныеСуммы.Вставить("СуммаИтого", "СуммаИтого");
СоответствиеПолей.Вставить("КонтрольныеСуммы", СоответствиеКонтрольныеСуммы);
КонецЕсли;
// Переопределение через модуль расширения
ОбменСБанкамиПоЗарплатнымПроектамПереопределяемый.ОпределитьСоответствиеПолейФайла(СоответствиеПолей, ВидОперации, ФорматФайла);
Возврат СоответствиеПолей;
КонецФункции
Важная рекомендация: во избежание проблем при последующих обновлениях типовой конфигурации не следует изменять типовой общий модуль напрямую. Корректировку соответствия полей рекомендуется выполнять в процедуре ОпределитьСоответствиеПолейФайла общего модуля ОбменСБанкамиПоЗарплатнымПроектамПереопределяемый либо через механизм расширений конфигурации с использованием аннотации &После или &Вместо.
Если требования банка существенно отличаются от стандарта 1С (например, требуется нестандартная структура контрольных сумм или кодировка), оптимальным решением является создание внешней обработки.
Разберем преимущества этого подхода:
Выясним основные причины, по которым банк может отклонять корректно выгруженный XML-документ:
windows-1251 с корректным XML-прологом без лишней сигнатуры BOM.