IE 2016

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

Опубликовал alex_bob в раздел Программирование - Внешние компоненты

Мгновенное подключение к базе 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 с исходными текстами.


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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
v82Server.dll
.dll 96,00Kb
10.10.11
129
.dll 96,00Kb 129 Скачать

См. также

Лучшие комментарии

45. tormozit 17.01.2016 16:05
Где взять последние исходники? Форум на 1cpp.ru похоже поломался (дальше 3-й страницы тем все пусто).
+ 2 [ sanfoto; Asmody; ]
# Ответить

Комментарии

1. cool.vlad4 10.10.2011 23:17
а можешь выложить исходники?
Ответили: (2)
# Ответить
2. cleaner_it 11.10.2011 05:03
(1) Согласен, лишними не будут:)
# Ответить
3. alex_bob 11.10.2011 08:06
Исходники для 1С81 лежат здесь (см. ответ #78). Для 82 изменилось только наименование объекта и GUIDы. Для того, чтобы разобраться что к чему более чем достаточно. А что, есть какие-то идеи?
Ответили: (8) (10)
# Ответить
4. anton.fly7 11.10.2011 08:13
при обновлении конфиги сервер вырубает все подключения к базе, как потом эти remote пользователи пула подключатся обратно?
# Ответить
5. alex_bob 11.10.2011 08:49
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 
...Показать Скрыть
# Ответить
6. fishca 11.10.2011 09:06
1. 1С ушла от использования СОМ+ компонентов в 8.1
2. на nix - не взлетит :)
3. за развитие велосипеда +
# Ответить
7. alex_bob 11.10.2011 09:33
fishca пишет:

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

Да, согласен это не в русле тенденций развития 1С и даже Microsoft после COM+ уже выпустило 4 версии NET.
Но если здесь и сейчас эта штука поможет кому-то решить его текущие проблемы, то это уже хорошо.

fishca пишет:

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

Я бы сказал, что это не велосипед, а молоток. И использование зависит от кривизны рук - можно пальцы отбить, а можно статую Аполлона вырубить.
# Ответить
8. marsohod (файл скачал) 11.10.2011 13:39
(3) alex_bob, размер отличается почти в два раза - v8Server.dll весит 53248 байт, а v82Server.dll - 98304 байт. Присоединяюсь к просьбе выложить исходники по причине элементарной осторожности :)
Ответили: (11)
# Ответить
9. kapustinag 11.10.2011 14:27
fishca пишет:
1. 1С ушла от использования СОМ+ компонентов в 8.1
...


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

Поэтому хочется плюсовать разработки, позволяющие этот самый вход ускорить. Если архитектура {Клиентское приложение - Сервер 1С - Сервер БД} не позволяет достичь приемлемой производительности, то это могло бы быть еще одним, четвертым, звеном в клиент-серверной архитектуре 1С. COM+ или NET - это уже другой вопрос.
# Ответить
10. alex_bob 11.10.2011 14:49
marsohod пишет:

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


