Как правильно организовать обмен документами между УТ 11 и УТ 11 через COM-соединение?

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

Обмен данными между двумя информационными базами 1С через COM-соединение — это классическая задача, с которой сталкивается практически каждый разработчик. Однако, как показывает практика, попытки простого переноса объектов «в лоб» приводят к тому, что документы создаются, но их табличные части остаются пустыми, а ссылки на справочники (товары, склады, организации) не заполняются. Давайте разберем, почему это происходит и как сделать обмен надежным и корректным.

Почему возникают ошибки при использовании COM-соединения?

Главная причина заключается в том, что при COM-соединении база-приемник не «видит» объекты базы-источника как свои собственные. Когда вы передаете ссылку, вы на самом деле передаете лишь COM-объект-обертку. База-приемник не может сопоставить элемент справочника из одной базы с элементом в другой только по наименованию, так как имена могут дублироваться или меняться.

Более того, при работе с табличными частями недостаточно просто передать значение поля. Платформа 1С требует, чтобы для каждого ссылочного реквизита в базе-приемнике была найдена Ссылка на реальный объект, существующий в её локальной базе данных.

Шаг 1: Правильная идентификация объектов (Поиск по GUID)

Самый надежный способ связать объекты между базами — использовать Уникальный Идентификатор (GUID). Если ваши базы идентичны (например, являются репликами или имеют общий план обмена), то УИД элемента справочника «Товар А» в базе-источнике будет совпадать с УИД того же самого товара в базе-приемнике.

Вместо поиска по Наименованию, который крайне ненадежен, используйте следующий подход:

  1. В базе-источнике получайте строковое представление УИДа: Строка(Объект.Ссылка.УникальныйИдентификатор()).
  2. Передавайте эту строку через COM-соединение.
  3. В базе-приемнике выполняйте поиск с помощью метода ПолучитьСсылку():

// В базе-приемнике
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаУИД));
Если НЕ НоваяСсылка.Пустая() И НоваяСсылка.ПолучитьОбъект() <> Неопределено Тогда
    Документ.Номенклатура = НоваяСсылка;
КонецЕсли;

Шаг 2: Использование дополнительных реквизитов для поиска

Если базы не идентичны или УИДы не совпадают, используйте дополнительные реквизиты. Например, для складов можно создать дополнительный реквизит КодСклада. В этом случае поиск будет выглядеть как запрос к базе данных:


// Пример поиска склада по доп. реквизиту
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "КодСк");
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ СкладыДополнительныеРеквизиты.Ссылка КАК Склад
    |ИЗ Справочник.Склады.ДополнительныеРеквизиты КАК СкладыДополнительныеРеквизиты
    |ГДЕ СкладыДополнительныеРеквизиты.Свойство = &Свойство
    |И СкладыДополнительныеРеквизиты.Значение = &ЗначениеКода";
Запрос.УстановитьПараметр("Свойство", Свойство);
Запрос.УстановитьПараметр("ЗначениеКода", ИскомыйКод);
Результат = Запрос.Выполнить().Выбрать();

Шаг 3: Сериализация через XDTO

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

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


// В источнике
Функция СериализоватьОбъект(Ссылка)
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    Значение = Ссылка.ПолучитьОбъект();
    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Значение, НазначениеТипаXML.Явное);
    Возврат ЗаписьJSON.Закрыть();
КонецФункции

Полученную строку вы передаете через COM в приемник, где с помощью метода СериализаторXDTO.ПрочитатьJSON восстанавливаете объект. Это избавляет от необходимости вручную перебирать все реквизиты табличных частей.

Важные рекомендации по доработке кода

Следуя этим рекомендациям, вы сможете построить надежный обмен данными. Помните, что поиск по Наименованию допустим только как крайняя мера, в то время как использование GUID или специализированных кодов — это стандарт индустрии, который избавит вас от проблем с дублями и ошибками при обмене.

← На главную