Почему не переносится перечисление «Виды договоров» при обмене через 1С:Конвертация данных 2.0?

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

При настройке обмена данными между конфигурациями на платформе 1С через «1С:Конвертация данных 2.0» (КД 2.0) программисты часто сталкиваются с ситуацией, когда справочники и документы переносятся успешно, но реквизиты, имеющие тип ПеречислениеСсылка, остаются пустыми. Одной из самых распространенных проблем является перенос реквизита ВидДоговора в справочнике ДоговорыКонтрагентов.

В этой статье мы подробно разберем, почему это происходит, как проанализировать файл выгрузки и какие настройки в правилах конвертации объектов (ПКО) необходимо проверить в первую очередь.

Понимание механизма переноса перечислений

Прежде всего, проанализируем важный технический нюанс: перечисления в 1С являются объектами метаданных, их нельзя создать динамически в пользовательском режиме. В отличие от справочников, которые могут быть созданы «на лету» по внутреннему идентификатору (GUID), перечисления требуют четкого сопоставления (маппинга) значений источника значениям приемника в самих правилах обмена.

Рассмотрим основные шаги для диагностики и решения проблемы.

Шаг 1. Анализ файла выгрузки (XML)

Первым делом нам необходимо выяснить, выгружается ли значение перечисления вообще. Если данных нет в файле XML, проблема в правилах выгрузки (ПВД) или в ПКО источника. Если данные в файле есть, но не загружаются — проблема на стороне ПКО приемника.

Для эффективной проверки не нужно выгружать всю базу. Проанализируем способ выгрузки одного конкретного объекта:

  1. Создадим в базе-источнике тестовый договор с уникальным наименованием (например, «ТЕСТ_ДЛЯ_ОБМЕНА_001»).
  2. Выполним выгрузку данных через обработку V8Exchan82.epf.
  3. Откроем полученный файл XML в любом текстовом редакторе.
  4. Выполним поиск по наименованию нашего договора.

Внутри узла договора найдем структуру реквизита. Она должна выглядеть примерно так:


<Свойство Имя="ВидДоговора" Тип="ПеречислениеСсылка.ВидыДоговоров">
    <Значение>СПокупателем</Значение>
</Свойство>

Если в узле Значение пусто или он отсутствует, значит, система КД 2.0 не смогла получить данные из объекта-источника. Если значение заполнено, но в приемнике оно пустое — переходим к настройкам сопоставления.

Шаг 2. Проверка соответствия имен и реквизитов

Иногда в локализованных или сильно измененных конфигурациях имена реквизитов могут отличаться. Выясним, какой именно реквизит отвечает за вид договора в базе-приемнике. Для этого в конфигураторе приемника проверим состав реквизитов справочника ДоговорыКонтрагентов. Может оказаться, что на форме отображается не типовой ВидДоговора, а какой-то специфический, например, млдвВидДоговора.

Также важно убедиться, что типы данных совпадают. Если в одной базе это перечисление ВидыДоговоров, а в другой — ТипыДоговоров, автоматического сопоставления не произойдет без явно указанного ПКО.

Шаг 3. Настройка ПКО для перечисления

Рассмотрим правила конвертации объектов. Для каждого перечисления должно быть создано свое ПКО. Перейдем в КД 2.0 на закладку «Конвертация значений» для ПКО ВидыДоговоров.

Важные моменты:

Шаг 4. Настройка замещения существующих объектов

Если при обмене создаются новые договоры, и в них поле пустое — это проблема сопоставления. Но если вы обновляете существующие договоры, обратите внимание на настройку в ПКО договора: «Не замещать существующие объекты в приемнике при загрузке, а только создавать новые». Если эта опция включена, то для уже существующих в базе-приемнике договоров реквизиты обновляться не будут, даже если в файле выгрузки они заполнены.

Шаг 5. Программная отладка через обработчики

Если стандартными средствами причину найти не удается, воспользуемся программной фильтрацией. В Правиле выгрузки данных (ПВД) в обработчике «Перед выгрузкой» мы можем настроить фильтр, чтобы выгружать только нужный нам объект и видеть процесс в отладчике.

Проанализируем пример кода для фильтрации по наименованию:


// Создаем массив с наименованиями объектов для отладки
мФильтрОтладки = Новый Массив;
мФильтрОтладки.Добавить("ТЕСТ_ДЛЯ_ОБМЕНА_001");

// Проверяем текущий объект
НаименованиеОбъекта = СокрЛП(Объект.Наименование);

Если мФильтрОтладки.Найти(НаименованиеОбъекта) = Неопределено Тогда
    // Если объект не входит в наш список — отменяем выгрузку
    Отказ = Истина;
Иначе
    // Выводим сообщение для контроля
    Сообщить("Выполняется выгрузка тестового объекта: " + НаименованиеОбъекта);
КонецЕсли;

Этот код позволит быстро генерировать маленькие файлы выгрузки только с проблемным объектом, что значительно ускоряет поиск ошибки.

Дополнительные факторы: Подписки на события

Иногда значение перечисления «затирается» уже в момент записи в базе-приемнике. Это может происходить из-за работы подписок на события (например, «ПриЗаписи» или «ПередЗаписью»). Типовые конфигурации часто содержат программные проверки. Например, если вид договора «С поставщиком» не соответствует типу контрагента «Физическое лицо», встроенный код может программно очищать ВидДоговора.

Чтобы исключить этот фактор, попробуйте вручную создать договор в базе-приемнике с теми же реквизитами. Если конфигурация позволяет его записать, значит, проблема все же в правилах КД.

Резюме

Для решения проблемы с переносом перечисления ВидыДоговоров мы должны:

  1. Убедиться в наличии данных в XML-файле.
  2. Проверить таблицу «Конвертация значений» в ПКО перечисления.
  3. Синхронизировать метаданные источника и приемника в КД 2.0.
  4. Проверить флаги замещения в ПКО договора.
  5. Убедиться, что программные механизмы приемника не очищают поле при записи.
← На главную