С помощью COM и OLE соединения можно из одной базы 1С подключиться к другой и прочитать или записать данные.
Пользоваться этим методом можно как в клиент-серверных вариантах баз, так и в файловых базах.
Существует два вида COM объектов для приложения 1С:
Ole соединение V83.Application
Com соединение V83.COMConnector
В случае с V83.Application запускается практически полноценный экземпляр приложения 1С. В случае использования V83.COMConnector запускается небольшая серверная часть. Скорость работы в этом случае выше, но некоторые функции могут быть недоступны.
В частности работа с формами и с общими модулями для которых, не установлено свойство работы с внешними соединениями. По большей части нужно использовать V83.COMConnector и только в случае нехватки функционала V83.Application.
Особенно сильно разница в скорости работы может быть заметна на базах большого объема.
Для платформы 1С 8.2 используется V82.Application или V82.COMConnector
Работу COM и OLE соединений к базе 1С 8 рассмотрим подробно:
Установить OLE соединение к 1С 8
1 |
Соединение = Новый COMОбъект("V83.Application"); |
Установить COM соединение к 1С 8
1 |
Соединение = Новый COMОбъект("V83.COMConnector"); |
Строка подключения к 1С 8
1 2 3 4 5 6 7 8 9 10 11 |
//Для варианта клиент - сервер СтрокаСоединения = "Srvr = ""ИмяСервера"";Ref = ""ИмяБазы""; Usr = ИмяПользователя; Pwd = Пароль"; //Для варианта файлового режима: СтрокаСоединения = "File = ""ПутьКБазе""; Usr = ИмяПользователя; Pwd = Пароль"; Попытка Подключение = Соединение.Connect(СтрокаСоединения); Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не удалось подключиться к базе" + ОписаниеОшибки(); Сообщение.Сообщить(); КонецПопытки; |
Разрыв соединения с 1С 8
1 |
Соединение = Неопределено; |
Для объекта V83.Application выполнять разрыв соединения обязательно, в противном случае останется висеть незавершенный сеанс, который потом придется удалять вручную. В случае с V83.COMConnector соединение разрывается автоматически при завершении процедуры в которой выполнялось подключение.
И есть еще один маленький момент. Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках.
Метод NewObject()
Для создания нового объекта можно воспользоваться методом NewObject(), например:
для V83.COMConnector
1 2 3 4 |
ЗапросCOM = Подключение.NewObject("Запрос"); ТаблицаCOM = Подключение.NewObject("ТаблицаЗначений"); МассивCOM = Подключение.NewObject("Массив"); УидCOM =Подключение.NewObject("УникальныйИдентификатор", СтрокаУИД); |
для V83.Application
1 2 3 4 |
ЗапросOLE = Соединение.NewObject("Запрос"); ТаблицаOLE = Соединение.NewObject("ТаблицаЗначений"); МассивOLE = Соединение.NewObject("Массив"); УидCOM =Соединение.NewObject("УникальныйИдентификатор", СтрокаУИД); |
После создания Com объекта можно далее работать с ним, например
1 2 3 4 5 6 7 8 9 10 |
ЗапросCOM.Текст ="ВЫБРАТЬ | ДолжностиОрганизаций.Код, | ДолжностиОрганизаций.Наименование |ИЗ | Справочник.ДолжностиОрганизаций КАК ДолжностиОрганизаций"; Результат = ЗапросCOM.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл КонецЦикла; |
Можно также использовать менеджеры объектов конфигурации:
1 2 3 |
СправочникCOM = Подключение.Справочники.ИмяСправочника; ДокументCOM = Подключение.Документы.ИмяДокумента; РегистрCOM = Подключение.РегистрыСведений.ИмяРегистра; |
Получение и сравнение перечисления через COM соединение
Для сравнения значений элементов перечислений, определенных в конфигурации, необходимо выполнить преобразование этих элементов к одному из примитивных типов, сравнение которых не вызывает трудности. Такими типами могут быть либо числовой, либо строковый тип. Преобразовать значение элемента перечисления к числовому типу можно так:
1 2 3 4 5 6 |
ЭлементПеречисления = Подключение.Справочники.Справочник1.НайтиПоКоду(1).Реквизит1; ВозможныеЗначения = ЭлементПеречисления.Метаданные().ЗначенияПеречисления; НомерЭлементаПеречисления = ВозможныеЗначения.Индекс(ВозможныеЗначения.Найти(Соединение.XMLString(ЭлементПеречисления))); Если НомерЭлементаПеречисления = 0 Тогда Сообщить("ЗначениеПеречисления1"); ИначеЕсли НомерЭлементаПеречисления = 1 Тогда Сообщить("ЗначениеПеречисления2"); КонецЕсли; |
Получение объекта через COM по идентификатору
Через менеджеры объектов конфигурации получаем com объект, например :
1 2 3 4 5 6 7 8 9 10 11 12 |
ДокументCOM = Соединение.Документы.ИмяДокумента; //Затем получаем строку уникального идентификатора : СтрокаУИД = Соединение.string(ДокументCOM.УникальныйИдентификатор()); //Затем в базе данных можно найти по ссылке нужный документ, таким образом Идентификатор = Новый УникальныйИдентификатор(СтрокаУИД); СсылкаПоИдентификатору = Документы[ИмяДокумента].ПолучитьСсылку(Идентификатор); //Если нужно найти com объект по документ по идентификатору, то тогда нужно написать так: УидCOM = Соединение.NewObject("УникальныйИдентификатор",СтрокаУИД); СсылкаПоИдентификатору = Соединение.Документы[ИмяДокумента].ПолучитьСсылку(УидCOM); |