Как исправить ошибку XDTO «Структура объекта не соответствует типу: ПлатежныйДокумент» при загрузке выписки в 1С?

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

При интеграции 1С с банковскими сервисами — будь то прямой обмен через 1С:ДиректБанк или классическая загрузка файлов выгрузки — пользователи и разработчики часто сталкиваются с аппаратным сбоем на этапе разбора данных. Система аварийно завершает работу, выдавая диагностическое сообщение: «Ошибка проверки данных XDTO: Структура объекта не соответствует типу: {urn:1C.ru:ClientBankExchange}ПлатежныйДокумент».

В этой статье мы подробно проанализируем, почему возникает данная проблема, при чем здесь изменения в законодательстве РФ, и рассмотрим четыре практических способа устранения этой ошибки.

---

Выясняем причину возникновения ошибки

Для того чтобы понять природу сбоя, обратимся к технологическому стеку платформы. Чтение XML-файлов выписок производится через специальный механизм — фабрику XDTO. В конфигурации 1С заложена строгая схема метаданных (XDTO-пакет ClientBankExchange), которая описывает структуру всех возможных XML-элементов, их типы и обязательность заполнения.

Если в процессе разбора файла метод ФабрикаXDTO.ПрочитатьXML() встречает тег, который отсутствует в схеме XDTO текущей конфигурации, платформа считает структуру документа нарушенной и генерирует исключение.

Законодательный контекст проблемы:
С 1 июня 2020 года вступили в силу изменения в Федеральном законе № 229-ФЗ «Об исполнительном производстве». Банки обязали указывать в платежных поручениях (в поле 20 «Наз. пл.») специальный код вида дохода (для разделения заработной платы, социальных выплат и прочих начислений). В связи с этим фирма «1С» совместно с банками обновила стандарт обмена «Клиент-Банк» до версии 1.03.

В обновленный формат обмена были добавлены новые реквизиты:

  1. КодНазПлатежа — код назначения платежа (поле 20).
  2. КодВыплат — код выплат (для идентификации бюджетных средств).

Если ваша конфигурация (например, старый релиз 1С:ERP или 1С:Комплексная автоматизация) не обновлялась с тех пор, то в ее XDTO-пакете ClientBankExchange этих свойств просто нет. Банк, отправляя современный XML-файл выписки, включает туда тег <КодНазПлатежа>, и система 1С натыкается на него как на «неизвестный» элемент схемы.

---

Способ 1. Обновление конфигурации (рекомендуемый метод)

Самым правильным и долгосрочным решением является своевременное обновление вашей информационной базы до актуального релиза. Фирма «1С» оперативно реагирует на изменения законодательства и вносит все необходимые правки в XDTO-пакеты типовых библиотек (БСП и Библиотеки интеграции с банками).

Если ваша конфигурация находится на типовой поддержке и не имеет критических доработок, препятствующих обновлению, выполните переход на актуальную версию через сервис 1С:Обновление программ.

---

Способ 2. Ручная корректировка XDTO-пакета в Конфигураторе

