- Создание подключения к базе 1C по COM
- Найти документ 1С по COM
- com соединение
- Установить OLE соединение
- Установить COM соединение
- Строка подключения
- Разрыв соединения
- Метод NewObject()
- для V83.COMConnector
- для V83.Application
- Получение и сравнение перечисления через COM соединение
- Получение объекта через COM по идентификатору
Подключение к другой базе 1С 8 по COM-соединению — очень полезная вещь. В основном, эта функция необходима для обмена данными между конфигурациями.
Но по каким-то причинам у новичков часто возникают затруднения с этим несложным процессом. Ниже я подскажу способ решения этой проблемы на примере простой задачки.
Поставлена задача:
Из конфигурации «Документооборот» необходимо подключится к базе УПП:
- найти документ по заранее известному коду, допустим «123»;
- получить статус документа;
- если статус изменился, то поменять и в соответствующем документе «документооборота».
Реализация задачи:
Создание подключения к базе 1C по COM
Первым делом необходимо создать подключение к базе 1С 8.3, рассмотрим функцию, которая вернет подключение по ком-объекту к другой базе для файлового режима 1С:
Функция вернет СОМ-объект, с помощью которого можно производить действия с другой базой данных 1С 8.2.
Для клиент-серверного режима строка подключения будет немного отличаться:
Получите 267 видеоуроков по 1С бесплатно:
Если Вы подключаетесь к базе на платформе 1C 8.1, то Вам необходимо использовать не «V82.COMConnector», а «V81.COMConnector».
Найти документ 1С по COM
Для примера, пусть номер нужного документа будет «1234», а наш Документ-объект — «ДокументОбъект»:
Вот и все: мы подключились по COM, получили нужный документ, прочитали его статус и, если он отличается, установили статус нашему документу.
Другие статьи по 1С:
Видеоурок по подключению 1С 8.3 через COM:
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
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 соединение
Для сравнения значений элементов перечислений, определенных в конфигурации, необходимо выполнить преобразование этих элементов к одному из примитивных типов, сравнение которых не вызывает трудности. Такими типами могут быть либо числовой, либо строковый тип. Преобразовать значение элемента перечисления к числовому типу можно так
Если НомерЭлементаПеречисления = 0 Тогда Сообщить( “ЗначениеПеречисления1” );
ИначеЕсли НомерЭлементаПеречисления = 1 Тогда Сообщить (“ЗначениеПеречисления2”);
Получение объекта через COM по идентификатору
Через менеджеры объектов конфигурации получаем com объект, например :
ДокументCOM = Соединение . Документы . ИмяДокумента ;
Затем получаем строку уникального идентификатора :
СтрокаУИД = Соединение.string ( ДокументCOM.УникальныйИдентификатор ())
Затем в базе данных можно найти по ссылке нужный документ, таким образом
Идентификатор = Новый У никальныйИдентификатор(СтрокаУИД) ;
С сылкаПоИдентификатору = Документы[ИмяДокумента].ПолучитьСсылку(Идентификатор);
Если нужно найти com объект по документ по идентификатору, то тогда нужно написать так:
УидCOM = Соединение.NewObject (“УникальныйИдентификатор”, СтрокаУИД );
СсылкаПоИдентификатору = Соединение.Документы[ИмяДокумента].ПолучитьСсылку(УидCOM);
Для создания COM соединения с рабочей станции необходимо наличие в составе установки библиотеки comcntr.dll. Думаю об этом лишний раз напоминать не нужно.
Соответственно, для соединения с БД на различных серверных платформах необходимо иметь в комплекте библиотеки всех нужных версий.
Предполагается, что клиентские платформы установлены в стандартных каталогах и добраться до библиотек можно по пути типа: C:Program Files (x86)1cv828.2.18.61incomcntr.dll
Для начала создадим для коннектора обертку COM+, чтобы вызовы происходили не в контексте 1cv8.exe (1cv8c.exe), а в контексте dllhost.exe.
В интернете достаточно публикаций на тему как это сделать. Для начала можно указать comcntr любой имеющейся версии.
При регистрации comcntr.dll в реестре делается запись:
HKEY_CLASSES_ROOTCLSID<2B0C1632-A199-4350-AA2D-2AEE3D2D573A>InprocServer32 для 32 битной ОС
или HKEY_ >для 64 битной ОС
значение по умолчанию которой указывает на расположение загружаемой библиотеки: C:Program Files (x86)1cv82 8.2.18.61 incomcntr.dll
Этим значением мы и будем оперировать. Перед установкой соединения читаем реестр, проверяем текущую версию коннектора и при необходимости заменяем ее на требуемую. После установки соединения в память загружается dllhost.exe, в контексте которого и работает коннектор. Для инициализации соединения к другой базе (с отличающейся версией платформы), ранее отработавшую библиотеку нужно выгрузить из памяти. К сожалению, у меня не получилось сделать это более цивилизованно, чем taskkill.exe /f /im dllhost.exe . Наверняка можно что-то покрасивее придумать.
Ну и самое главное: не забываем, что работать это будет только при запуске 1С с административными правами. Иначе взлетит исключение.
В итоге получаем примерно такой код:
Сам вызов осуществляю примерно так:
Если два последовательных соединения требуют коннектора одной и той же версии, то модификации реестра не происходит и библиотека из памяти не выгружается, что несколько сокращает "накладные расходы".