При организации обмена данными между базами 1С через COM-соединение часто требуется переносить документы так, чтобы их уникальные идентификаторы (GUID) в базе-приемнике в точности совпадали с идентификаторами в базе-источнике. На практике разработчики часто сталкиваются с ошибками вызова методов ПолучитьСсылку и УстановитьСсылкуНового. Разберем по шагам, почему возникают эти ошибки и как правильно реализовать данный алгоритм.
Проанализируем основные причины сбоев, возникающих при попытке присвоить идентификатор объекту в подключенной базе:
Метод объекта не обнаружен (ПолучитьСсылку) происходит, когда метод вызывается у объекта документа (ДокументОбъект), тогда как метод ПолучитьСсылку() принадлежит менеджеру соответствующего документа (ДокументМенеджер).УстановитьСсылкуНового() ожидает ссылку типа целевой базы (ДокументСсылка), а не строковый GUID или локальный объект УникальныйИдентификатор базы-источника. Передача строки или ссылки из другой базы вызывает ошибку Несоответствие типов.Строка() для ссылки может возвращать представление документа (номер и дату), а не GUID. Для получения строкового UUID необходимо использовать функцию XMLСтрока() или обращаться к Ссылка.УникальныйИдентификатор().Ошибка при попытке вставки записи с неуникальным значением ссылки часто возникает из-за неверной структуры циклов поиска, когда код многократно пытается создать и записать документ с одним и тем же GUID.Разберем правильную последовательность действий для поиска и создания документа в подключенной базе через менеджер объекта:
УникальныйИдентификатор в контексте COM-базы с помощью метода NewObject.ПодключеннаяБаза.Документы[ИмяДокумента].ПолучитьСсылку(...).ПолучитьОбъект() у полученной ссылки. Если объект не существует, метод вернет Неопределено.СоздатьДокумент() и связываем его с подготовленной ссылкой через УстановитьСсылкуНового().Посмотрим на пример кода:
// 1. Получаем строковое представление GUID из источника
СтрокаГУИД = XMLСтрока(ДокументИсточник.УникальныйИдентификатор());
// 2. Создаем UUID в контексте COM-соединения
ГуидCOM = ПодключеннаяБаза.NewObject("УникальныйИдентификатор", СтрокаГУИД);
// 3. Получаем ссылку через менеджер документа базы-приемника
СсылкаCOM = ПодключеннаяБаза.Документы.ПеремещениеТоваров.ПолучитьСсылку(ГуидCOM);
// 4. Проверяем, существует ли документ в базе-приемнике
ДокументCOM = СсылкаCOM.ПолучитьОбъект();
Если ДокументCOM = Неопределено Тогда
// Объект не найден — создаем новый и назначаем ссылку
ДокументCOM = ПодключеннаяБаза.Документы.ПеремещениеТоваров.СоздатьДокумент();
ДокументCOM.УстановитьСсылкуНового(СсылкаCOM);
КонецЕсли;
// 5. Заполняем реквизиты и сохраняем
ДокументCOM.Дата = ДокументИсточник.Дата;
ДокументCOM.ВидОперации = ПодключеннаяБаза.Перечисления.ВидыОперацийПеремещениеТоваров.ТоварыПродукция;
ДокументCOM.ОтражатьВУправленческомУчете = Истина;
ДокументCOM.ОтражатьВБухгалтерскомУчете = Истина;
ДокументCOM.ОбменДанными.Загрузка = Истина;
ДокументCOM.Записать();
Рассмотрим еще один компактный способ формирования ссылки в удаленной базе. Вместо явного создания объекта УникальныйИдентификатор через COM можно применить метод XMLЗначение:
СтрокаГУИД = XMLСтрока(ДокументИсточник.УникальныйИдентификатор());
СсылкаCOM = ПодключеннаяБаза.XMLЗначение(ПодключеннаяБаза.Тип("ДокументСсылка.ПеремещениеТоваров"), СтрокаГУИД);
ДокументCOM = СсылкаCOM.ПолучитьОбъект();
Если ДокументCOM = Неопределено Тогда
ДокументCOM = ПодключеннаяБаза.Документы.ПеремещениеТоваров.СоздатьДокумент();
ДокументCOM.УстановитьСсылкуНового(СсылкаCOM);
КонецЕсли;
ДокументCOM.ОбменДанными.Загрузка = Истина;
ДокументCOM.Записать();
ОбменДанными.Загрузка = Истина перед записью объекта. Это отключает избыточные обработчики событий, ускоряет процесс и предотвращает непредвиденные проверки заполнения.ПолучитьОбъект() для каждой ссылки создаст значительные накладные расходы на COM-вызовы. Рекомендуется предварительно проверить наличие всех документов одним запросом к внешней базе, передав массив ссылок или строковых идентификаторов.