Как исправить ошибку соответствия типов XDTO при добавлении новой ставки НДС

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

При сопровождении старых информационных систем, таких как «1С:Комплексная автоматизация 1.1» (КА), часто возникает необходимость добавления новых законодательных реквизитов. Одной из таких задач является внедрение ставки НДС 22%. Однако простого добавления значения в перечисление конфигурации недостаточно, если настроен обмен данными через универсальный формат (EnterpriseData) или XDTO. В этой ситуации разработчики часто сталкиваются с ошибкой Несоответствие типов XDTO при вызове метода Установить(). Рассмотрим подробно, как правильно реализовать поддержку новой ставки во всех узлах обмена.

Анализ причины ошибки в методе Установить

Ошибка Несоответствие типов XDTO при выполнении кода ОбъектXDTO.Установить(ИмяСвойства, Значение) означает, что передаваемое Значение не соответствует определению типа, зафиксированному в XDTO-пакете. Проанализируем ситуацию: когда мы добавляем ставку НДС в метаданные конфигурации (в перечисление СтавкиНДС), программный код выгрузки пытается передать это новое значение в объект XDTO. Но если в схеме пакета (XSD) для этого свойства разрешен только строго определенный список значений (enumeration), то любая новая ставка будет отвергнута валидатором XDTO.

Для решения проблемы нам потребуется синхронно изменить три компонента:

  1. Метаданные конфигурации (перечисление).
  2. XDTO-пакет (схема данных).
  3. Менеджер обмена (логика сопоставления).

Шаг 1: Настройка XDTO-пакета в источнике и приемнике

Разберем процесс изменения пакета XDTO. В современных обменах чаще всего используется пакет EnterpriseData конкретной версии (например, 1.3.20). Выясним, какой пакет используется в вашем узле обмена, и выполним следующие действия:

  1. Откроем конфигуратор и перейдем в ветку Общие -> XDTO-пакеты.
  2. Найдем нужный пакет (например, EnterpriseData_1_3_20).
  3. В структуре пакета найдем тип объекта, отвечающий за ставки НДС. Обычно это тип НДС или СтавкиНДС, имеющий строковый базовый тип.
  4. В свойствах этого типа найдем список Фасеты (Facets). Именно здесь перечислены допустимые значения, такие как НДС20, НДС18, БезНДС.
  5. Добавим новое значение (Value) — НДС22. Важно: написание должно быть идентичным во всех базах (источнике и приемнике).

Проанализируем типичную ошибку «карго-культа»: простое копирование существующей ставки может не сработать, если не проверить пространство имен (Namespace). Убедимся, что изменения внесены именно в ту версию пакета, которая выбрана в настройках синхронизации в пользовательском режиме.

Шаг 2: Реализация сопоставления в Менеджере обмена

Даже если XDTO-пакет теперь «знает» о существовании ставки 22%, система 1С не понимает автоматически, как связать значение перечисления из базы со значением в XML-файле. Для этого используется Менеджер обмена через универсальный формат. Рассмотрим, как внести правки в этот общий модуль.

Найдем в модуле процедуры, отвечающие за инициализацию правил конвертации объектов (ПКО) для перечислений. Обычно они называются ПКО_Перечисление_СтавкиНДС_Отправка и ПКО_Перечисление_СтавкиНДС_Получение. Нам нужно явно прописать связь. Рассмотрим пример кода, который необходимо добавить:


// В процедуре отправки (Источник)
Процедура ПКО_Перечисление_СтавкиНДС_Отправка(ПравилаКонвертации)
    // ... существующий код сопоставления ...
    ПравилаКонвертации.Соответствие.Вставить(Перечисления.СтавкиНДС.НДС22, "НДС22");
КонецПроцедуры

// В процедуре получения (Приемник)
Процедура ПКО_Перечисление_СтавкиНДС_Получение(ПравилаКонвертации)
    // ... существующий код сопоставления ...
    ПравилаКонвертации.Соответствие.Вставить("НДС22", Перечисления.СтавкиНДС.НДС22);
КонецПроцедуры

Если такие процедуры отсутствуют в вашей версии конфигурации (особенно в старой КА 1.1), выполним глобальный поиск по строке "НДС20". Мы найдем место, где формируется структура соответствия. Посмотрим на пример заполнения через таблицу значений или соответствие:


// Пример добавления в таблицу соответствий
НоваяСтрока = ТаблицаСоответствия.Добавить();
НоваяСтрока.ЗначениеКонфигурации = Перечисления.СтавкиНДС.НДС22;
НоваяСтрока.ЗначениеФормата = "НДС22";

Шаг 3: Проверка и отладка процесса

После внесения изменений в пакет и программный код часто возникает ситуация, когда «ставка всё равно не загружается». Проанализируем возможные причины:

  1. Кэширование XDTO: 1С кэширует структуру пакетов на уровне сервера приложений. После обновления конфигурации базы данных рекомендуется перезапустить службу сервера 1С или, в крайнем случае, временно переименовать пакет, чтобы заставить систему обновить кэш метаданных.
  2. Регистрация изменений: Убедимся, что документы с новой ставкой зарегистрированы к обмену. Воспользуемся обработкой Регистрация изменений для обмена и проверим состав выгрузки.
  3. Выгрузка в файл: Чтобы понять, на чьей стороне проблема, выполним выгрузку в XML-файл. Откроем его текстовым редактором и найдем узел, отвечающий за НДС. Если там указано <СтавкаНДС>НДС22</СтавкаНДС>, значит, источник отработал верно, и проблему нужно искать в приемнике (БП 3.0).

Особенности использования расширений

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

Также проверим процедуру ПриОтправкеДанных или аналогичные обработчики в модуле менеджера обмена. Иногда там стоят жесткие фильтры или условия, которые «пропускают» только старые ставки. Проведем отладку, установив точку останова на строке ОбъектXDTO.Установить, и убедимся, что переменная Значение содержит именно ту строку, которую мы прописали в фасетах XDTO-пакета.

Используя этот комплексный подход — от изменения фасетов типа в XDTO до прописки сопоставления в менеджере обмена — мы обеспечим корректную передачу новых данных между разнородными системами 1С.

← На главную