1С как проверить 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. Думаю об этом лишний раз напоминать не нужно.

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

Читайте также:  Спирт в 5 литровых бутылках

Предполагается, что клиентские платформы установлены в стандартных каталогах и добраться до библиотек можно по пути типа: 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С с административными правами. Иначе взлетит исключение.

В итоге получаем примерно такой код:

Сам вызов осуществляю примерно так:

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

Оцените статью
Добавить комментарий

Adblock detector