Чуда нет. Просто подключение Вы организуете заранее.
Я не являюсь автором идеи и привожу ссылку на первоисточник. Мой скромный вклад заключается в перекомпиляции библиотеки, первоначально предназначенной для 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С вы можете написать:
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 с исходными текстами.
Удачи в экспериментах!
Мгновенное подключение к базе 1С по OLE (COMConnector).
Перейти к публикации
а можешь выложить исходники?
(1) Согласен, лишними не будут:)
Исходники для 1С81 лежатздесь (см. ответ #78). Для 82 изменилось только наименование объекта и GUIDы. Для того, чтобы разобраться что к чему более чем достаточно. А что, есть какие-то идеи?
при обновлении конфиги сервер вырубает все подключения к базе, как потом эти remote пользователи пула подключатся обратно?
при обновлении конфиги сервер вырубает все подключения к базе, как потом эти remote пользователи пула подключатся обратно?
Есть несколько вариантов.
1. Ручками 🙂 То есть залезть в консоль Службы компонентов и выбрать в меню «Запустить».
2. Скриптом. Все объекты доступны через WMI.
Показать
1. 1С ушла от использования СОМ+ компонентов в 8.1
2. на nix — не взлетит 🙂
3. за развитие велосипеда +
1. 1С ушла от использования СОМ+ компонентов в 8.1
2. на nix — не взлетит 🙂
Да, согласен это не в русле тенденций развития 1С и даже Microsoft после COM+ уже выпустило 4 версии NET.
Но если здесь и сейчас эта штука поможет кому-то решить его текущие проблемы, то это уже хорошо.
3. за развитие велосипеда +
Я бы сказал, что это не велосипед, а молоток. И использование зависит от кривизны рук — можно пальцы отбить, а можно статую Аполлона вырубить.
(3) размер отличается почти в два раза — v8Server.dll весит 53248 байт, а v82Server.dll — 98304 байт. Присоединяюсь к просьбе выложить исходники по причине элементарной осторожности 🙂
1. 1С ушла от использования СОМ+ компонентов в 8.1
…
При переходе от 8.1 на 8.2 замедлился вход пользователя в 1С (на одном и том же железе), это видно невооруженным глазом. Если разработчики 1С не хотят / не могут ничего с этим поделать, что ж…очень жаль.
Поэтому хочется плюсовать разработки, позволяющие этот самый вход ускорить. Если архитектура {Клиентское приложение — Сервер 1С — Сервер БД} не позволяет достичь приемлемой производительности, то это могло бы быть еще одним, четвертым, звеном в клиент-серверной архитектуре 1С. COM+ или NET — это уже другой вопрос.
Размер сырцов изменился, так как изменилась опция сборки проекта с /MD на /MT. Если вы читали форум, я там спрашивал, каким образом избавиться от зависимости от CRT для VC80 (библиотеки msvcp80.dll, msvcr.dll и vcomp.dll с манифестами) при переносе прокси-приложения на удаленный компьютер.
Оказалось, что с опцией /MT приложение линкуется с CRT статически.
(см. ответ #78). Для 82 изменилось только наименование объекта и GUIDы. Для того, чтобы разобраться что к чему более чем достаточно. А что, есть какие-то идеи?
Ответили: (8) (10)
Что то я там исходника не нашел. DLL — на чем написана и откомпилирована ?
Что то я там исходника не нашел. DLL — на чем написана и откомпилирована?
Наверное плохо искали. Написано на С++.
(12) Алексей, плюс поставил — считаю отличная работа.
также я там на форуме 1С++ (ссылка на сообщение ) парочку вопросов задал, если будет время ответишь ?
В 8.2 все это реализуется штатно через Менеджер COM-соединений
Извиняюсь, но «все это» что? Менеджер COM-соединений дает после установки внешнего соединения подключаться/отключаться к себе внешним процессам? Или обеспечивает удаленное исполнение методов?
Собственно компонента и использует внутри менеджер COM-соединений. Только он готовит внешнее соединение заранее и предоставляет его вызывающему процессу минуя длительную стадию подключения.
Грубо говоря — подключился, провел документ, отключился (освободил соединение для другого пользователя).
Полезная статья!
Отличная штука, а вот если мы из 1С подключаемся к 1С, возможно проще записывать подключение в глобальную переменную?
мог бы- поставил бы три плюса.
Спасибо.
Полезно
хорошая статья, спасибо
а вообще просто заранее открыть соединение и ждать, когда будет обмен? не мгновенно будет?
одно дело — 77, а здесь это похоже на масло масленное….
(17)(21)
Да, возможен и такой режим работы и он подходит для обменов и административных нужд. Я же говорю о другом режиме работы, когда созданное соединение может использоваться в разных сеансах разных внешних приложений. Наиболее наглядный пример — взаимодействие с web-сайтом. Пользователь зашел на web-сайт (подключения к 1с нет). Пользователь выбрал в меню просмотр каталога товаров (подключился к 1с, выбрал запросом товары, вывел на html-страничку, отключился). Пользователь 2 в это время оформлял заказ. Нажал на кнопку ОК (подключился к 1с, создал и записал документ, отключился). Таким образом, пула из 2х соединений будет достаточно для обслуживания десятка пользователей, одновременно присутствующих на сайте.
(22)
не получится, там, по-моему (я не испытывал на примере) одна авторизация — одна сессия. Т.е. подключения разные.
а это непреодолимо.
(23) AlexO, Вы не то что не испытывали на примере, вы еще и читали не внимательно. Получившаяся Com+ публикация в момент своего старта запускает сессию V82ComConnector’а под указанным в настройках пользователем и все подключения и операции выполняются от имени этого пользователя.
На одной сессии. Если пул приложений настроен на 1 сессию.
(0) Автору творения Мега респект. Пригодилась.
Вопрос от безысходности. Пол дня сижу с этой проблемой. Поможет ли мне данная компонента в следующей ситуации:
на сервере 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+ не знаком толком).
Возможно у Вас ошибка в строке подключения через COM к конфигурации 8.2.13? Нужно указывать явно номер порта через двоеточие после имени сервера.
Подскажите, пожалуйста, вот по какому вопросу:как передать параметры в вызываемую глобальную функцию?
$v7 = new COM(«v7AppServer.Connection»);
echo $v7->AppDispatch->EvalExpr(«glTest(‘777’,’тестовая строка'»); — так не получается
Это PHP?
Давно с ним не работал.
Во-первых, должно работать без AppDispatch.
Во-вторых, строку внутри EvalExpr должна разбирать сама 1С, а она апострофы не понимает, только кавычки.
В-третих, где закрывающая скобка для glTest?
Так что наверно:
echo $v7->EvalExpr(«glTest(«777″,»тестовая строка»)»);
(24) Padonak-XXI,
Вы сами-то поняли, что написали? Я сказал — один пользователь — одна сессия. Второй к ней не подключится. А то пишут тут про какие-то «пул приложений.. на одну сессию»
Набор слов в предложении. Разберитесь сначала.
А на 8,3,4 работать будет? Может кто пользовался на новой платформе?
Создал Приложение, создал Компоненту — всё ОК! Запустил Процесс — тоже ОК, значок появился.
НО! никакого пользователя (заданного «Админ») в списке активных пользователей 1С не появилось.
Естественно строку Srvr=»1C-Server»; Ref=»TEST»; Usr=Админ; Pwd=111 на предмет правильности имён и паролей перепроверил несколько раз!
Почему такое может быть, не подскажите?? 🙁
(31) БизнесРешение,
Соединение через V82.ComConnector с такой строкой соединения работает?
Да, конечно!
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С.
Картинки по настройки «Службы компонентов.jpg» и свойства самой Компоненты «V82Server.Connection.1» прикладываю (Безопасность.jpg и Активация.jpg).
Windows Server 2012 R2.
Хотел спросить: на закладке «Безопасность» нужно ставить галочки?
Вот видите — всё вроде красиво, а активного пользователя «Админ» в базе 1С не появляется 🙁
Так подскажите, что нам делать?? Ваша идея с COM+ очень нужная для нашей реализации!
(35) БизнесРешение,
Операционка и 1С случайно не 64разрядные? Я тестировал компоненту только на 32-разрядных системах.
«К сожалению» ДА! 🙁
Не получится в этом случае запустить?! 🙁
(38) БизнесРешение,
здесь
Посмотрите по ссылке
Установка галочек Авторизации и Владельцев в «Службы компонентов» НИ К ЧЕМУ НЕ ПРИВЕЛА 🙁
А вот скажите — у Вас срабатывает «Повторный запуск» (как на картинке)? =>> у меня немного думает… и потом отключается из «Работающих процессов» 🙁
И ещё вопрос.
Всё-таки пользователь (ваш — remote или наш — Админ) должен появиться в списке активных пользователей сразу после запуска компоненты,
т.е. ещё ДО создания COMОбъекта «COMConnector» из языка. Правильно?!
Спасибо.
Ставлю «+».
Пригодилось, как наводка на решение в нескольких «зависших» проектах.
Ole := CreateOLEObject(‘v82Server.Connection’);
Произошла ошибка активации COM+ из-за сбоя функции инициализации. Дополнительная информация содержится в журнале ошибок.
А для 8.3 готовое есть? Исходники посмотрел, вроде как достаточно clsid заменить и V81.COMConnector на V83.COMConnector заменить, но сейчас под рукой нет установленной ide,чтоб собрать…
Где взять последние исходники? Форум на 1cpp.ru похоже поломался (дальше 3-й страницы тем все пусто).
Хорошая штука. Жаль что мне раньше не попалось, когда нужно было из 8 на 7.7 ходить
Ну, то есть на 8.3 не будет, так?