Если оперативно обновить конфигурацию невозможно (например, база сильно кастомизирована, а бизнес-процессы не позволяют останавливать работу пользователей), мы можем самостоятельно доработать XDTO-пакет. Проанализируем, как это сделать по шагам:

  1. Откройте базу данных в режиме Конфигуратор.
  2. В дереве метаданных раскройте ветку Общие, затем перейдите в XDTO-пакеты.
  3. Найдите пакет с именем ClientBankExchange (пространство имен urn:1C.ru:ClientBankExchange) и откройте его двойным кликом.
  4. В открывшемся окне структуры пакета найдите тип объекта ПлатежныйДокумент.
  5. Нажмите правой кнопкой мыши по списку свойств этого типа и выберите команду Добавить -> Свойство.
  6. Задайте для нового свойства следующие параметры в палитре свойств:
    • Имя: КодНазПлатежа
    • Тип значения: string (http://www.w3.org/2001/XMLSchema)
    • Минимальное количество: 0 (Это критически важно! Если оставить значение по умолчанию равным 1, система будет требовать этот тег во всех старых файлах, что приведет к новым ошибкам).
    • Максимальное количество: 1
  7. Рекомендуется аналогичным образом добавить свойство КодВыплат с типом string и минимальным количеством 0, так как банки могут начать передавать и его.
  8. Сохраните изменения и обновите конфигурацию базы данных (клавиша F7).

---

Способ 3. Использование расширения конфигурации (без снятия с поддержки)

Чтобы не вносить изменения непосредственно в основную конфигурацию и сохранить ее на полной поддержке («на замочке»), рассмотрим более элегантный способ — использование расширений.

Разберем последовательность действий:

  1. Перейдите в меню Конфигурация -> Расширения конфигурации и создайте новое расширение (например, с именем ИсправлениеОбменаСБанком).
  2. В основной конфигурации найдите XDTO-пакет ClientBankExchange, нажмите по нему правой кнопкой мыши и выберите команду Добавить в расширение.
  3. Откройте добавленный XDTO-пакет внутри расширения.
  4. Повторите шаги из Способа 2: добавьте новые необязательные свойства КодНазПлатежа и КодВыплат со строковым типом данных в структуру типа ПлатежныйДокумент.
  5. Запустите отладку и проверьте работоспособность обмена. Платформа автоматически подменит стандартную схему XDTO версией из вашего расширения.

---

Способ 4. Программный обход (очистка входящего XML-потока)

Бывают ситуации, когда изменять метаданные (даже через расширение) запрещено политикой безопасности компании. В таком случае мы можем применить программный «обходной путь» — перехватить входящий поток данных непосредственно перед передачей в метод чтения XDTO и удалить из него новые проблемные теги.

Проанализируем пример кода, который можно внедрить в общий модуль, где происходит загрузка данных из банка. Мы прочитаем XML как обычный текст, удалим из него теги <КодНазПлатежа> и вернем очищенную строку обратно в поток для корректного разбора:


Функция ОчиститьXMLВыпискиОтНовыхТегов(ДанныеФайлаСтрока) Экспорт
    
    РезультатСтрока = ДанныеФайлаСтрока;
    
    // Удаляем тег КодНазПлатежа вместе с его содержимым
    ПозицияНачала = Найти(РезультатСтрока, "<КодНазПлатежа>");
    Пока ПозицияНачала > 0 Цикл
        ПозицияКонца = Найти(РезультатСтрока, "</КодНазПлатежа>");
        Если ПозицияКонца > 0 Тогда
            ДлинаЗакрывающегоТега = СтрДлина("</КодНазПлатежа>");
            РезультатСтрока = Лев(РезультатСтрока, ПозицияНачала - 1) 
                + Сред(РезультатСтрока, ПозицияКонца + ДлинаЗакрывающегоТега);
        Иначе
            Прервать;
        КонецЕсли;
        ПозицияНачала = Найти(РезультатСтрока, "<КодНазПлатежа>");
    КонецЦикла;
    
    // Аналогично вырезаем тег КодВыплат
    ПозицияНачала = Найти(РезультатСтрока, "<КодВыплат>");
    Пока ПозицияНачала > 0 Цикл
        ПозицияКонца = Найти(РезультатСтрока, "</КодВыплат>");
        Если ПозицияКонца > 0 Тогда
            ДлинаЗакрывающегоТега = СтрДлина("</КодВыплат>");
            РезультатСтрока = Лев(РезультатСтрока, ПозицияНачала - 1) 
                + Сред(РезультатСтрока, ПозицияКонца + ДлинаЗакрывающегоТега);
        Иначе
            Прервать;
        КонецЕсли;
        ПозицияНачала = Найти(РезультатСтрока, "<КодВыплат>");
    КонецЦикла;
    
    Возврат РезультатСтрока;
    
КонецФункции

Этот код преобразует исходную строку XML, аккуратно вырезая из нее неподдерживаемые свойства. После такой обработки метод ФабрикаXDTO.ПрочитатьXML() успешно отработает без ошибок, так как структура документа полностью совпадет с ожидаемой старой схемой.

← На главную