Как через COM-соединение создать новый документ с заданным GUID в 1С

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

При организации обмена данными между базами 1С через COM-соединение часто требуется переносить документы так, чтобы их уникальные идентификаторы (GUID) в базе-приемнике в точности совпадали с идентификаторами в базе-источнике. На практике разработчики часто сталкиваются с ошибками вызова методов ПолучитьСсылку и УстановитьСсылкуНового. Разберем по шагам, почему возникают эти ошибки и как правильно реализовать данный алгоритм.

Типичные ошибки при установке GUID через COM

Проанализируем основные причины сбоев, возникающих при попытке присвоить идентификатор объекту в подключенной базе:

  1. Вызов метода не у того объекта. Ошибка Метод объекта не обнаружен (ПолучитьСсылку) происходит, когда метод вызывается у объекта документа (ДокументОбъект), тогда как метод ПолучитьСсылку() принадлежит менеджеру соответствующего документа (ДокументМенеджер).
  2. Несоответствие типов контекста. Метод УстановитьСсылкуНового() ожидает ссылку типа целевой базы (ДокументСсылка), а не строковый GUID или локальный объект УникальныйИдентификатор базы-источника. Передача строки или ссылки из другой базы вызывает ошибку Несоответствие типов.
  3. Использование стандартного строкового представления. Метод Строка() для ссылки может возвращать представление документа (номер и дату), а не GUID. Для получения строкового UUID необходимо использовать функцию XMLСтрока() или обращаться к Ссылка.УникальныйИдентификатор().
  4. Логические ошибки обхода и неуникальность записи. Ошибка Ошибка при попытке вставки записи с неуникальным значением ссылки часто возникает из-за неверной структуры циклов поиска, когда код многократно пытается создать и записать документ с одним и тем же GUID.

Корректный шаблон создания документа по GUID через менеджер

Разберем правильную последовательность действий для поиска и создания документа в подключенной базе через менеджер объекта:

  1. Получаем строковый GUID документа из базы-источника.
  2. Создаем объект УникальныйИдентификатор в контексте COM-базы с помощью метода NewObject.
  3. Получаем ссылку через менеджер документов базы-приемника: ПодключеннаяБаза.Документы[ИмяДокумента].ПолучитьСсылку(...).
  4. Проверяем существование объекта через вызов ПолучитьОбъект() у полученной ссылки. Если объект не существует, метод вернет Неопределено.
  5. Если объект отсутствует, создаем новый документ методом СоздатьДокумент() и связываем его с подготовленной ссылкой через УстановитьСсылкуНового().

Посмотрим на пример кода:


// 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.Записать();

Альтернативный способ: получение ссылки через XML-сериализацию

Рассмотрим еще один компактный способ формирования ссылки в удаленной базе. Вместо явного создания объекта УникальныйИдентификатор через COM можно применить метод XMLЗначение:


СтрокаГУИД = XMLСтрока(ДокументИсточник.УникальныйИдентификатор());
СсылкаCOM = ПодключеннаяБаза.XMLЗначение(ПодключеннаяБаза.Тип("ДокументСсылка.ПеремещениеТоваров"), СтрокаГУИД);

ДокументCOM = СсылкаCOM.ПолучитьОбъект();
Если ДокументCOM = Неопределено Тогда
    ДокументCOM = ПодключеннаяБаза.Документы.ПеремещениеТоваров.СоздатьДокумент();
    ДокументCOM.УстановитьСсылкуНового(СсылкаCOM);
КонецЕсли;

ДокументCOM.ОбменДанными.Загрузка = Истина;
ДокументCOM.Записать();

Рекомендации по оптимизации обмена через COM

  1. Отключение проверок и подписок. Всегда устанавливайте свойство ОбменДанными.Загрузка = Истина перед записью объекта. Это отключает избыточные обработчики событий, ускоряет процесс и предотвращает непредвиденные проверки заполнения.
  2. Пакетная проверка наличия. Если необходимо перенести большой массив документов, вызов ПолучитьОбъект() для каждой ссылки создаст значительные накладные расходы на COM-вызовы. Рекомендуется предварительно проверить наличие всех документов одним запросом к внешней базе, передав массив ссылок или строковых идентификаторов.
  3. Учет разрядности и платформы. COM-коннектор работает только в среде Windows и требует одинаковой разрядности клиента и зарегистрированной COM-библиотеки (32-bit или 64-bit). Для более гибкого обмена рекомендуется передавать данные через HTTP-сервисы базы-приемника.
← На главную