Обмен данными между двумя информационными базами 1С через COM-соединение — это классическая задача, с которой сталкивается практически каждый разработчик. Однако, как показывает практика, попытки простого переноса объектов «в лоб» приводят к тому, что документы создаются, но их табличные части остаются пустыми, а ссылки на справочники (товары, склады, организации) не заполняются. Давайте разберем, почему это происходит и как сделать обмен надежным и корректным.
Главная причина заключается в том, что при COM-соединении база-приемник не «видит» объекты базы-источника как свои собственные. Когда вы передаете ссылку, вы на самом деле передаете лишь COM-объект-обертку. База-приемник не может сопоставить элемент справочника из одной базы с элементом в другой только по наименованию, так как имена могут дублироваться или меняться.
Более того, при работе с табличными частями недостаточно просто передать значение поля. Платформа 1С требует, чтобы для каждого ссылочного реквизита в базе-приемнике была найдена Ссылка на реальный объект, существующий в её локальной базе данных.
Самый надежный способ связать объекты между базами — использовать Уникальный Идентификатор (GUID). Если ваши базы идентичны (например, являются репликами или имеют общий план обмена), то УИД элемента справочника «Товар А» в базе-источнике будет совпадать с УИД того же самого товара в базе-приемнике.
Вместо поиска по Наименованию, который крайне ненадежен, используйте следующий подход:
Строка(Объект.Ссылка.УникальныйИдентификатор()).COM-соединение.ПолучитьСсылку():
// В базе-приемнике
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаУИД));
Если НЕ НоваяСсылка.Пустая() И НоваяСсылка.ПолучитьОбъект() <> Неопределено Тогда
Документ.Номенклатура = НоваяСсылка;
КонецЕсли;
Если базы не идентичны или УИДы не совпадают, используйте дополнительные реквизиты. Например, для складов можно создать дополнительный реквизит КодСклада. В этом случае поиск будет выглядеть как запрос к базе данных:
// Пример поиска склада по доп. реквизиту
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "КодСк");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ СкладыДополнительныеРеквизиты.Ссылка КАК Склад
|ИЗ Справочник.Склады.ДополнительныеРеквизиты КАК СкладыДополнительныеРеквизиты
|ГДЕ СкладыДополнительныеРеквизиты.Свойство = &Свойство
|И СкладыДополнительныеРеквизиты.Значение = &ЗначениеКода";
Запрос.УстановитьПараметр("Свойство", Свойство);
Запрос.УстановитьПараметр("ЗначениеКода", ИскомыйКод);
Результат = Запрос.Выполнить().Выбрать();
Если структуры баз данных полностью совпадают, наиболее прогрессивным методом является использование СериализаторXDTO. Этот механизм позволяет превратить объект 1С в XML-строку и обратно, сохраняя при этом всю структуру табличных частей и вложенных объектов.
Рассмотрим, как это реализовать:
// В источнике
Функция СериализоватьОбъект(Ссылка)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
Значение = Ссылка.ПолучитьОбъект();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Значение, НазначениеТипаXML.Явное);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Полученную строку вы передаете через COM в приемник, где с помощью метода СериализаторXDTO.ПрочитатьJSON восстанавливаете объект. Это избавляет от необходимости вручную перебирать все реквизиты табличных частей.
ОписаниеОшибки() в блоке Исключение. Это поможет мгновенно определить, на каком поле происходит сбой (например, не найдена номенклатура или неверный формат количества).Организация, Склады) успешно найдены. Если поиск вернул «пустую ссылку», документ либо не запишется, либо возникнет ошибка логики, которую будет трудно отследить позже.COM-соединения. Лучше один раз выбрать данные из базы-источника в структуру или массив, а затем обработать их на стороне базы-приемника, чем обращаться к COM-объекту внутри каждого цикла.Следуя этим рекомендациям, вы сможете построить надежный обмен данными. Помните, что поиск по Наименованию допустим только как крайняя мера, в то время как использование GUID или специализированных кодов — это стандарт индустрии, который избавит вас от проблем с дублями и ошибками при обмене.