При использовании Конвертации данных 3.0 и обмена через универсальный формат (EnterpriseData) программисты часто сталкиваются с ситуацией, когда в конфигурации источника и приемника добавлены новые реквизиты, но они отсутствуют в стандартной схеме XSD. Поскольку формат EnterpriseData является жестко описанным, простым добавлением реквизита в метаданные задачу не решить — данные просто не пройдут проверку по схеме или будут проигнорированы при загрузке.
В этой статье мы подробно разберем, как передать значение собственного реквизита из «1С:Управление торговлей 11» в «1С:Бухгалтерия предприятия 3.0», используя возможности расширения формата без изменения самой схемы XSD.
Проанализируем самый простой, но менее «чистый» способ. Если в формате EnterpriseData для нужного объекта (например, справочника Контрагенты) есть реквизит того же типа, который вы не используете в бизнес-логике, можно временно «подменить» его значение. Например, если наш реквизит СамРемонтируетСвоеОборудование имеет тип Булево, мы можем передать его через стандартное поле формата ОбособленноеПодразделение.
Рассмотрим реализацию в коде модуля МенеджерОбменаЧерезУниверсальныйФормат. В процедуре инициализации правил конвертации объектов (ПКО) для отправки данных необходимо прописать соответствие:
НоваяСтрока = ПравилоКонвертации.Свойства.Добавить;
НоваяСтрока.СвойствоКонфигурации = "СамРемонтируетСвоеОборудование";
НоваяСтрока.СвойствоФормата = "ОбособленноеПодразделение"; // Используем существующее поле формата
В базе-приемнике (БП) нужно выполнить обратную операцию — прописать в правилах загрузки, что данные из поля формата ОбособленноеПодразделение должны попасть в реквизит СамРемонтируетСвоеОборудование. Этот метод хорош тем, что он не требует работы со структурами AdditionalInfo, однако он ограничен наличием свободных подходящих полей в формате.
Это наиболее правильный и гибкий метод, предусмотренный разработчиками 1С для передачи произвольных данных. Свойство AdditionalInfo (в модуле менеджера часто фигурирует как ДополнительнаяИнформация) позволяет передать структуру или соответствие с любыми данными.
Разберем по шагам, как настроить выгрузку в базе-источнике (УТ 11):
ДополнительнаяИнформация (или AdditionalInfo).XDTO.Пример кода для заполнения AdditionalInfo в модуле менеджера обмена:
// В обработчике ПКО_Справочник_Контрагенты_ПриОтправкеДанных
// Мы добавляем наше значение в структуру данных XDTO
Если ДанныеИБ.СамРемонтируетСвоеОборудование Тогда
ДанныеXDTO.Вставить("AdditionalInfo", "Ремонтирует");
Иначе
ДанныеXDTO.Вставить("AdditionalInfo", "НеРемонтирует");
КонецЕсли;
Важный нюанс: как показывает практика, метод .Вставить() работает надежнее, чем прямое обращение через точку, так как свойство может отсутствовать в текущей версии пакета XDTO, используемого при генерации модуля.
После того как данные выгружены в файл обмена, их нужно правильно прочитать. В базе-приемнике в модуле менеджера обмена найдем процедуру ПКО_Справочник_Контрагенты_ПриКонвертацииДанныхXDTO. Здесь мы должны извлечь данные из объекта ДанныеXDTO.
Проанализируем пример кода для загрузки: если же требуется выполнить миграцию данных без ручного написания кода, доступен раздел с решениями для переноса данных в 1С:Бухгалтерию.
Если ДанныеXDTO.Свойство("AdditionalInfo") Тогда
ЗначениеДопИнфо = ДанныеXDTO.AdditionalInfo;
Если ЗначениеДопИнфо = "Ремонтирует" Тогда
ДанныеИБ.СамРемонтируетСвоеОборудование = Истина;
Иначе
ДанныеИБ.СамРемонтируетСвоеОборудование = Ложь;
КонецЕсли;
КонецЕсли;
Если вам нужно передать несколько реквизитов, рекомендуется упаковывать их в Структуру или Соответствие перед вставкой в AdditionalInfo. При выгрузке 1С автоматически сериализует структуру в формат v8:Map, который корректно передается внутри XML.
В процессе настройки вы можете столкнуться с рядом ошибок, характерных для версий КД 3.0.5.x. Рассмотрим наиболее частые из них и способы решения: для профилактики проблем при обслуживании нескольких систем можно автоматизировать архивирование и тестирование баз 1С в пакетном режиме.
EnterpriseData_X_X_X.xsd уже содержит необходимые описания. Если КД не дает выбрать два файла сразу, попробуйте загрузить только основной файл формата.ОбменДаннымиXDTOСервер новой конфигурации, либо заменить их в коде на прямые значения (например, заменить ЭтоУТ() на Истина).AdditionalInfo обычно доступно только при полной выгрузке объекта. Проверьте настройки ПКО и убедитесь, что объект не выгружается по правилу «Только по идентификатору».Если объект в базе поддерживает механизм Дополнительных сведений и реквизитов (БСП), можно воспользоваться типовой табличной частью ДополнительныеРеквизиты, которая присутствует в большинстве объектов формата EnterpriseData. Рассмотрим этот путь подробнее:
В источнике мы можем программно добавить строку в коллекцию ДополнительныеРеквизиты объекта формата. В качестве имени свойства (Property) указываем строковый идентификатор нашего реквизита, а в значение (Value) — само значение. В приемнике мы просто перехватываем заполнение этой таблицы и переносим данные в реальный реквизит справочника.
Этот метод считается более «отказоустойчивым», так как он использует стандартные узлы формата, которые гарантированно проходят валидацию XSD схемы.
Чтобы ваши изменения в модуле МенеджерОбменаЧерезУниверсальныйФормат не затерлись при очередном обновлении типовой конфигурации, мы настоятельно рекомендуем использовать Расширения. Вы можете создать расширение и переопределить в нем методы инициализации ПКО, добавляя свои правила программно через &После или &ИзменениеИПосле. Это позволит сохранить логику обмена даже при переходе на новые версии типовых правил от 1С.
Таким образом, несмотря на жесткость универсального формата, Конвертация данных 3.0 предоставляет достаточно инструментов для гибкой передачи данных. Использование AdditionalInfo является стандартом де-факто для подобных задач, обеспечивая чистоту кода и совместимость с будущими обновлениями конфигураций.