Как сериализовать объект из другой базы 1С при подключении через COM?

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

Работа с распределенными данными часто требует получения объектов из одной информационной базы 1С в другую. Одним из классических способов интеграции является использование COMConnector. Однако при получении ссылки на объект (например, ДокументСсылка) через COM-соединение, мы получаем не полноценные данные, а прокси-объект. Для передачи этих данных в текстовом виде или для сохранения в файл возникает задача сериализации этого объекта в XML или JSON на стороне удаленной базы. В этой статье мы подробно разберем несколько способов решения этой задачи, проанализируем нюансы производительности и настройки инфраструктуры.

Способ 1: Использование функций Библиотеки стандартных подсистем (БСП)

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

Рассмотрим пример кода, который позволяет получить XML-представление документа из удаленной базы:


ПараметрыПодключенияИБ = "Srvr='ServerName';Ref='RemoteDB';Usr='Admin';Pwd='Pass';";
V83COMCon = Новый COMОбъект("V83.COMConnector");
УдаленнаяБаза = V83COMCon.Connect(ПараметрыПодключенияИБ);

// Находим объект в удаленной базе
ДокументСсылкаУдаленнойБазы = УдаленнаяБаза.Документы.РеализацияТоваровУслуг.НайтиПоНомеру("00ЦБ-1488", ТекущаяДата());

// Вызываем метод сериализации на стороне удаленной базы
XMLСтрока = УдаленнаяБаза.ОбщегоНазначения.ЗначениеВСтрокуXML(ДокументСсылкаУдаленнойБазы);

// Теперь XMLСтрока содержит текстовое представление объекта, которое можно разобрать в текущей базе
Сообщить(XMLСтрока);

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

Способ 2: Использование встроенных средств платформы (ЗаписатьXML)

Если мы не можем полагаться на наличие БСП, нам следует использовать встроенные механизмы глобального контекста 1С. Для этого необходимо создать объект ЗаписьXML на стороне удаленной базы, выполнить сериализацию и передать результат обратно. Разберем этот процесс по шагам.

Проанализируем ситуацию: мы не можем просто передать ЗаписьXML из нашей базы в удаленную, так как это разные COM-контексты. Весь процесс должен происходить "там":


// Создаем объект ЗаписьXML в контексте удаленной базы
ЗаписьXML = УдаленнаяБаза.NewObject("ЗаписьXML");
ЗаписьXML.УстановитьСтроку();

// Выполняем запись объекта в XML
УдаленнаяБаза.ЗаписатьXML(ЗаписьXML, ДокументСсылкаУдаленнойБазы);

// Получаем готовую строку
XMLСтрока = ЗаписьXML.Закрыть();

Этот способ является универсальным и "чистым", так как он не зависит от конкретной конфигурации и работает везде, где установлена платформа 1С:Предприятие. Мы используем метод NewObject для создания объектов внутри COM-сессии, что гарантирует правильное взаимодействие типов данных.

Способ 3: Сериализация через механизм XDTO

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

Рассмотрим, как вызвать сериализацию XDTO через COM:


ЗаписьXML = УдаленнаяБаза.NewObject("ЗаписьXML");
ЗаписьXML.УстановитьСтроку();

// Используем системный сериализатор удаленной базы
УдаленнаяБаза.СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ДокументСсылкаУдаленнойБазы);

РезультатXML = ЗаписьXML.Закрыть();

Использование XDTO позволяет передавать не только ссылки, но и целые объекты (включая табличные части) в структурированном виде, который легко преобразуется в объекты других информационных систем.

Важные технические нюансы и оптимизация

При работе через COM-соединение крайне важно учитывать архитектурные особенности этого механизма. Выясним основные причины возможных проблем и способы их решения:

  1. Проблема прокси-объектов: Когда вы получаете ДокументСсылкаУдаленнойБазы, переменная в вашей базе содержит лишь "указатель". Каждое обращение к свойству (например, ДокументСсылка.Дата) инициирует сетевой вызов к удаленному серверу. Если вам нужно получить много полей, всегда выгоднее выполнить сериализацию на стороне удаленной базы одним вызовом и передать одну большую строку, чем тянуть каждое поле по отдельности.
  2. Разрядность (32/64 бит): V83.COMConnector часто конфликтует, если сервер 1С имеет разрядность 64 бита, а драйвер COM — 32 бита (или наоборот). Для стабильной работы рекомендуется настроить COM+ Application в службах компонентов Windows. Это позволит запускать COM-соединение в изолированном процессе dllhost.exe, что повышает отказоустойчивость всей системы.
  3. Утечки памяти: COM-объекты требуют явного освобождения. В 1С это происходит при обнулении переменной (УдаленнаяБаза = Неопределено). Однако, если внутри кода возникла ошибка, соединение может "зависнуть" и занимать лицензию на сервере. Всегда используйте блоки Попытка...Исключение для корректного завершения работы.
  4. Безопасность: Все действия в удаленной базе выполняются от имени пользователя, указанного в строке подключения. Убедитесь, что у этого пользователя достаточно прав не только на чтение документа, но и на использование объектов ЗаписьXML и доступ к метаданным.

Альтернатива: Почему COM уходит в прошлое?

Современные стандарты разработки 1С (особенно в крупных облачных системах) предполагают отказ от COM в пользу HTTP-сервисов или OData. Посмотрим, почему это предпочтительнее:

Подводя итог, можно сказать: если вам нужно быстрое решение "здесь и сейчас", использование метода ОбщегоНазначения.ЗначениеВСтрокуXML через COM — отличный вариант. Но для долгосрочных и масштабируемых проектов стоит рассмотреть переход на Web-технологии.

← На главную