Как правильно перенести перечисления между базами 1С в «Конвертации данных 2» и почему сбоит «ВыгрузкаЗагрузкаДанныхXML»?

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

При переносе данных между идентичными конфигурациями 1С программисты часто сталкиваются с неожиданными трудностями. Казалось бы, если конфигурации полностью совпадают по релизам и структуре, то стандартная обработка ВыгрузкаЗагрузкаДанныхXML83 должна отрабатывать без сучка и задоринки. Однако на практике она может аварийно завершаться с загадочной ошибкой преобразования данных XDTO и типом anyType. При попытке решить проблему «в лоб» через создание правил в «Конвертации данных 2» (КД 2) возникает другая сложность — реквизиты с типом перечислений (например, ПричинаНетрудоспособности в документе БольничныйЛист) переносятся пустыми.

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

Часть 1. Почему универсальная обработка «ВыгрузкаЗагрузкаДанныхXML» падает с ошибкой XDTO?

Проанализируем текст ошибки, с которой столкнулся автор темы при выгрузке данных без использования правил обмена:


Ошибка преобразования данных XDTO:
НачалоСвойства: {http://v8.1c.ru/8.1/data/enterprise/current-config}КатегорияСтатистическогоНаблюдения2019    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType

Давайте разберем по шагам, почему возникает эта ошибка, даже если конфигурации на первый взгляд абсолютно идентичны:

  1. Сбой динамического кэша метаданных (Динамическое обновление). Это наиболее частая причина появления типа anyType в схемах XDTO. Если в базу-источник или базу-приемник конфигурация когда-либо вносилась через механизм «динамического обновления» (без монопольного выгона пользователей и перезапуска службы сервера), внутренние таблицы кэша платформы могут десинхронизироваться. Платформа перестает корректно определять внутренний тип объекта конфигурации (например, плана видов расчета Начисления или связанного с ним справочника) и подставляет вместо него универсальный неопределенный тип anyType.
  2. Неявные различия в расширениях конфигурации. Если в одной из баз подключено активное расширение, которое хотя бы косвенно затрагивает переносимые объекты метаданных или их типы, структура XDTO-пакета моментально меняется. Даже если состав реквизитов совпадает, порядок их следования, внутренние GUID типов или пространства имен могут различаться, что делает невозможным прямое чтение XML-сериализатором.
  3. Ошибки и баги конкретных релизов платформы 1С. В истории релизов платформы 1С (особенно в ветках 8.3.21 и 8.3.22) неоднократно фиксировались зарегистрированные ошибки, связанные с утечкой памяти или некорректной работой сериализатора XDTO при выгрузке планов видов расчета и планов счетов.

Как решить проблему со сбоем «ВыгрузкаЗагрузкаДанныхXML»:

Если выполнить эти рекомендации, стандартная выгрузка-загрузка XML заработает корректно. Но что делать, если вам всё же необходимо настроить надежный перенос через правила КД 2? Перейдем ко второй части.

Часть 2. Правильный перенос перечислений в «Конвертации данных 2.0»

Главная особенность перечислений в платформе 1С заключается в том, что в отличие от справочников или документов, они не имеют уникального идентификатора (GUID). В базе данных значения перечислений хранятся в виде фиксированного набора строк с их именами и числовыми индексами. Из-за этого механизм автоматического сопоставления по уникальному идентификатору для них не работает. Чтобы перечисление заполнилось в приемнике, платформа должна точно знать, какому значению источника соответствует значение в приемнике.

Рассмотрим два основных способа решения этой задачи.

Способ А. Классический (Создание ПКО и ПКЗ)

Этот способ является наиболее правильным, надежным и декларативным. Нам потребуется создать Правило конвертации объекта (ПКО) для перечисления и заполнить Правила конвертации значений (ПКЗ).

Разберем процесс настройки по шагам:

  1. Откройте вашу конфигурацию «Конвертация данных 2».
  2. Перейдите на вкладку «Правила конвертации объектов» и нажмите кнопку создания нового ПКО.
  3. В поле «Источник» выберите ваше перечисление, например, ПеречислениеСсылка.ПричиныНетрудоспособности.
  4. В поле «Приемник» укажите аналогичное перечисление ПеречислениеСсылка.ПричиныНетрудоспособности. Задайте имя правила (обычно оно заполняется автоматически).
  5. Перейдите на вкладку «Конвертация значений» (она находится в нижней части формы настройки ПКО). Именно этот шаг упустил автор темы на форуме!
  6. Не нужно сопоставлять каждое значение вручную, если конфигурации идентичны. Нажмите на панели инструментов кнопку «Синхронизировать свойства и значения» (или «Заполнить автоматически»).
  7. Программа автоматически сопоставит строки перечисления по их имени. В табличной части появятся строки сопоставления значений источника и приемника (это и есть ПКЗ — правила конвертации значений). Например, значение Болезнь источника сопоставится со значением Болезнь приемника.
  8. Сохраните ПКО перечисления.
  9. Теперь откройте ПКО вашего документа (например, БольничныйЛист), перейдите во вкладку «Правила конвертации свойств» (ПКС).
  10. Найдите строку свойства ПричинаНетрудоспособности. В колонке «Правило конвертации» выберите только что созданное ПКО для перечисления ПричиныНетрудоспособности.

После сохранения правил обмена и повторной выгрузки данных реквизит перечисления в документе-приемнике заполнится корректно.

Способ Б. Программное сопоставление (без создания ПКО перечисления)

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

Рассмотрим, как реализовать этот алгоритм:

  1. Откройте ПКО вашего документа (например, БольничныйЛист) на вкладке ПКС.
  2. Найдите строку свойства ПричинаНетрудоспособности. Оставьте поле «Правило конвертации» для этого свойства абсолютно пустым.
  3. Дважды кликните на это ПКС, чтобы открыть его свойства, и перейдите к обработчику события «Перед выгрузкой».
  4. Напишите программный код, который будет преобразовывать ссылку перечисления источника в строковое имя значения для базы-приемника и передавать его в переменную Значение.

Пример программного кода в обработчике ПКС Перед выгрузкой:


// Проверяем заполненность значения в источнике
Если ЗначениеЗаполнено(Источник.ПричинаНетрудоспособности) Тогда
    
    // Получаем имя значения перечисления в виде строки
    ИмяЗначения = Строка(Источник.ПричинаНетрудоспособности);
    
    // Сопоставляем значения и передаем строковое имя для приемника
    Если ИмяЗначения = "Болезнь" Тогда
        Значение = "Болезнь";
    ИначеЕсли ИмяЗначения = "Травма" Тогда
        Значение = "Травма";
    ИначеЕсли ИмяЗначения = "Профзаболевание" Тогда
        Значение = "Профзаболевание";
    Иначе
        // Если значение не подошло под условия, выгружаем пустое или дефолтное
        Значение = Неопределено;
    КонецЕсли;
    
КонецЕсли;

При таком подходе XML-сериализатор КД запишет в файл обмена текстовую строку. При загрузке в базу-приемник платформа считает эту строку и попытается сопоставить ее с именем значения перечисления в метаданных приемника. Этот способ экономит время на создание лишних правил объектов и отлично подходит для точечной быстрой отладки.

Подведем итог. Мы детально рассмотрели причины возникновения системных ошибок XDTO-сериализации в 1С при использовании стандартных инструментов переноса данных, а также освоили два практических метода работы с перечислениями в программе «Конвертация данных 2». Применяйте декларативный метод с созданием ПКЗ для долгосрочных проектов обмена, а программный метод в обработчиках событий — для быстрых разовых переносов.

← На главную