При переносе данных между идентичными конфигурациями 1С программисты часто сталкиваются с неожиданными трудностями. Казалось бы, если конфигурации полностью совпадают по релизам и структуре, то стандартная обработка ВыгрузкаЗагрузкаДанныхXML83 должна отрабатывать без сучка и задоринки. Однако на практике она может аварийно завершаться с загадочной ошибкой преобразования данных XDTO и типом anyType. При попытке решить проблему «в лоб» через создание правил в «Конвертации данных 2» (КД 2) возникает другая сложность — реквизиты с типом перечислений (например, ПричинаНетрудоспособности в документе БольничныйЛист) переносятся пустыми.
В этой статье мы подробно разберем обе проблемы. Мы выясним истинные причины сбоя стандартной XML-сериализации платформы и рассмотрим пошаговые алгоритмы настройки переноса перечислений в КД 2, включая использование автоматических механизмов и гибкое сопоставление через программный код.
Проанализируем текст ошибки, с которой столкнулся автор темы при выгрузке данных без использования правил обмена:
Ошибка преобразования данных XDTO:
НачалоСвойства: {http://v8.1c.ru/8.1/data/enterprise/current-config}КатегорияСтатистическогоНаблюдения2019 Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType
Давайте разберем по шагам, почему возникает эта ошибка, даже если конфигурации на первый взгляд абсолютно идентичны:
anyType в схемах XDTO. Если в базу-источник или базу-приемник конфигурация когда-либо вносилась через механизм «динамического обновления» (без монопольного выгона пользователей и перезапуска службы сервера), внутренние таблицы кэша платформы могут десинхронизироваться. Платформа перестает корректно определять внутренний тип объекта конфигурации (например, плана видов расчета Начисления или связанного с ним справочника) и подставляет вместо него универсальный неопределенный тип anyType.Как решить проблему со сбоем «ВыгрузкаЗагрузкаДанныхXML»:
Если выполнить эти рекомендации, стандартная выгрузка-загрузка XML заработает корректно. Но что делать, если вам всё же необходимо настроить надежный перенос через правила КД 2? Перейдем ко второй части.
Главная особенность перечислений в платформе 1С заключается в том, что в отличие от справочников или документов, они не имеют уникального идентификатора (GUID). В базе данных значения перечислений хранятся в виде фиксированного набора строк с их именами и числовыми индексами. Из-за этого механизм автоматического сопоставления по уникальному идентификатору для них не работает. Чтобы перечисление заполнилось в приемнике, платформа должна точно знать, какому значению источника соответствует значение в приемнике.
Рассмотрим два основных способа решения этой задачи.
Этот способ является наиболее правильным, надежным и декларативным. Нам потребуется создать Правило конвертации объекта (ПКО) для перечисления и заполнить Правила конвертации значений (ПКЗ).
Разберем процесс настройки по шагам:
ПеречислениеСсылка.ПричиныНетрудоспособности.ПеречислениеСсылка.ПричиныНетрудоспособности. Задайте имя правила (обычно оно заполняется автоматически).Болезнь источника сопоставится со значением Болезнь приемника.БольничныйЛист), перейдите во вкладку «Правила конвертации свойств» (ПКС).ПричинаНетрудоспособности. В колонке «Правило конвертации» выберите только что созданное ПКО для перечисления ПричиныНетрудоспособности.После сохранения правил обмена и повторной выгрузки данных реквизит перечисления в документе-приемнике заполнится корректно.
Иногда создавать отдельное ПКО для перечисления не хочется — например, если переносится всего один документ, а перечисление содержит всего два-три значения. В этом случае мы можем настроить передачу значения перечисления напрямую через текстовое представление в обработчиках событий КД.
Рассмотрим, как реализовать этот алгоритм:
БольничныйЛист) на вкладке ПКС.ПричинаНетрудоспособности. Оставьте поле «Правило конвертации» для этого свойства абсолютно пустым.Значение.Пример программного кода в обработчике ПКС Перед выгрузкой:
// Проверяем заполненность значения в источнике
Если ЗначениеЗаполнено(Источник.ПричинаНетрудоспособности) Тогда
// Получаем имя значения перечисления в виде строки
ИмяЗначения = Строка(Источник.ПричинаНетрудоспособности);
// Сопоставляем значения и передаем строковое имя для приемника
Если ИмяЗначения = "Болезнь" Тогда
Значение = "Болезнь";
ИначеЕсли ИмяЗначения = "Травма" Тогда
Значение = "Травма";
ИначеЕсли ИмяЗначения = "Профзаболевание" Тогда
Значение = "Профзаболевание";
Иначе
// Если значение не подошло под условия, выгружаем пустое или дефолтное
Значение = Неопределено;
КонецЕсли;
КонецЕсли;
При таком подходе XML-сериализатор КД запишет в файл обмена текстовую строку. При загрузке в базу-приемник платформа считает эту строку и попытается сопоставить ее с именем значения перечисления в метаданных приемника. Этот способ экономит время на создание лишних правил объектов и отлично подходит для точечной быстрой отладки.
Подведем итог. Мы детально рассмотрели причины возникновения системных ошибок XDTO-сериализации в 1С при использовании стандартных инструментов переноса данных, а также освоили два практических метода работы с перечислениями в программе «Конвертация данных 2». Применяйте декларативный метод с созданием ПКЗ для долгосрочных проектов обмена, а программный метод в обработчиках событий — для быстрых разовых переносов.