v82Server.dll — Технология Microsoft COM+ для доступа к 1C82

Мгновенное подключение к базе 1С по OLE (COMConnector).  

Чуда нет. Просто подключение Вы организуете заранее.

 Я не являюсь автором идеи и привожу ссылку на первоисточник. Мой скромный вклад заключается в перекомпиляции библиотеки, первоначально предназначенной для 1С77 для использования с 1С81 и 1С82. Для тех же, кому лень читать 6 страниц обсуждения темы на приведенном форуме, постараюсь привести здесь выжимку из всех этих обсуждений.

1. Что это такое и зачем это нужно?

Когда мы соединяемся с базой 1С77 по OLE (с базой 1С8х через COMConnector) на соединение с базой уходит несколько секунд, что ограничивает область применения этой технологии. В обсуждениях мелькала идея о том, что было бы здорово иметь уже запущенный экземпляр 1С и с помощью какой-то внешней компоненты соединяться с ним и затем отсоединяться. Так как 1С уже запущена, соединение должно проходить значительно быстрее.

Собственно, v82Server.dll (как и v7Server.dll и v8Server.dll) ровно это и делает с использованием встроенной в ОС Windows технологии COM+. Причем COM+  дает нам дополнительные бонусы:

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

2. Есть возможность удаленного выполнения процедур, то есть сама v82Server.dll может располагаться на сервере, а на клиентском компьютере будет установлена сформированная подсистемой COM+ заглушка (stub), переадресующая вызовы на сервер.

 

 Как это применить? Ну, например, если у Вас уже есть сайт на PHP, то для организации взаимодействия с 1С вы можете написать:

Код PHP
 

 

2. Как настроить, чтобы это заработало?

— Создать COM+ приложение:

— Панель управления -> Администрирование -> Службы компонентов;

— найти в дереве консоли узел «Мой компьютер». Открыть свойства и проверить на закладке «Свойства по умолчанию», что на данном компьютере разрешено исполнение приложений DCOM. Если галочка не стоит, включить. 

— в дереве консоли найти узел «Мой компьютер — > Приложения Com+» и в контекстном меню этого узла выбрать Создать -> Приложение;

— в мастере установки нажать кнопку «создать новое приложение» и ввести имя приложения (например «v82Server»)
Способ активации выбрать «серверное приложение» и проклацать «далее» до завершения работы мастера.

— Создать компонент в приложении

— в только что созданном приложении найти группу «Компоненты» и в контекстном меню выбрать «Создать -> Компонент»

— в мастере установки компонентов нажать «Установка новых компонентов», указать путь к файлу v82Server.dll и нажать «Готово»

— в свойствах компонента, на закладке «Активация» включить группировку объектов в пул и указать минимальный и максимальный размер пула (например 1 и 3);

— включить флажок «Включить создание объектов» и в поле «строка конструктора» написать параметры строки соединения для V82.ComConnector (например: Srvr=»mysrvr»;Ref=»UPP»;Usr=remote;Pwd=123) (сразу замечу, что у пользователя remote в базе должны быть права на внешнее подключение);

— запустить приложение (через контекстное меню v82Server).
После этого в списке процессов должны появиться n процессов 1cv8.exe, где n-минимальный размер пула объектов, а если зайти в базу 1С и посмотреть список активных пользователей, то мы увидим n пользователей remote.

Каждый клиент, который пытается создать объект v82Server.Connection, будет получать его из пула объектов (если есть свободные объекты в пуле) и по окончании работы с ним будет возвращать объект в пул.
Проверить, что эта штука работает, можно при помощи скрипта:

set v82=CreateObject(«v82Server.Connection»)
MsgBox v82.UserName()
 

 

3. Как сделать, чтобы было соединение и с базой Бухгалтерии и с базой Торговли?

Создать 2 приложения COM+ с разными именами, например v8BUH и v8Trade. При создании компонентов указать соответствующую строку подключения. При программном создании объектов указывать имена «v8BUH.Connection» и «v8Trade.Connection»

 