Размер сырцов изменился, так как изменилась опция сборки проекта с /MD на /MT. Если вы читали форум, я там спрашивал, каким образом избавиться от зависимости от CRT для VC80 (библиотеки msvcp80.dll, msvcr.dll и vcomp.dll с манифестами) при переносе прокси-приложения на удаленный компьютер.
Оказалось, что с опцией /MT приложение линкуется с CRT статически.
Ответили: (11)
# Ответить
11. dandrontiy 19.10.2011 15:21
alex_bob пишет:
(см. ответ #78). Для 82 изменилось только наименование объекта и GUIDы. Для того, чтобы разобраться что к чему более чем достаточно. А что, есть какие-то идеи?
Ответили: (8) (10)


Что то я там исходника не нашел. DLL - на чем написана и откомпилирована ?
# Ответить
12. alex_bob 19.10.2011 16:05
dandrontiy пишет:
Что то я там исходника не нашел. DLL - на чем написана и откомпилирована?


Наверное плохо искали. Написано на С++.
Ответили: (13)

Прикрепленные файлы:

source.PNG
# Ответить
13. desty (файл скачал) 27.10.2011 12:25
(12) Алексей, плюс поставил - считаю отличная работа.

также я там на форуме 1С++ (ссылка на сообщение) парочку вопросов задал, если будет время ответишь ?
# Ответить
14. andboss 28.10.2011 09:04
В 8.2 все это реализуется штатно через Менеджер COM-соединений
# Ответить
15. alex_bob 28.10.2011 10:54
Извиняюсь, но "все это" что? Менеджер COM-соединений дает после установки внешнего соединения подключаться/отключаться к себе внешним процессам? Или обеспечивает удаленное исполнение методов?
Собственно компонента и использует внутри менеджер COM-соединений. Только он готовит внешнее соединение заранее и предоставляет его вызывающему процессу минуя длительную стадию подключения.
Грубо говоря - подключился, провел документ, отключился (освободил соединение для другого пользователя).
# Ответить
16. opiumdx 28.10.2011 14:53
Полезная статья!
# Ответить
17. Karglak 31.10.2011 09:25
Отличная штука, а вот если мы из 1С подключаемся к 1С, возможно проще записывать подключение в глобальную переменную?
Ответили: (22)
# Ответить
18. vladen (файл скачал) 01.11.2011 11:10
мог бы- поставил бы три плюса.
Спасибо.
# Ответить
19. petrovaUL 14.11.2011 08:45
Полезно
# Ответить
20. maksar 25.11.2011 03:24
хорошая статья, спасибо
# Ответить
21. AlexO 01.12.2011 01:18
а вообще просто заранее открыть соединение и ждать, когда будет обмен? не мгновенно будет?
одно дело - 77, а здесь это похоже на масло масленное....
Ответили: (22)
# Ответить
22. alex_bob 01.12.2011 11:42
(17)(21)
Да, возможен и такой режим работы и он подходит для обменов и административных нужд. Я же говорю о другом режиме работы, когда созданное соединение может использоваться в разных сеансах разных внешних приложений. Наиболее наглядный пример - взаимодействие с web-сайтом. Пользователь зашел на web-сайт (подключения к 1с нет). Пользователь выбрал в меню просмотр каталога товаров (подключился к 1с, выбрал запросом товары, вывел на html-страничку, отключился). Пользователь 2 в это время оформлял заказ. Нажал на кнопку ОК (подключился к 1с, создал и записал документ, отключился). Таким образом, пула из 2х соединений будет достаточно для обслуживания десятка пользователей, одновременно присутствующих на сайте.
Ответили: (23)
# Ответить
23. AlexO 02.12.2011 22:34
(22) alex_bob,
не получится, там, по-моему (я не испытывал на примере) одна авторизация - одна сессия. Т.е. подключения разные.
а это непреодолимо.
Ответили: (24)
# Ответить
24. Padonak-XXI (файл скачал) 29.05.2012 15:02
(23) AlexO, Вы не то что не испытывали на примере, вы еще и читали не внимательно. Получившаяся Com+ публикация в момент своего старта запускает сессию V82ComConnector'а под указанным в настройках пользователем и все подключения и операции выполняются от имени этого пользователя.
На одной сессии. Если пул приложений настроен на 1 сессию.

(0) Автору творения Мега респект. Пригодилась.
Ответили: (29)
# Ответить
25. EfiopReal 01.08.2012 17:05
Вопрос от безысходности. Пол дня сижу с этой проблемой. Поможет ли мне данная компонента в следующей ситуации:
на сервере 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+ не знаком толком).
# Ответить
26. alex_bob 02.08.2012 13:48
Возможно у Вас ошибка в строке подключения через COM к конфигурации 8.2.13? Нужно указывать явно номер порта через двоеточие после имени сервера.
# Ответить
27. Karambol 20.02.2013 13:29
Подскажите, пожалуйста, вот по какому вопросу:как передать параметры в вызываемую глобальную функцию?

$v7 = new COM("v7AppServer.Connection");
echo $v7->AppDispatch->EvalExpr("glTest('777','тестовая строка'"); - так не получается
# Ответить
28. alex_bob 20.02.2013 17:23
Это PHP?

Давно с ним не работал.
Во-первых, должно работать без AppDispatch.
Во-вторых, строку внутри EvalExpr должна разбирать сама 1С, а она апострофы не понимает, только кавычки.
В-третих, где закрывающая скобка для glTest?
Так что наверно:

echo $v7->EvalExpr("glTest(\"777\",\"тестовая строка\")");
# Ответить
29. AlexO 25.03.2014 21:52
(24) Padonak-XXI,
На одной сессии. Если пул приложений настроен на 1 сессию.

