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

image_pdfimage_print

Печать (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

ЗапросCOM = Подключение.NewObject(“Запрос); 
ТаблицаCOM = Подключение.NewObject(“ТаблицаЗначений”);
МассивCOM = Подключение.NewObject(“Массив”);

УидCOM =Подключение.NewObject(“УникальныйИдентификатор”,СтрокаУИД);

 для V83.Application

Запрос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);

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

    • master1c8

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

  1. Ирина

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

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

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