4. Как сделать, чтобы я вызывал объект на локальном компьютере, а код исполнялся на удаленном?

— Зайти в консоль Службы компонентов (Панель управления -> Администрирование -> Службы компонентов) на сервере — компьютере, где уже установлено наше COM+ приложение, найти его в дереве, и щелкнув правой кнопкой мышки в контекстном меню выбрать «Экспорт».

— В открывшемся мастере выбрать «Прокси-приложение установка доступа с других компьютеров к этому» и назначить имя для файла MSI, который для Вас сформирует мастер.

— перенести сформированный мастером инсталляционный пакет на клиентский компьютер и установить.

— Установка требует прав администратора, поэтому я делал так:

— Запускаем консоль Службы компонентов от имени администратора.

— в дереве консоли находим узел «Мой компьютер — > Приложения Com+» и в контекстном меню этого узла выбираем Создать -> Приложение;

— в мастере установки нажимаем кнопку «Выбрать готовое приложение» и выбираем наш инсталляционный пакет.

— В консоли Службы компонентов клиентского компьютера должно появиться приложение COM+ с таким же именем, как и на сервере, но свойства его будут недоступны для изменения, кроме параметра «Имя удаленного сервера».

— перезапустить приложение COM+ в консоли сервера.

Проверить работу на клиенте можно также с помощью вышеприведенного скрипта. Код 1С82 должен выполняться и в том случае, если восьмерка на клиентском компьютере вообще не установлена.

 

PS. Я проверял работу данного компонента на MS Windows 2003 и XP. Возможно, что-то может не заработать. Это зависит от настроек безопасности в вашем домене.

Если нет домена, тогда удаленная работа с COM+ приложением будет возможна, если на сервере существует пользователь, под которым вы работаете на локальном компьютере, у него совпадает пароль с вашим, настроены права на DCOM и на использование данного приложения. В общем случае читайте справку в консоли «Службы компонентов». Там все достаточно детально описано. Кроме того, советую все же почитать ветку форума, указанную в начале статьи. В этой ветке можно найти также компоненты для доступа к 1С77 и к 1С81 с исходными текстами.


Удачи в экспериментах!

