Обмен данными между базами 1С через COM соединение

Печать (Ctrl+P)

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

Com соединение

Можно создать два вида COM объектов для приложения 1С. Это ole соединения  V83.Application и  com соединения  V83.COMConnector. В случае с V83.Application запускается практически полноценный экземпляр приложения 1С. В случае использования V83.COMConnector запускается небольшая серверная часть. Скорость работы в этом случае выше, но некоторые функции могут быть недоступны. В частности работа с формами и с общими модулями для которых не установлено свойство работы с внешними соединениями. Преимущественно надо использовать V83.COMConnector и только в случае нехватки функционала V83.Application. Особенно сильно разница в скорости работы может быть заметна на базах большого объема. Для платформе 8.2 используется V82.Application или V82.COMConnector

Установить OLE соединение

 Соединение = Новый COMОбъект("V83.Application"); 

Установить COM соединение

 Соединение = Новый COMОбъект("V83.COMConnector"); 

Строка подключения

 //Для варианта клиент- сервер
СтрокаСоединения = "Srvr = ""ИмяСервера"";Ref = ""ИмяБазы""; Usr = ИмяПользователя; Pwd = Пароль";
//Для варианта файлового режима:
СтрокаСоединения = "File = ""ПутьКБазе""; Usr = ИмяПользователя; Pwd = Пароль";
 Попытка 
Подключение = Соединение.Connect(СтрокаСоединения);
Исключение 
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось подключиться к базе" + ОписаниеОшибки(); Сообщение.Сообщить();
КонецПопытки; 

Разрыв соединения

 Соединение = Неопределено; 

Для объекта V83.Application выполнять разрыв соединения обязательно, в противном случае останется висеть незавершенный сеанс, который потом придется удалять вручную. В случае с V83.COMConnector соединение разрывается автоматически при завершении процедуры в которой выполнялось подключение.И есть еще один маленький момент. Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках.

Метод NewObject()

Для создания нового объекта  можно воспользоваться методом NewObject(), например: 

 // для V83.COMConnector
 Подключение = Соединение.Connect(СтрокаСоединения); 
 ЗапросCOM = Подключение.NewObject("Запрос"); 
ТаблицаCOM = Подключение.NewObject("ТаблицаЗначений");
МассивCOM = Подключение.NewObject("Массив");
УидCOM =Подключение.NewObject("УникальныйИдентификатор",СтрокаУИД); 

 //для V83.Application
 Соединение = Новый COMОбъект("V83.COMConnector");  
ЗапросOLE = Соединение.NewObject("Запрос"); 
ТаблицаOLE = Соединение.NewObject("ТаблицаЗначений");
МассивOLE = Соединение.NewObject("Массив");
УидCOM =Соединение.NewObject("УникальныйИдентификатор",СтрокаУИД); 

После создания Com объекта можно далее работать с ним, например

 ЗапросCOM.Текст ="ВЫБРАТЬ
| ДолжностиОрганизаций.Код,
| ДолжностиОрганизаций.Наименование
|ИЗ 
| Справочник.ДолжностиОрганизаций 
КАК ДолжностиОрганизаций";
Результат = ЗапросCOM.Выполнить(); 
Выборка = Результат.Выбрать(); 
Пока Выборка.Следующий() Цикл
// ........
КонецЦикла; 

Можно также использовать менеджеры объектов конфигурации:

 СправочникCOM = Подключение.Справочники.ИмяСправочника; 
 ДокументCOM = Подключение.Документы.ИмяДокумента; 
 РегистрCOM = Подключение.РегистрыСведений.ИмяРегистра; 

Получение и сравнение перечисления через COM соединение

Для сравнения значений элементов перечислений, определенных в конфигурации, необходимо выполнить преобразование этих элементов к одному из примитивных типов, сравнение которых не вызывает трудности. Такими типами могут быть либо числовой, либо строковый тип. Преобразовать значение элемента перечисления к числовому типу можно так

 ЭлементПеречисления = Подключение.Справочники.Справочник1.НайтиПоКоду(1).Реквизит1;
 ВозможныеЗначения = ЭлементПеречисления.Метаданные().ЗначенияПеречисления;
 НомерЭлементаПеречисления = ВозможныеЗначения.Индекс(ВозможныеЗначения.Найти(Соединение.XMLString(ЭлементПеречисления)));
 Если НомерЭлементаПеречисления = 0 Тогда
   Сообщить("ЗначениеПеречисления1");
 ИначеЕсли НомерЭлементаПеречисления = 1 Тогда
   Сообщить("ЗначениеПеречисления2");
 КонецЕсли; 

Получение объекта через COM по идентификатору

Через  менеджеры объектов конфигурации получаем com объект, например :

 ДокументCOM = Соединение.Документы.ИмяДокумента; 

Затем получаем строку уникального идентификатора :

 СтрокаУИД=Соединение.string(ДокументCOM.УникальныйИдентификатор()); 

Затем в базе данных можно найти по ссылке нужный документ, таким образом:

 Идентификатор= Новый УникальныйИдентификатор(СтрокаУИД);
СсылкаПоИдентификатору = Документы[ИмяДокумента].ПолучитьСсылку(Идентификатор); 

Если нужно найти com объект по идентификатору,  то тогда нужно написать так:

 УидCOM = Соединение.NewObject("УникальныйИдентификатор",СтрокаУИД);
СсылкаПоИдентификатору = Соединение.Документы[ИмяДокумента].ПолучитьСсылку(УидCOM); 

Previous Article
Next Article

4 Replies to “Обмен данными между базами 1С через COM соединение”

    • master1c8

      Эта статья не имеет оригинального текста. Она написана специально для пользователя, который задал мне вопрос. Пользователи, с которыми я работают, часто задают мне вопросы. Если у меня нет времени ответить им оригинальным текстом, то ищу текст ответа по найденным материалам в интернете .

  1. Ирина

    Спасибо за статью. Есть проблема с создании документа ЗаказПокупателя в подключенной по COMObject базе. Документ Реализация ТоваровУслуг спокойно создается и заполняется, а для ЗаказПокупателя.СоздатьДокумент() пишет : “Ошибка при вызове метода контекста (СоздатьДокумент)”. В чеи может быть причина?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.