Как настроить и исправить выгрузку реестра на зачисление зарплаты в формате Сбербанк XML в 1С?

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

При выгрузке ведомостей на выплату заработной платы в банк через электронный документооборот пользователи и разработчики 1С часто сталкиваются с ситуацией, когда банк отклоняет сформированный XML-файл из-за несоответствия формата, отсутствия обязательных тегов или наличия лишних полей. Рассмотрим причины возникновения таких ошибок, архитектуру формирования XML-файлов обмена и способы приведения структуры выгрузки к требованиям Сбербанка.

Анализ механизма формирования XML-реестра в типовых конфигурациях

Проанализируем, как устроен процесс выгрузки данных по зарплатным проектам. Формирование пакета документов начинается с процедуры сбора данных шапки и строк ведомостей, после чего вызываются специализированные методы подсистемы обмена с банками.

В конфигурации за эту функциональность отвечают общие модули ОбменСБанкамиПоЗарплатнымПроектам и ОбменСБанкамиПоЗарплатнымПроектамПереопределяемый. Основная процедура запускает сбор данных и передает управление генератору файлов:


Процедура ВыгрузитьФайлыДляОбменаСБанком(МассивДокументов, МассивОписанийФайлов, ПлатежныйДокумент = Неопределено) Экспорт
    Отказ = Ложь;
    
    // Проверка проведения документов и корректности зарплатных проектов
    // ...
    
    ВидОперации = "ВедомостьНаВыплатуЗарплатыВБанк";
    ДатаПолученияДанных = ТекущаяДатаСеанса;
    
    СтруктураПараметровДляФормированияФайла = Новый Структура;
    СтруктураПараметровДляФормированияФайла.Вставить("ВидОперации", ВидОперации);
    СтруктураПараметровДляФормированияФайла.Вставить("ДанныеШапки", ДанныеШапкиДокументовДляПолученияТекстаФайла(МассивДокументов, ДатаПолученияДанных, ПлатежныйДокумент));
    СтруктураПараметровДляФормированияФайла.Вставить("ДанныеСтрок", ДанныеСтрокДокументовДляПолученияТекстаФайла(МассивДокументов, ДатаПолученияДанных, ПлатежныйДокумент));
    СтруктураПараметровДляФормированияФайла.Вставить("КорневыеСвойства", ОбменСБанкамиПоЗарплатнымПроектам.КорневыеСвойства(ВидОперации));
    СтруктураПараметровДляФормированияФайла.Вставить("СоответствиеПолейФайла", ОбменСБанкамиПоЗарплатнымПроектам.СоответствиеПолейФайла(ВидОперации));
    СтруктураПараметровДляФормированияФайла.Вставить("ОбязательныеПоляФайла", ОбменСБанкамиПоЗарплатнымПроектам.ОбязательныеПоляФайла(ВидОперации));
    СтруктураПараметровДляФормированияФайла.Вставить("СоответствиеПреобразованияЗначений", ОбменСБанкамиПоЗарплатнымПроектам.СоответствиеПреобразованияЗначений(ВидОперации));
    СтруктураПараметровДляФормированияФайла.Вставить("СоответствиеТипов", ОбменСБанкамиПоЗарплатнымПроектам.СоответствиеТипов(ВидОперации));
    СтруктураПараметровДляФормированияФайла.Вставить("ПлатежныйДокумент", ПлатежныйДокумент);
    
    ОбменСБанкамиПоЗарплатнымПроектам.СоздатьФайлыДляОбменаСБанком(МассивДокументов, МассивОписанийФайлов, СтруктураПараметровДляФормированияФайла);
КонецПроцедуры

Структура и состав тегов выгружаемого XML-файла определяются специальной картой соответствия полей, которая формируется в функции СоответствиеПолейФайла.

Способ 1. Выбор стандарта обмена в пользовательском режиме

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

Разберем порядок настройки по шагам:

  1. Перейдем в раздел Справочники и откроем справочник Зарплатные проекты.
  2. Откроем элемент зарплатного проекта, по которому выполняется выгрузка.
  3. Найдем реквизит Формат файла (или вариант стандарта электронного обмена информацией с банком).
  4. Выберем требуемый формат (например, Стандарт ЭОИ с банком (версия 1) или соответствующую версию стандарта 3.x в зависимости от требований банка).
  5. Сохраним изменения и повторно сформируем файл выгрузки из ведомости.

Способ 2. Программная корректировка структуры тегов XML

Если банковская система требует индивидуальный состав узлов (например, запрещает передачу тегов НомерРеестра или ДатаРеестра в шапке документа), скорректируем таблицу сопоставления полей.

Посмотрим на структуру функции СоответствиеПолейФайла:


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

Важная рекомендация: во избежание проблем при последующих обновлениях типовой конфигурации не следует изменять типовой общий модуль напрямую. Корректировку соответствия полей рекомендуется выполнять в процедуре ОпределитьСоответствиеПолейФайла общего модуля ОбменСБанкамиПоЗарплатнымПроектамПереопределяемый либо через механизм расширений конфигурации с использованием аннотации &После или &Вместо.

Способ 3. Использование внешней обработки выгрузки

Если требования банка существенно отличаются от стандарта 1С (например, требуется нестандартная структура контрольных сумм или кодировка), оптимальным решением является создание внешней обработки.

Разберем преимущества этого подхода:

  1. Конфигурация 1С остается на полной поддержке без снятия с замка.
  2. Обработка подключается через раздел Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки.
  3. Алгоритм генерации XML можно оперативно обновлять под меняющиеся требования банковских протоколов без монопольного доступа к базе данных.

Контрольные точки проверки сформированного XML-файла

Выясним основные причины, по которым банк может отклонять корректно выгруженный XML-документ:

  1. Длина расчетных и лицевых счетов: номер счета сотрудника и расчетный счет организации должны содержать строго 20 цифровых знаков.
  2. Кодировка файла: файл реестра должен сохраняться в кодировке windows-1251 с корректным XML-прологом без лишней сигнатуры BOM.
  3. Коды отделений и филиалов: если в договоре указаны четырехзначные коды подразделений Сбербанка, убедимся, что они не обрезаются до числового типа с потерей лидирующих нулей.
  4. Соответствие реквизитов зарплатного проекта: номер и дата договора в 1С должны в точности совпадать с данными договора, зарегистрированного в банковской системе.
← На главную