48 Comments

  1. alex_bob

    Мгновенное подключение к базе 1С по OLE (COMConnector).

    Перейти к публикации

    Reply
  2. cool.vlad4

    а можешь выложить исходники?

    Reply
  3. cleaner_it

    (1) Согласен, лишними не будут:)

    Reply
  4. alex_bob

    Исходники для 1С81 лежат здесь (см. ответ #78). Для 82 изменилось только наименование объекта и GUIDы. Для того, чтобы разобраться что к чему более чем достаточно. А что, есть какие-то идеи?

    Reply
  5. anton.fly7

    при обновлении конфиги сервер вырубает все подключения к базе, как потом эти remote пользователи пула подключатся обратно?

    Reply
  6. alex_bob
    anton.fly7 пишет:

    при обновлении конфиги сервер вырубает все подключения к базе, как потом эти remote пользователи пула подключатся обратно?

    Есть несколько вариантов.

    1. Ручками 🙂 То есть залезть в консоль Службы компонентов и выбрать в меню «Запустить».

    2. Скриптом. Все объекты доступны через WMI.

    set ComPlus = createobject(«COMAdmin.COMAdminCatalog»)
    set Pril=ComPlus.GetCollection(«Applications»)
    Pril.Populate()
    PrCount=pril.Count — 1
    for each f1 in Pril
    if f1.Name=»v82Server» then
    ComPlus.StartApplication(f1.Name)
    end if
    next 

    Показать

    Reply
  7. fishca

    1. 1С ушла от использования СОМ+ компонентов в 8.1

    2. на nix — не взлетит 🙂

    3. за развитие велосипеда +

    Reply
  8. alex_bob
    fishca пишет:

    1. 1С ушла от использования СОМ+ компонентов в 8.1

    2. на nix — не взлетит 🙂

    Да, согласен это не в русле тенденций развития 1С и даже Microsoft после COM+ уже выпустило 4 версии NET.

    Но если здесь и сейчас эта штука поможет кому-то решить его текущие проблемы, то это уже хорошо.

    fishca пишет:

    3. за развитие велосипеда +

    Я бы сказал, что это не велосипед, а молоток. И использование зависит от кривизны рук — можно пальцы отбить, а можно статую Аполлона вырубить.

    Reply
  9. marsohod

    (3) размер отличается почти в два раза — v8Server.dll весит 53248 байт, а v82Server.dll — 98304 байт. Присоединяюсь к просьбе выложить исходники по причине элементарной осторожности 🙂

    Reply
  10. kapustinag
    fishca пишет:

    1. 1С ушла от использования СОМ+ компонентов в 8.1


    При переходе от 8.1 на 8.2 замедлился вход пользователя в 1С (на одном и том же железе), это видно невооруженным глазом. Если разработчики 1С не хотят / не могут ничего с этим поделать, что ж…очень жаль.

    Поэтому хочется плюсовать разработки, позволяющие этот самый вход ускорить. Если архитектура {Клиентское приложение — Сервер 1С — Сервер БД} не позволяет достичь приемлемой производительности, то это могло бы быть еще одним, четвертым, звеном в клиент-серверной архитектуре 1С. COM+ или NET — это уже другой вопрос.

    Reply
  11. alex_bob
    marsohod пишет:

    (3) alex_bob, размер отличается почти в два раза — v8Server.dll весит 53248 байт, а v82Server.dll — 98304 байт. Присоединяюсь к просьбе выложить исходники по причине элементарной осторожности 🙂

    Размер сырцов изменился, так как изменилась опция сборки проекта с /MD на /MT. Если вы читали форум, я там спрашивал, каким образом избавиться от зависимости от CRT для VC80 (библиотеки msvcp80.dll, msvcr.dll и vcomp.dll с манифестами) при переносе прокси-приложения на удаленный компьютер.

    Оказалось, что с опцией /MT приложение линкуется с CRT статически.

    Reply
  12. dandrontiy
    alex_bob пишет:

    (см. ответ #78). Для 82 изменилось только наименование объекта и GUIDы. Для того, чтобы разобраться что к чему более чем достаточно. А что, есть какие-то идеи?

    Ответили: (8) (10)

    Что то я там исходника не нашел. DLL — на чем написана и откомпилирована ?

    Reply
  13. alex_bob
    dandrontiy пишет:

    Что то я там исходника не нашел. DLL — на чем написана и откомпилирована?

    Наверное плохо искали. Написано на С++.

    Reply
  14. lustin

    (12) Алексей, плюс поставил — считаю отличная работа.

    также я там на форуме 1С++ (ссылка на сообщение) парочку вопросов задал, если будет время ответишь ?

    Reply
  15. andboss

    В 8.2 все это реализуется штатно через Менеджер COM-соединений

    Reply
  16. alex_bob

    Извиняюсь, но «все это» что? Менеджер COM-соединений дает после установки внешнего соединения подключаться/отключаться к себе внешним процессам? Или обеспечивает удаленное исполнение методов?

    Собственно компонента и использует внутри менеджер COM-соединений. Только он готовит внешнее соединение заранее и предоставляет его вызывающему процессу минуя длительную стадию подключения.

    Грубо говоря — подключился, провел документ, отключился (освободил соединение для другого пользователя).

    Reply
  17. opiumdx

    Полезная статья!

    Reply
  18. Karglak

    Отличная штука, а вот если мы из 1С подключаемся к 1С, возможно проще записывать подключение в глобальную переменную?

    Reply
  19. vladen

    мог бы- поставил бы три плюса.

    Спасибо.

    Reply
  20. petrovaUL

    Полезно

    Reply
  21. maksar

    хорошая статья, спасибо

    Reply
  22. AlexO

    а вообще просто заранее открыть соединение и ждать, когда будет обмен? не мгновенно будет?

    одно дело — 77, а здесь это похоже на масло масленное….

    Reply
  23. alex_bob

    (17)(21)

    Да, возможен и такой режим работы и он подходит для обменов и административных нужд. Я же говорю о другом режиме работы, когда созданное соединение может использоваться в разных сеансах разных внешних приложений. Наиболее наглядный пример — взаимодействие с web-сайтом. Пользователь зашел на web-сайт (подключения к 1с нет). Пользователь выбрал в меню просмотр каталога товаров (подключился к 1с, выбрал запросом товары, вывел на html-страничку, отключился). Пользователь 2 в это время оформлял заказ. Нажал на кнопку ОК (подключился к 1с, создал и записал документ, отключился). Таким образом, пула из 2х соединений будет достаточно для обслуживания десятка пользователей, одновременно присутствующих на сайте.

    Reply
  24. AlexO

    (22)

    не получится, там, по-моему (я не испытывал на примере) одна авторизация — одна сессия. Т.е. подключения разные.

    а это непреодолимо.

    Reply
  25. DMSDeveloper

    (23) AlexO, Вы не то что не испытывали на примере, вы еще и читали не внимательно. Получившаяся Com+ публикация в момент своего старта запускает сессию V82ComConnector’а под указанным в настройках пользователем и все подключения и операции выполняются от имени этого пользователя.

    На одной сессии. Если пул приложений настроен на 1 сессию.

    (0) Автору творения Мега респект. Пригодилась.

    Reply
  26. Созинов

    Вопрос от безысходности. Пол дня сижу с этой проблемой. Поможет ли мне данная компонента в следующей ситуации:

    на сервере 2 версии платформы: 8.2.14.533 (порт 1641) (пусть будет сервер1) и 8.2.13.219 (порт 1741) (пусть будет сервер2). Мне необходимо установить com подключение. Конфигурация, из которой проводится подключение на платформе 8.2.14.533. К серверу1 подключаюсь нормально, данные забираю. К серверу2 не могу. Регистрация comcntr.dll от 8.2.13.219 не помогает. Пишет следущее:


    (V82.COMConnector.1): Несоответствие версий клиента и сервера 1С:Предприятия

    Различаются версии клиента и сервера (8.2.14.533 — 8.2.13.219), клиентское приложение: COM-соединение

    Смогу ли я вытащить данные через эту компоненту, или все будет так же.

    Еще раз прошу прощения за свой вопрос. Судя по всему не получится, но вдруг (с технологией COM+ не знаком толком).

    Reply
  27. alex_bob

    Возможно у Вас ошибка в строке подключения через COM к конфигурации 8.2.13? Нужно указывать явно номер порта через двоеточие после имени сервера.

    Reply
  28. nick_krsk

    Подскажите, пожалуйста, вот по какому вопросу:как передать параметры в вызываемую глобальную функцию?

    $v7 = new COM(«v7AppServer.Connection»);

    echo $v7->AppDispatch->EvalExpr(«glTest(‘777’,’тестовая строка'»); — так не получается

    Reply
  29. alex_bob

    Это PHP?

    Давно с ним не работал.

    Во-первых, должно работать без AppDispatch.

    Во-вторых, строку внутри EvalExpr должна разбирать сама 1С, а она апострофы не понимает, только кавычки.

    В-третих, где закрывающая скобка для glTest?

    Так что наверно:

    echo $v7->EvalExpr(«glTest(«777″,»тестовая строка»)»);

    Reply
  30. AlexO

    (24) Padonak-XXI,

    На одной сессии. Если пул приложений настроен на 1 сессию.

    Вы сами-то поняли, что написали? Я сказал — один пользователь — одна сессия. Второй к ней не подключится. А то пишут тут про какие-то «пул приложений.. на одну сессию»

    Набор слов в предложении. Разберитесь сначала.

    Reply
  31. vladen

    А на 8,3,4 работать будет? Может кто пользовался на новой платформе?

    Reply
  32. БизнесРешение

    Создал Приложение, создал Компоненту — всё ОК! Запустил Процесс — тоже ОК, значок появился.

    НО! никакого пользователя (заданного «Админ») в списке активных пользователей 1С не появилось.

    Естественно строку Srvr=»1C-Server»; Ref=»TEST»; Usr=Админ; Pwd=111 на предмет правильности имён и паролей перепроверил несколько раз!

    Почему такое может быть, не подскажите?? 🙁

    Reply
  33. alex_bob

    (31) БизнесРешение,

    Соединение через V82.ComConnector с такой строкой соединения работает?

    Reply
  34. БизнесРешение

    Да, конечно!

    V82.ComConnector и так работает Srvr=»1C-Server»; Ref=»TEST»; Usr=Админ; Pwd=111 и так работает Srvr=1C-Server; Ref=TEST; Usr=Админ; Pwd=111

    И COM-соединение создаётся.

    Но мой первый вопрос НЕ про создание объекта {Новый COMObject(«V82.COMConnector»)} или {Новый COMОбъект(«V82Server.Connection»)}, а просто про запуск СОМ-Приложения и появления после этого запуска активного пользователя «Админ» в базе 1С.

    Reply
  35. БизнесРешение

    Картинки по настройки «Службы компонентов.jpg» и свойства самой Компоненты «V82Server.Connection.1» прикладываю (Безопасность.jpg и Активация.jpg).

    Windows Server 2012 R2.

    Хотел спросить: на закладке «Безопасность» нужно ставить галочки?

    Вот видите — всё вроде красиво, а активного пользователя «Админ» в базе 1С не появляется 🙁

    Reply
  36. БизнесРешение

    Так подскажите, что нам делать?? Ваша идея с COM+ очень нужная для нашей реализации!

    Reply
  37. alex_bob

    (35) БизнесРешение,

    Операционка и 1С случайно не 64разрядные? Я тестировал компоненту только на 32-разрядных системах.

    Reply
  38. БизнесРешение

    «К сожалению» ДА! 🙁

    Reply
  39. БизнесРешение

    Не получится в этом случае запустить?! 🙁

    Reply
  40. alex_bob

    (38) БизнесРешение,

    Посмотрите по ссылке здесь

    Reply
  41. БизнесРешение

    Установка галочек Авторизации и Владельцев в «Службы компонентов» НИ К ЧЕМУ НЕ ПРИВЕЛА 🙁

    А вот скажите — у Вас срабатывает «Повторный запуск» (как на картинке)? =>> у меня немного думает… и потом отключается из «Работающих процессов» 🙁

    Reply
  42. БизнесРешение

    И ещё вопрос.

    Всё-таки пользователь (ваш — remote или наш — Админ) должен появиться в списке активных пользователей сразу после запуска компоненты,

    т.е. ещё ДО создания COMОбъекта «COMConnector» из языка. Правильно?!

    Reply
  43. avz_1C

    Спасибо.

    Ставлю «+».

    Пригодилось, как наводка на решение в нескольких «зависших» проектах.

    Reply
  44. Tsarev_Vladimir@mail.ru

    Ole := CreateOLEObject(‘v82Server.Connection’);

    Произошла ошибка активации COM+ из-за сбоя функции инициализации. Дополнительная информация содержится в журнале ошибок.

    Reply
  45. sorb

    А для 8.3 готовое есть? Исходники посмотрел, вроде как достаточно clsid заменить и V81.COMConnector на V83.COMConnector заменить, но сейчас под рукой нет установленной ide,чтоб собрать…

    Reply
  46. tormozit

    Где взять последние исходники? Форум на 1cpp.ru похоже поломался (дальше 3-й страницы тем все пусто).

    Reply
  47. wunderland

    Хорошая штука. Жаль что мне раньше не попалось, когда нужно было из 8 на 7.7 ходить

    Reply
  48. tailer2

    Ну, то есть на 8.3 не будет, так?

    Reply

Leave a Comment

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