Вы сами-то поняли, что написали? Я сказал - один пользователь - одна сессия. Второй к ней не подключится. А то пишут тут про какие-то "пул приложений.. на одну сессию"
Набор слов в предложении. Разберитесь сначала.
# Ответить
30. vladen (файл скачал) 23.06.2014 18:20
А на 8,3,4 работать будет? Может кто пользовался на новой платформе?
# Ответить
31. БизнесРешение 03.09.2014 21:17
Создал Приложение, создал Компоненту - всё ОК! Запустил Процесс - тоже ОК, значок появился.
НО! никакого пользователя (заданного "Админ") в списке активных пользователей 1С не появилось.
Естественно строку Srvr="1C-Server"; Ref="TEST"; Usr=Админ; Pwd=111 на предмет правильности имён и паролей перепроверил несколько раз!
Почему такое может быть, не подскажите?? :(
Ответили: (32)
# Ответить
32. alex_bob 04.09.2014 09:11
(31) БизнесРешение,
Соединение через V82.ComConnector с такой строкой соединения работает?
# Ответить
33. БизнесРешение 04.09.2014 10:57
Да, конечно!
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С.
# Ответить
34. БизнесРешение 04.09.2014 11:14
Картинки по настройки "Службы компонентов.jpg" и свойства самой Компоненты "V82Server.Connection.1" прикладываю (Безопасность.jpg и Активация.jpg).
Windows Server 2012 R2.
Хотел спросить: на закладке "Безопасность" нужно ставить галочки?

Вот видите - всё вроде красиво, а активного пользователя "Админ" в базе 1С не появляется :(

Прикрепленные файлы:

Службы компонентов.jpg
Безопасность.jpg
Активация.jpg
# Ответить
35. БизнесРешение 05.09.2014 13:04
Так подскажите, что нам делать?? Ваша идея с COM+ очень нужная для нашей реализации!
Ответили: (36)
# Ответить
36. alex_bob 05.09.2014 15:10
(35) БизнесРешение,
Операционка и 1С случайно не 64разрядные? Я тестировал компоненту только на 32-разрядных системах.
# Ответить
37. БизнесРешение 05.09.2014 16:12
"К сожалению" ДА! :(

Прикрепленные файлы:

Система.jpg
Служба.jpg
# Ответить
38. БизнесРешение 05.09.2014 16:12
Не получится в этом случае запустить?! :(
Ответили: (39)
# Ответить
39. alex_bob 05.09.2014 16:52
(38) БизнесРешение,
Посмотрите по ссылке здесь
# Ответить
40. БизнесРешение 09.09.2014 21:39
Установка галочек Авторизации и Владельцев в "Службы компонентов" НИ К ЧЕМУ НЕ ПРИВЕЛА :(

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

Прикрепленные файлы:

Службы компонентов (2).jpg
# Ответить
41. БизнесРешение 09.09.2014 21:43
И ещё вопрос.
Всё-таки пользователь (ваш - remote или наш - Админ) должен появиться в списке активных пользователей сразу после запуска компоненты,
т.е. ещё ДО создания COMОбъекта "COMConnector" из языка. Правильно?!
# Ответить
42. avz_1C 16.11.2014 12:29
Спасибо.
Ставлю "+".
Пригодилось, как наводка на решение в нескольких "зависших" проектах.
# Ответить
43. Tsarev_Vladimir@mail.ru 19.04.2015 15:28
Ole := CreateOLEObject('v82Server.Connection');

Произошла ошибка активации COM+ из-за сбоя функции инициализации. Дополнительная информация содержится в журнале ошибок.
# Ответить
44. sorb 22.05.2015 10:12
А для 8.3 готовое есть? Исходники посмотрел, вроде как достаточно clsid заменить и V81.COMConnector на V83.COMConnector заменить, но сейчас под рукой нет установленной ide,чтоб собрать...
# Ответить
45. tormozit 17.01.2016 16:05
Где взять последние исходники? Форум на 1cpp.ru похоже поломался (дальше 3-й страницы тем все пусто).
+ 2 [ sanfoto; Asmody; ]
# Ответить
46. wunderland 22.03.2016 14:58
Хорошая штука. Жаль что мне раньше не попалось, когда нужно было из 8 на 7.7 ходить
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл