При интеграции 1С с банковскими сервисами — будь то прямой обмен через 1С:ДиректБанк или классическая загрузка файлов выгрузки — пользователи и разработчики часто сталкиваются с аппаратным сбоем на этапе разбора данных. Система аварийно завершает работу, выдавая диагностическое сообщение: «Ошибка проверки данных XDTO: Структура объекта не соответствует типу: {urn:1C.ru:ClientBankExchange}ПлатежныйДокумент».
В этой статье мы подробно проанализируем, почему возникает данная проблема, при чем здесь изменения в законодательстве РФ, и рассмотрим четыре практических способа устранения этой ошибки.
---
Для того чтобы понять природу сбоя, обратимся к технологическому стеку платформы. Чтение XML-файлов выписок производится через специальный механизм — фабрику XDTO. В конфигурации 1С заложена строгая схема метаданных (XDTO-пакет ClientBankExchange), которая описывает структуру всех возможных XML-элементов, их типы и обязательность заполнения.
Если в процессе разбора файла метод ФабрикаXDTO.ПрочитатьXML() встречает тег, который отсутствует в схеме XDTO текущей конфигурации, платформа считает структуру документа нарушенной и генерирует исключение.
Законодательный контекст проблемы:
С 1 июня 2020 года вступили в силу изменения в Федеральном законе № 229-ФЗ «Об исполнительном производстве». Банки обязали указывать в платежных поручениях (в поле 20 «Наз. пл.») специальный код вида дохода (для разделения заработной платы, социальных выплат и прочих начислений). В связи с этим фирма «1С» совместно с банками обновила стандарт обмена «Клиент-Банк» до версии 1.03.
В обновленный формат обмена были добавлены новые реквизиты:
КодНазПлатежа — код назначения платежа (поле 20).КодВыплат — код выплат (для идентификации бюджетных средств).Если ваша конфигурация (например, старый релиз 1С:ERP или 1С:Комплексная автоматизация) не обновлялась с тех пор, то в ее XDTO-пакете ClientBankExchange этих свойств просто нет. Банк, отправляя современный XML-файл выписки, включает туда тег <КодНазПлатежа>, и система 1С натыкается на него как на «неизвестный» элемент схемы.
---
Самым правильным и долгосрочным решением является своевременное обновление вашей информационной базы до актуального релиза. Фирма «1С» оперативно реагирует на изменения законодательства и вносит все необходимые правки в XDTO-пакеты типовых библиотек (БСП и Библиотеки интеграции с банками).
Если ваша конфигурация находится на типовой поддержке и не имеет критических доработок, препятствующих обновлению, выполните переход на актуальную версию через сервис 1С:Обновление программ.
---
Если оперативно обновить конфигурацию невозможно (например, база сильно кастомизирована, а бизнес-процессы не позволяют останавливать работу пользователей), мы можем самостоятельно доработать XDTO-пакет. Проанализируем, как это сделать по шагам:
ClientBankExchange (пространство имен urn:1C.ru:ClientBankExchange) и откройте его двойным кликом.ПлатежныйДокумент.КодНазПлатежаstring (http://www.w3.org/2001/XMLSchema)0 (Это критически важно! Если оставить значение по умолчанию равным 1, система будет требовать этот тег во всех старых файлах, что приведет к новым ошибкам).1КодВыплат с типом string и минимальным количеством 0, так как банки могут начать передавать и его.---
Чтобы не вносить изменения непосредственно в основную конфигурацию и сохранить ее на полной поддержке («на замочке»), рассмотрим более элегантный способ — использование расширений.
Разберем последовательность действий:
ИсправлениеОбменаСБанком).ClientBankExchange, нажмите по нему правой кнопкой мыши и выберите команду Добавить в расширение.КодНазПлатежа и КодВыплат со строковым типом данных в структуру типа ПлатежныйДокумент.---
Бывают ситуации, когда изменять метаданные (даже через расширение) запрещено политикой безопасности компании. В таком случае мы можем применить программный «обходной путь» — перехватить входящий поток данных непосредственно перед передачей в метод чтения XDTO и удалить из него новые проблемные теги.
Проанализируем пример кода, который можно внедрить в общий модуль, где происходит загрузка данных из банка. Мы прочитаем XML как обычный текст, удалим из него теги <КодНазПлатежа> и вернем очищенную строку обратно в поток для корректного разбора:
Функция ОчиститьXMLВыпискиОтНовыхТегов(ДанныеФайлаСтрока) Экспорт
РезультатСтрока = ДанныеФайлаСтрока;
// Удаляем тег КодНазПлатежа вместе с его содержимым
ПозицияНачала = Найти(РезультатСтрока, "<КодНазПлатежа>");
Пока ПозицияНачала > 0 Цикл
ПозицияКонца = Найти(РезультатСтрока, "</КодНазПлатежа>");
Если ПозицияКонца > 0 Тогда
ДлинаЗакрывающегоТега = СтрДлина("</КодНазПлатежа>");
РезультатСтрока = Лев(РезультатСтрока, ПозицияНачала - 1)
+ Сред(РезультатСтрока, ПозицияКонца + ДлинаЗакрывающегоТега);
Иначе
Прервать;
КонецЕсли;
ПозицияНачала = Найти(РезультатСтрока, "<КодНазПлатежа>");
КонецЦикла;
// Аналогично вырезаем тег КодВыплат
ПозицияНачала = Найти(РезультатСтрока, "<КодВыплат>");
Пока ПозицияНачала > 0 Цикл
ПозицияКонца = Найти(РезультатСтрока, "</КодВыплат>");
Если ПозицияКонца > 0 Тогда
ДлинаЗакрывающегоТега = СтрДлина("</КодВыплат>");
РезультатСтрока = Лев(РезультатСтрока, ПозицияНачала - 1)
+ Сред(РезультатСтрока, ПозицияКонца + ДлинаЗакрывающегоТега);
Иначе
Прервать;
КонецЕсли;
ПозицияНачала = Найти(РезультатСтрока, "<КодВыплат>");
КонецЦикла;
Возврат РезультатСтрока;
КонецФункции
Этот код преобразует исходную строку XML, аккуратно вырезая из нее неподдерживаемые свойства. После такой обработки метод ФабрикаXDTO.ПрочитатьXML() успешно отработает без ошибок, так как структура документа полностью совпадет с ожидаемой старой схемой.