При сопровождении старых информационных систем, таких как «1С:Комплексная автоматизация 1.1» (КА), часто возникает необходимость добавления новых законодательных реквизитов. Одной из таких задач является внедрение ставки НДС 22%. Однако простого добавления значения в перечисление конфигурации недостаточно, если настроен обмен данными через универсальный формат (EnterpriseData) или XDTO. В этой ситуации разработчики часто сталкиваются с ошибкой Несоответствие типов XDTO при вызове метода Установить(). Рассмотрим подробно, как правильно реализовать поддержку новой ставки во всех узлах обмена.
Ошибка Несоответствие типов XDTO при выполнении кода ОбъектXDTO.Установить(ИмяСвойства, Значение) означает, что передаваемое Значение не соответствует определению типа, зафиксированному в XDTO-пакете. Проанализируем ситуацию: когда мы добавляем ставку НДС в метаданные конфигурации (в перечисление СтавкиНДС), программный код выгрузки пытается передать это новое значение в объект XDTO. Но если в схеме пакета (XSD) для этого свойства разрешен только строго определенный список значений (enumeration), то любая новая ставка будет отвергнута валидатором XDTO.
Для решения проблемы нам потребуется синхронно изменить три компонента:
Разберем процесс изменения пакета XDTO. В современных обменах чаще всего используется пакет EnterpriseData конкретной версии (например, 1.3.20). Выясним, какой пакет используется в вашем узле обмена, и выполним следующие действия:
EnterpriseData_1_3_20).НДС или СтавкиНДС, имеющий строковый базовый тип.НДС20, НДС18, БезНДС.НДС22. Важно: написание должно быть идентичным во всех базах (источнике и приемнике).Проанализируем типичную ошибку «карго-культа»: простое копирование существующей ставки может не сработать, если не проверить пространство имен (Namespace). Убедимся, что изменения внесены именно в ту версию пакета, которая выбрана в настройках синхронизации в пользовательском режиме.
Даже если XDTO-пакет теперь «знает» о существовании ставки 22%, система 1С не понимает автоматически, как связать значение перечисления из базы со значением в XML-файле. Для этого используется Менеджер обмена через универсальный формат. Рассмотрим, как внести правки в этот общий модуль.
Найдем в модуле процедуры, отвечающие за инициализацию правил конвертации объектов (ПКО) для перечислений. Обычно они называются ПКО_Перечисление_СтавкиНДС_Отправка и ПКО_Перечисление_СтавкиНДС_Получение. Нам нужно явно прописать связь. Рассмотрим пример кода, который необходимо добавить:
// В процедуре отправки (Источник)
Процедура ПКО_Перечисление_СтавкиНДС_Отправка(ПравилаКонвертации)
// ... существующий код сопоставления ...
ПравилаКонвертации.Соответствие.Вставить(Перечисления.СтавкиНДС.НДС22, "НДС22");
КонецПроцедуры
// В процедуре получения (Приемник)
Процедура ПКО_Перечисление_СтавкиНДС_Получение(ПравилаКонвертации)
// ... существующий код сопоставления ...
ПравилаКонвертации.Соответствие.Вставить("НДС22", Перечисления.СтавкиНДС.НДС22);
КонецПроцедуры
Если такие процедуры отсутствуют в вашей версии конфигурации (особенно в старой КА 1.1), выполним глобальный поиск по строке "НДС20". Мы найдем место, где формируется структура соответствия. Посмотрим на пример заполнения через таблицу значений или соответствие:
// Пример добавления в таблицу соответствий
НоваяСтрока = ТаблицаСоответствия.Добавить();
НоваяСтрока.ЗначениеКонфигурации = Перечисления.СтавкиНДС.НДС22;
НоваяСтрока.ЗначениеФормата = "НДС22";
После внесения изменений в пакет и программный код часто возникает ситуация, когда «ставка всё равно не загружается». Проанализируем возможные причины:
Регистрация изменений для обмена и проверим состав выгрузки.<СтавкаНДС>НДС22</СтавкаНДС>, значит, источник отработал верно, и проблему нужно искать в приемнике (БП 3.0).Если вы вносите изменения в Бухгалтерию Предприятия 3.0 через расширение, помните, что XDTO-пакеты в расширениях могут конфликтовать с основными пакетами. Проанализируем ситуацию: если в основном пакете конфигурации ставка 22 отсутствует, а в расширении она добавлена, то при чтении данных механизм обмена может использовать схему из основной конфигурации. В этом случае надежнее вносить изменения непосредственно в основную конфигурацию или убедиться, что расширение полностью перекрывает тип данных пакета.
Также проверим процедуру ПриОтправкеДанных или аналогичные обработчики в модуле менеджера обмена. Иногда там стоят жесткие фильтры или условия, которые «пропускают» только старые ставки. Проведем отладку, установив точку останова на строке ОбъектXDTO.Установить, и убедимся, что переменная Значение содержит именно ту строку, которую мы прописали в фасетах XDTO-пакета.
Используя этот комплексный подход — от изменения фасетов типа в XDTO до прописки сопоставления в менеджере обмена — мы обеспечим корректную передачу новых данных между разнородными системами 1С.