COMОбъект: -2147221005(0x800401F3): Недопустимая строка с указанием класса
☑
0
Mikhail Volkov
✎
Перестало работать OLE-соединение “V83. Application”: Ошибка при вызове конструктора (COMОбъект): -2147221005(0x800401F3): Недопустимая строка с указанием класса. Тема заезженная, везде предлагают выполнить перерегистрацию платформы. Стоит 8.3.10.2466 х64, но клиентская часть 32-разрядная, делаю (под админом): regsvr32 “c:\Program Files\1cv8\8.3.10.2466\bin\comcntr.dll” (или надо regsvr32 “c:\Program Files (x86)\1cv8\8.3.10.2466\bin\comcntr.dll”?). Дальше надо сервер перезагрузить, или необязательно?
Читал статьи Ошибка V82. COMConnector на сервере 64. Решение проблемы ( http://catalog.mista.ru/1c/articles/197627/
) и Решение проблемы «Недопустимая строка
с указанием класса ( https://efsaver.ru/docs/reshenie-problemy-nedopustimaya-stroka-s-ukazaniem-klassa.html
), кое-что изменил/добавил в приложение COM+ V8COMConnector. Чтобы изменения вступили в силу, как перезапустить?
1
Mikhail Volkov
✎
2
Kigo_Kigo
✎
не помню что конкретно сделал, но статья с инфостарта не помогла, по моему привел разрядность к одному знаменателю
3
Kigo_Kigo
✎
сижу уже с начала создания темы вспоминаю как эту бяку победил, хоть убей не помню, помню точно что по статье делал, не вылечилось и сервант ребутил и клиента
4
ДенисЧ
✎
Взять regsvr32 не из system, а из SysWOW ?
5
Mikhail Volkov
✎
6
ДенисЧ
✎
Если SysWOW, то (x86)
И наоборот
7
Kigo_Kigo
✎
как ты пытаешься вызвать х64 ком объект с х32 разрядного клиента? ответ, никак, регистрируй на клиенте х32 компненту
8
Mikhail Volkov
✎
Чтоб в силу вступило, что сделать?
9
Kigo_Kigo
✎
Ничего, так должно все работать, у тебя из сабжа не создается ком объект, потому что он ее не видит, а точнее видит другой разрядности, это не проблема подключений к базе через ком(сервер х64,х32, не важно), это проблема создания объекта как такого
10
Kassern
✎
(0) делай обертку через службы компонентов для библиотеки comcntr.dll
11
Mikhail Volkov
✎
Дык, как правильно ее регистрировать?
Вроде все сделано. Описание: 1CV83 COM Connector Class, DLL: C:\Program Files\1cv8\8.3.10.2466\bin\comcntr.dll
12
Kigo_Kigo
✎
а у тебя точно регистрация проходит?
13
Kigo_Kigo
✎
И так, делает reg.bat файл , вставляем туда строку
C:\Windows\System32\regsvr32.exe “C:\Program Files\1cv8\8.3.15.1830\bin\comcntr.dll”
pause
сохраняем, запускаем от имени администратора, пробуй, скрин о регистрации сюда
14
Kigo_Kigo
✎
Пути поменять на свои, лучше полные
15
Kigo_Kigo
✎
для х32 путь в C:\Program Files (x86)\
16
arsik
✎
17
Mikhail Volkov
✎
18
Kigo_Kigo
✎
1С конечно надо перезапустить
19
Mikhail Volkov
✎
Не помогло.
20
ZDenis
✎
У тебя com соединение на сервере ведь создается, причем тут клиентская часть. Вот на сервере и регистрируй dll. Причем, если сервер 64х, то и dll нужно соответствующую. Сперва лучше отмени уже сделанную регистрацию, чтобы в реестре путаницы не было.
21
Мимохожий Однако
✎
В БСП и типовых конфигурациях есть функция ЗарегистрироватьCOMСоединитель()
22
TormozIT
✎
О да тут похоже все не понимают, что COMСоединитель и OLEAutomation (V8*. Application) – разные вещи и имеют существенные отличия в отношении контроля совместимости версий платформы и способа регистрации.
Кто хочет прокачать теорию, читайте тут все разжевано http://catalog.mista.ru/1c/articles/387577/
Кому нужно решение, в
уже дали ссылки – там все сделано очень универсально (как и весь ИР). Картинка на странице описания правда старовата уже. Запускать эту приблуду надо на том компьютере, где будет создаваться COM-объект (COM-клиент).
23
Mikhail Volkov
✎
24
Mikhail Volkov
✎
Где, в какой ветке реестра Windows прописывается регистрация платформы?
25
TormozIT
✎
Если ты пробовал все, что я рекомендовал, то покажи скриншот с COM классами в ИР.
26
Mikhail Volkov
✎
Как это сделать? Это с помощью инструментов
? У меня их нет.
27
TormozIT
✎
Почему у тебя их нет? Что ты делал, чтобы они у тебя появились?
28
Mikhail Volkov
✎
29
TormozIT
✎
Поздравляю. Ты сделал первый шаг в правильном направлении – осознал, что “стоит поставить”. Представляй, что я крепко держу тебя за руку, и потому делай уверенно следующий шаг.
30
XLife
✎
“C:\Program Files (x86)\1cv8\8.3.10.2466\bin\1cv8.exe” /regserver
31
Mikhail Volkov
✎
Не понял, что скачивать: ИНСТРУМЕНТЫ РАЗРАБОТЧИКА ПОРТАТИВНЫЕ 1С 8.2+ V5.67P или 1С 8.3 V5.67E (1С 8.2 смущает)?
В командной строке (под админом)?
32
XLife
✎
33
Мимохожий Однако
✎
не смущайся. Скачивай
34
TormozIT
✎
Там не 8.2, а 8.2+. Качай портативные
35
Mikhail Volkov
✎
36
TormozIT
✎
Только это не из-за , а из-за . Ну хоть кто то здесь знает разницу из .
37
Mikhail Volkov
✎
Все же, в какой ветке реестра Windows прописывается регистрация платформы?
Статью в читал, но по другому поводу: Альфа-Авто обычно ведет Com-обмены с УПП/КА1. Когда поддержка КА1 кончилась, создали базу ERP/КА2, но она потребовала более высокую версию платформы. С OLE-обменом возникли проблемы: https://i.ibb.co/pdrH9Wy/COM.jpg
. Меняю версию зарегистрированной платформы, тогда нормально. Даже функции написал:
// Определяет версию подключаемого приложения, при не соответствии требуемой переключает ее для OLE
// для пользователей с административными правами
Функция ВерсияПодключаемогоПриложения(СтрокаПодключения) Экспорт
СисИнфо = Новый СистемнаяИнформация;
ТекущаяВерсия = СисИнфо. ВерсияПриложения;
Если Найти(ТекущаяВерсия, “8.3”) = 0 Тогда
Возврат ТекущаяВерсия;
КонецЕсли;
ТребуемаяВерсия = ?(ПодключенаВысокаяВерсия(СтрокаПодключения), ВысокаяВерсия, ПрежняяВерсия);
х86 = Не ПодключенаВысокаяВерсия(СтрокаПодключения);
WshShell = Новый COMОбъект(“WScript. Shell”); Ключ = “”;
Значение = ЗначениеКлючаЗарегистрированнойВерсииV83Application(WshShell, Ключ);
// Перключение версии OLE
// Если Не ПустаяСтрока(Значение) И Найти(Значение, ТребуемаяВерсия) = 0 Тогда // ТекущаяВерсия <> ТребуемаяВерсия
// Значение = СтрЗаменить(Значение, “Program Files” + ?(х86, “”, ” (x86)”), “Program Files” + ?(х86, ” (x86)”, “”));
// Значение = СтрЗаменить(Значение, ТекущаяВерсия, ТребуемаяВерсия);
// WshShell. RegWrite(Ключ, Значение);
// ЗапуститьПриложение(“taskkill.exe /f /im dllhost.exe”,, Истина);
// Сообщить(“Переключили версию платформы на ” + ТребуемаяВерсия, СтатусСообщения. Информация);
// КонецЕсли;
Возврат ?(ПустаяСтрока(Значение), ТекущаяВерсия, ТребуемаяВерсия);
КонецФункции // ВерсияПодключаемогоПриложения()
// Переключает на старую версию платформы для OLE-соединения, если она переключена на новую версию
// для пользователей с административными правами
Процедура ЗвершитьПодключениеOLE() Экспорт
WshShell = Новый COMОбъект(“WScript. Shell”); Ключ = “”;
Значение = ЗначениеКлючаЗарегистрированнойВерсииV83Application(WshShell, Ключ);
Если ПустаяСтрока(Значение) Или Найти(Значение, “Program Files (x86)\1cv8\” + ПрежняяВерсия) > 0 Тогда
Возврат;
КонецЕсли;
WshShell. RegWrite(Ключ, “C:\Program Files (x86)\1cv8\” + ПрежняяВерсия + “\bin\1cv8.exe”);
ЗапуститьПриложение(“taskkill.exe /f /im dllhost.exe”,, Истина);
КонецПроцедуры // ЗвершитьПодключениеOLE()
Но это только для пользователей с административными правами, пришлось от них отказаться. А метод COM (не OLE) нормально работает. Нашел на http://catalog.mista.ru/public/1042208/
метод открытия объекта по ссылке в другой базе (подобно OLE), написал:
// Открытие объекта по ссылке в базе ERP/КА2, работающей на более высокой версии платформы
//
Процедура ОткрытьОбъектВБазеВысокойВерсии(Ссылка) Экспорт
Если обЗначениеНеЗаполнено(Ссылка) Тогда
Предупреждение(“Объект в ” + БазаОрганизации(ОрганизацияТекущегоПодключенияКА()) + “не найден!”, 60);
Возврат;
КонецЕсли;
ИмяСервера = Сред(ОбъектКА. СтрокаСоединенияИнформационнойБазы(), 7, Найти(ОбъектКА. СтрокаСоединенияИнформационнойБазы(), “;Ref=”) – 8); // “andromeda:1641”;
ИмяБазы = Сред(ОбъектКА. СтрокаСоединенияИнформационнойБазы(), Найти(ОбъектКА. СтрокаСоединенияИнформационнойБазы(), “;Ref=”) + 6, СтрДлина(ОбъектКА. СтрокаСоединенияИнформационнойБазы()) – Найти(ОбъектКА. СтрокаСоединенияИнформационнойБазы(), “;Ref=”) – 7); // “PatrERP”;
Если Не БазаКАОткрытаПользователем() Тогда
Предупреждение(“База ‘” + ИмяБазы + “‘ не открыта под пользователем ‘” + СокрЛП(ПараметрыСеанса. Пользователь) + “‘”, 60);
Возврат;
КонецЕсли;
Объект = Ссылка. ПолучитьОбъект();
ТипОбъекта = СокрЛП(Объект. Метаданные(). ПолноеИмя());
GUID = ОбъектКА. XMLСтрока(Ссылка. УникальныйИдентификатор());
НавигационныйGUID = Сред(GUID, 20 ,4) + Сред(GUID, 25, 12) + Сред(GUID, 15, 4) + Сред(GUID, 10, 4) + Сред(GUID, 1, 8);
ПутьОбъекта = “e1cib/data/” + ТипОбъекта + “?ref=” + НавигационныйGUID;
НазваниеОкна = СокрЛП(ОбъектКА. Константы. ЗаголовокСистемы. Получить()); // “КА2 ИП Патрушева Г. М.”;
НазваниеОкна = СтрЗаменить(НазваниеОкна, “”””, “”””””);
НазваниеОкна = СтрЗаменить(НазваниеОкна, ” “, “”” “””);
СерверБаза = ИмяСервера + “\” + ИмяБазы;
СерверБаза = “/S””” “””” + СерверБаза + “””” “””/URL””” “””” + ПутьОбъекта; // после СерверБаза? ” /N””Администратор”” /P””2001221″
ПутьКФайлу = “\\corp.akit\workspace$\1c\1с_Архивы\”;
ПолныйПутьКФайлу = ПутьКФайлу + “ОткрытьСсылкуВДругойБазе.exe”;
ПолныйПутьОткрытияОбъекта = “”””””; // вроде не нужно СтрЗаменить(“c:\Program Files\1cv8\common\1cestart.exe ENTERPRISE ” + СерверБаза,” “,””” “””);
Файл = Новый Файл(ПолныйПутьКФайлу);
Если Не Файл. Существует() Тогда
Сообщить(“Файл: ‘” + ПолныйПутьКФайлу + “‘ не существует.”, СтатусСообщения. Информация);
Возврат;
КонецЕсли;
Приложение = ПолныйПутьКФайлу
+ ” ” + НазваниеОкна
+ ” ” + ПутьОбъекта
+ ” ” + СерверБаза
+ ” ” + ПолныйПутьОткрытияОбъекта;
// Сообщить(Приложение, СтатусСообщения. Информация);
ЗапуститьПриложение(Приложение);
КонецПроцедуры // ОткрытьОбъектВБазеВысокойВерсии()
38
acht
✎
> ПолныйПутьКФайлу = ПутьКФайлу + “ОткрытьСсылкуВДругойБазе.exe”;
/URL <адрес>
— указывает необходимость перехода по ссылке. Поддерживаются ссылки формата e1c:
Если указана внешняя ссылка – выполняется поиск запущенного клиентского приложения с той же строкой соединения, которая указана в параметре. В найденном клиентском приложении не должно быть открыто модальное или блокирующее окно. После этого выполняется попытка перехода по локальной ссылке из исходной навигационной ссылки и активизируется основное окно приложения. В случае неудачи клиентское приложение продолжает работу. Если исходная навигационная ссылка не содержит локальной ссылки (содержит только адрес информационной базы), то попытка перехода не выполняется, активируется основное окно найденного клиентского приложения.
Если подходящего клиентского приложения не найдено, строка соединения определяется из параметра командной строки /URL.
Если указана локальная ссылка – клиентское приложение запускается в общем порядке. После запуска выполнится попытка перехода по переданной локальной ссылке.
Для ссылок формата http(s) всегда запускается (или находится активный) тонкий клиент.
39
Mikhail Volkov
✎
Что-то не понял к чему это, о чем?
40
Mikhail Volkov
✎
Не сразу заметил эту (0) ошибку, потому что в ЖР в отборе на вкладке Данные отмечаю лишь объекты заслуживающие внимание (например, по кассе). Тогда ошибки по другим объектам не видны. Можно как-то настроить отбор, чтобы события с ошибками все отображались. А события Информация – только отмеченные на вкладке Данные?
41
acht
✎
ОткрытьСсылкуВДругойБазе.exe не нужен
42
Mikhail Volkov
✎
43
Mikhail Volkov
✎
На счет ЖР , смотреть либо ошибки, либо отмеченные объекты? Вместе никак?
Как подключить COM-объект Excel в 1C
- Сервер предприятия 1С х86-64
- Excel x64 установлен там же, где и сервер 1С
Пользователю USR1CV82
необходимо дать права на запуск DCOM Microsoft Excel Application.
Для этого необходимо:
- Нажать кнопку «Пуск»
и выбрать «Панель управления»
. - Дважды щелкнуть значок «Администрирование»
и выбрать пункт «Службы компонентов»
. - В левой панели окна «Службы компонентов»
дважды щелкнуть пункт «Службы компонентов»
, дважды щелкнуть пункт «Компьютеры»
и выбрать «Мой компьютер»
. - Выбрать папку «Настройка DCOM»
. - В окне сведений найти объект «Microsoft Excel Application»
, щелкнуть по нему правой кнопкой и выбрать пункт «Свойства»
(здесь нужно обратить внимание на важный момент- если сервер 64-х разрядный, то и выпуск Office так же должен быть х64, иначе объекта Microsoft Excel Application не будет в списке и права для него не удастся настроить). - Открыть вкладку «Безопасность»
. - В разделе Разрешения на запуск выбрать пункт «Настроить»
и нажать кнопку «Изменить»
. - Добавить пользователя USR1CV82
.
C:\Windows\SysWOW64\config\systemprofile\Desktop
C:\Windows\System32\config\systemprofile\Desktop
на сервере с 1С.
Не нашли ответа на свой вопрос?
В общем случае стороннее приложение взаимодействует с информационной базой
через внешнее соединение
(COM-соединение) по следующей схеме:
На компьютере в локальной сети зарегистрирован класс COM-объектов . Стороннее приложение создает
COM-объект V83. COMConnector и с его помощью устанавливает внешнее соединение с файловой или клиент-серверной базой, расположенной в этой
же сети.
В результате установки такого соединения начинает исполняться модуль внешнего соединения
базы. В случае файловой базы
код на встроенном языке
исполняется на том компьютере, на
котором создается объект V83. COMConnector (и в контексте клиента, и в контексте сервера
). В случае клиент-серверной информационной базы
код в контексте клиента исполняется на том компьютере, где создается
COM-объект V83. COMConnector , а код в контексте сервера исполняется на компьютере кластера серверов.
Развертывание, запуск и отладка
Компонент платформы 1С:Предприятие
(который используется во всех этих вариантах) содержит библиотеку .
Эта библиотека обеспечивает функционирование внешнего соединения. При установке платформы она регистрируется автоматически.
Если пользователь, от имени которого выполнятся установка платформы, ограничен в правах, регистрация библиотеки может
не выполниться. В этом случае вы можете зарегистрировать ее вручную, запустив интерпретатор командной строки от имени
администратора:
regsvr32 comcntr.dll
Библиотека находится в каталоге бинарных
файлов платформы, например .
Вы запускаете стороннее приложение и выполняете в нем действия, приводящие к установлению внешнего соединения с информационной базой. В
результате запускается COM-сервер, который и исполняет код на встроенном языке.
Если используется файловый вариант работы, то в сеансе, который получен с использованием внешнего соединения, не
поддерживается работа фоновых заданий
(подробнее в документации 1С:Предприятие 8.3. Руководство разработчика
). Если
вы хотите запускать и отлаживать фоновые задания при работе через внешнее соединение — используйте клиент-серверный вариант работы.
Идея интересная, но у меня имеет место быть проблема. Если создавать COM-объекты разных версий с некоторой паузой между этим созданиями, то всё хорошо, вроде бы.
А, вот, если эту паузу не выдерживать – то возможно возникновение двух ошибок (я так и не смог понять причины и следствия когда какая ошибка возникает, скорее всего сначала первая, а при повторной попытке уже вторая)
Запускалось всё под клиентом одной или второй версии (пробовал и так и так) – файловый вариант.
Основной COM-объект был версии 8.3.10.2252, но даже если к нему обращаться как к “v83. COMConnector” то это ничего не меняло
Последовательность создания COM-объектов не влияет, но если получить первую ошибку, переставить их местами – возникает вторая ошибка
Версия клиента 1С: Предприятие так же не влияет.
Запуск в новом сеансе 1С проблему не решает.
Выполняю такой алгоритм:
ком = новый COMОбъект("V83. COMConnector_8.3.10.2252");
ком. ConnectAgent("srv1");
ком = новый COMОбъект("v83. COMConnector_8.3.8.2054");
ком. ConnectAgent("srv2");
Возникает первая ошибка:
При повторном запуске она повторяется
Переставляем местами создание COM-Объектов
ком = новый COMОбъект("v83. COMConnector_8.3.8.2054");
ком. ConnectAgent("srv2");
ком = новый COMОбъект("V83. COMConnector_8.3.10.2252");
ком. ConnectAgent("srv1");
И возникает вторая ошибка:
При повторном запуске она повторяется
Далее – если снова переставить обратно – ошибка будет повторяться
Значит COM-объект где-то кешируется (платформой 1С? – мало вероятно – т.к. перезапуск клиента ничего не решает) и при попытке создать повторно (пусть и, в общем-то, другой COM-Объект) идёт обращение к старому и происходит какой-то конфликт версий.
Попробовал так же с компонентами редакции 8.2:
ком = новый COMОбъект("v82. COMConnector_8.2.19.80");
ком. ConnectAgent("srv3");
ком = новый COMОбъект("V82. COMConnector_8.2.19.68");
ком. ConnectAgent("srv4");
В общем-то такая же ситуация, но ошибка всегда на ВТОРОЙ по счёту компоненте (не важно какой она версии!!!) и всегда такая:
{ВнешняяОбработка. ВнешняяОбработка1. Форма. Форма. Форма}: Ошибка при вызове метода контекста (ConnectAgent)
ком. ConnectAgent("srv4);
по причине:
Неизвестная ошибка
При этом если создавать и использовать их отдельно (посадил на разные кнопки)
То ситуация такая
1. Любую создаю – всё нормально
2. Создаю вторую – возникает ошибка
3. Создаю первую – ошибки нет
4. Создаю вторую – ошибка
5. Повторно создаю вторую – ошибки нет
6. Снова создаю вторую – ошибки нет
7. Создаю первую – ошибка
8. Создаю первую – ошибки нет
9. Создаю вторую – ошибка
10. Создаю вторую – ошибки нети
То есть первый раз создаётся нормально и если сразу создавать другой версии – будет ошибка – но при повторном создании – ошибки не будет – но она снова будет у первой, что при повторном создании так же ошибки не будет
Поэтому с v82 я написал вот так – и в общем-то оно работает
попытка
ком = новый COMОбъект("v82. COMConnector_8.2.19.80");
ком. ConnectAgent("srv3");
исключение
сообщить("v82. COMConnector_8.2.19.80: "+ОписаниеОшибки());
ком = новый COMОбъект("v82. COMConnector_8.2.19.80");
ком. ConnectAgent("srv3");
конецпопытки;
попытка
ком = новый COMОбъект("V82. COMConnector_8.2.19.68");
ком. ConnectAgent("srv4");
исключение
сообщить("v82. COMConnector_8.2.19.68: "+ОписаниеОшибки());
ком = новый COMОбъект("V82. COMConnector_8.2.19.68");
ком. ConnectAgent("srv4");
конецпопытки;
Попытка же написать так же для 8.3
попытка
ком = новый COMОбъект("V83. COMConnector_8.3.10.2252");
ком. ConnectAgent("srv1");
исключение
сообщить("V83. COMConnector_8.3.10.2252: "+ОписаниеОшибки());
ком = новый COMОбъект("V83. COMConnector_8.3.10.2252");
ком. ConnectAgent("srv1");
конецпопытки;
попытка
ком = новый COMОбъект("v83. COMConnector_8.3.8.2054");
ком. ConnectAgent("srv2");
исключение
сообщить("v83. COMConnector_8.3.8.2054: "+ОписаниеОшибки());
ком = новый COMОбъект("v83. COMConnector_8.3.8.2054");
ком. ConnectAgent("srv2");
конецпопытки;
первый раз отработало, но повторный запуск привёл к ошибке
V83. COMConnector_8.3.10.2252:
Попробовал работать параллельно с компонентами V82 и v82
ком = новый COMОбъект("v82. COMConnector_8.2.19.80");
ком. ConnectAgent("srv3");
ком = новый COMОбъект("V83. COMConnector_8.3.10.2252");
ком. ConnectAgent("srv1");
Никаких ошибок не возникает!
Возможно эти проблемы чисто связаны с моей конфигурацией ОС – использую windows 8
А может дело в используемых релизах 1С: Предприятие, клиента и компонент (хотя на клиенте 8.2.19.80 я тоже попробовал – всё то же самое)
Может, у меня просто компоненты как-то неправильно установлены или какие-то заморочки с настройками COM+
Я, например, не нашёл типовых компонент в разделе COM+ как на картинках автора 🙁
Хорошо бы кто-то ещё это всё проверил бы на своих конфигурациях платформ и компонент
Взаимодействие между базами 1С через COM
В этой статье я расскажу о многих особенностях взаимодействия между базами 1С по COM технологии, накопленных за годы развития и использования интеграционного коммерческого продукта 2iS:Интеграция компании 2iS.
Термины
ОС – операционная система
COM-клиент – процесс(поток) ОС, запросивший создание COM-объекта
COM-сервер – COM-объект, созданный по запросу клиента
Издание платформы – подстрока до 2-й точки версии платформы (например 8.2, 8.3)
Com-соединитель – COM-объект V8X. ComСonnector для создания внешних соединений с базами 1С
Automation-сервер – он же OLE-сервер, COM-объект V8X. Application для создания приложений 1С
Сборка платформы – полная строка версии платформы (например 8.2.19.130, 8.2.16.352)
COM классы платформы
Виды COM классов
Для каждого издания платформы в системном реестре регистрируются собственные классы для взаимодействия с базами. Символ “X” обозначает место подстановки номера издания платформы (например 0,1,2,3,4).
Привязка COM классов к dll-файлам
Привязка имени COM класса к конкретному dll-файлу осуществляется через ветку HKEY_CLASSES_ROOT системного реестра, которая собирается следующим образом
:
- Берется содержимое ветки HKEY_CURRENT_USER\Software\Classes
- Добавляется содержимое ветки HKEY_LOCAL_MACHINE\Software\Classes, но только те ключи, которые отсутствуют в п.1.
Поэтому регистрация класса от имени пользователя имеет приоритет над общей регистрацией.
Для 32-b и 64-b режимов исполнения кода в реестре хранятся отдельные ветки и соответственно отдельные привязки. Поэтому управление COM-классами для них осуществляется независимо. В частности это касается класса V8X. ComConnector (на 64-b операционной системе)
- 64-b – c:\Program Files\1cv8*\<Версия>\bin\comcntr.dll
- 32-b – c:\Program Files (x86)\1cv8*\<Версия>\bin\comcntr.dll
Подключение внешнего соединения
Рассмотрим алгоритм подключения внешнего соединения в деталях
Подключение Automation-сервера (OLE)
- Создание COM-объекта Automation-сервера (Имя класса – V8X. Application).
- Затраты на создание примерно – 0.5 cек
- Выполнение метода Connect
- Создание сеанса – 1 сек
- Инициализация сеанса – [0;?] сек
- Подгрузка нужных метаданных (кэш метаданных используется, если база есть в списке пользователя)
- Инициализация параметров сеанса
- ПередНачаломРаботыСистемы
- ПриНачалеРаботыСистемы
AutomationСервер = Новый COMОбъект("V83.Application"); AutomationСервер.Connect(СтрокаСоединения);
Затраты на COM-вызовы
Каждый раз, когда мы обращаемся во встроенном языке к свойству или методу COM-объекта (выполняем COM-вызов), происходит ряд дополнительных действий по сравнению с обращением к родному объекту встроенного языка. Если COM-сервер находится в другом локальном процессе, то при этом еще сначала выполняется перенос всех параметров из COM-клиента в COM-сервер и в конце выполняется обратный перенос параметров в COM-клиент. Для такого переноса информация естественно должна быть сериализована на стороне отправителя и затем десериализована на стороне получателя, что в совокупности с некоторыми другими действиями получило название маршалинга и демаршалинга. В нелокальном режиме (DCOM) такой перенос будет еще тратить время на сетевые коммуникации и при первом обращении к новому COM-объекту на передачу его «скелета», и поэтому задержка канала будет играть решающую роль ( Подробнее о COM вызовах
, DCOM в википедии
, Технический обзор DCOM
,)
Соотношение затрат на вызов по типам расположения COM-сервера
- Минимальные для внутрипроцессного Com-сервера
- Средние для локального внепроцессного Com-сервера
- От средних до больших для нелокального внепроцессного Cоm-сервера в зависимости от качества канала связи
Минимизация количества COM-вызовов
Обратная связь
При использовании принципа «минимум COM-вызовов» значительную часть времени код будет выполняться в чужом контексте, что серьезно усиливает некоторые неудобства COM-вызовов:
- Нельзя прервать поток COM-Клиента и его соединение с сервером приложений 1С, пока не завершится вызов COM-сервера
- У COM-Клиента нет информации о прогрессе выполнения вызова в COM-сервере
Для борьбы с этими неудобствами можно организовать обратную связь от COM-сервера к COM-клиенту, передав COM-Серверу ссылку на общий модуль COM-клиента и периодически вызывая через нее COM-клиент. Нужно отметить, что есть ошибки платформы ( https://partners.v8.1c.ru/forum/t/1382465/m/1382465
), проявляющиеся при создании ссылок на один общий модуль более чем в одном COM-севере сеанса. Поэтому пока лучше очищать ссылки на общий модуль во всех удерживаемых COM-серверах перед помещением в новый. В обратных вызовах можно передавать:
- информацию о прогрессе выполнения
- накопленные сообщения пользователю (получать функцией ПолучитьСообщенияПользователю(Истина))
Схема принципа “минимум COM-вызовов”
Такая схема дружественна к большим задержкам каналов связи. Поэтому она во многом похожа на вызов веб-сервиса. А следовательно используя ее для COM взаимодействия, вы значительно снижаете затраты на возможные переходы между COM и веб-сервисом в обоих направлениях.
Отладка
При использовании принципа «минимум COM-вызовов» облегчить отладку выполнения кода на COM-сервере можно, сделав опциональное модальное окно подключения к базе в COM-клиенте. В этом окне должны быть возможности задания одноразовых параметров подключения, выполнения вспомогательных функций и просмотра информации о подключенном сеансе. Ниже в качестве примера показано такое окно из нашего продукта.
Чтобы включить возможность отладки внешних соединений, в подкаталоге conf нужно создать файл comcntrcfg.xml
с соответствующим содержимым. В окне подключения можно сделать кнопку/флажок для программного создания такого файла. Однако много версий платформы содержат ошибку, из-за которой предметы отладки внешних соединений не видны в отладчике даже с этим корректно настроенным файлом. На платформе 8.3 эти проблемы вроде бы решены.
Пример файла comcntrcfg.xml:
<config xmlns="http://v8.1c.ru/v8/comcntrcfg">
<debugconfig debug="true" debuggerURL="tcp://localhost:1560"/>
</config>
Также нельзя забывать о необходимости запускать конфигуратор для отладки с той же (до регистра букв) строкой соединения, что и предмет отладки. Поэтому в этом диалоге нужно сделать кнопку для запуска конфигуратора COM-сервера с правильной строкой соединения.
В какой-то мере обойти проблему невидимости предмета отладки внешнего соединения и ряд других неудобств можно путем однократного выполнения кода на толстом клиенте с заменой режима «Внешнее соединение» на «Automation-сервер» (приложение), т.е. используя COM класс V8X. Application и включенную видимость. Поэтому в окне подключения нужны параметры для выбора режима подключения.
После создания подключения на стороне COM-клиента обычно требуется подключение отладчика базы COM-сервера и установка там точки останова в нужном месте. Поэтому в окне подключения нужно расположить кнопку подключения отладчика/конфигуратора COM-сервера. Если COM-сервер запущен в режиме видимого приложения, то для подключения отладчика можно воспользоваться асинхронным вызовом исключения в нем. Из диалога с ошибкой в приложении COM-сервера через кнопку «Конфигуратор» можно будет открыть конфигуратор и в большинстве случаев сразу подключить отладчик. Если подключение отладчика таким способом недоступно, то оператору поможет отображение информации о сеансе (его номера) в базе COM-сервера. Также нужна кнопка открытия в открытом отладчике файла внешней обработки, которая будет выполняться в нем.
Управление COM+ приложениями 1С
Далее можно изменить тип активации (внутрипроцессный/внепроцессный) на закладке Активация/Activation.
В нашем продукте имеется инструмент «Управление COM классами 1С» для просмотра/регистрации/изменения всех COM классов и COM+ приложений 1С на указанном компьютере:
Также управлять COM классами 1С можно через инструмент “Управление COM классами 1С” из подсистемы Инструменты разработчика
Настройка DCOM-сервера
Для Windows 2008 Server нужно добавить роль «Сервер приложений» (Application server). Для этого необходимо открыть панель управления компьютером, щелкнуть правой кнопкой мыши в ветки “Роли” и выбрать пункт меню “Добавить роль”.
Появится око в котором необходимо выбрать роль “Сервер приложений”/”Application server”. На этапе выбора ролей сервера приложений необходимо указать пункт “Сетевой доступ к COM+”/”COM+ network access”. Если это не сделать, то при попытке создания COM-объекта вы будете получать ошибку “Ошибка при вызове конструктора (COMОбъект): The component or application containing the component has been disabled”.
Настройка сетевого экрана
DCOM процессам для связи между собой динамически выдаются порты из диапазона (по умолчанию) от 1024 до 65535. Поэтому в сетевых экранах обоих компьютеров (com-клиента и com-сервера) должны быть открыты порты RPC (135, 139, 445, 593) и диапазон 1024-65535 (TCP/UDP).
Можно ограничить этот диапазон портов. Для этого открываем Администрирование – Службы компонентов (или в командной строке набираем dcomcnfg.exe). В открывшейся программе находим ветку «Мой компьютер» и открываем её свойства (см. скриншот).
В свойствах открываем вкладку «Набор протоколов», там, в свою очередь, открываем свойства «TCP/IP с ориентацией на подключения»
В свойствах TCP/IP по умолчанию – пустой список. В него можно добавить конкретный диапазон портов, которые будут использоваться DCOM. Какие именно порты выбрать – решать вам. Главное, чтобы не было других стандартных служб, уже занявших выбранные порты. Мне встречались рекомендации открывать не менее 1000 портов, так как очень многие системные программы используют DCOM. Так на скриншоте ниже я указываю, что DCOM должен работать по диапазону портов 20000-21000.
После этого нужно перезагрузить компьютер (перезапустить отдельно DCOM нельзя, слишком много на него завязано), и DCOM станет работать только по указанным портам.
Com-технология VS веб-сервисы в локальной сети
Недостатки
- Рассмотренные выше сложности с взаимодействием разных сборок платформы 1C, требующие для своего решения сервисный механизм
- Высокие затраты на подключение/инициализацию, поэтому при отсутствии кеширования неэффективно для частых мелких вызовов
- Привязка к семейству операционных систем (платформе) Windows
- Требуется закрытая сеть (LAN, VPN)
Преимущества
- Отсутствие необходимости изменять конфигурацию баз, к которым подключаемся
- Широкая функциональность
- Проще отладка
- Не требуется разворачивать и поддерживать веб-сервер
- Программно доступен интерактивный режим подключенной базы
Захват клиентских лицензий
В большинстве случаев всем клиентским приложениям, частным случаем которого являются Automation-сервер и внешнее соединение, в одном сеансе ОС требуется всего лишь одна на всех лицензия. Однако если клиентскому приложению не удалось получить аппаратную лицензию (от локального HASP или сетевого HASP) и программную лицензию (платформы или базовой конфигурации), то предпринимается попытка получить отдельную лицензию с сервера 1С:Предприятия. Сервер 1С:Предприятия может выдать лицензию только, если в свойствах базы разрешена выдача лицензий сервером 1С:Предприятия. В таком случае каждое клиентское приложение и внешнее соединение может захватывать свою собственную лицензию.
Заключение
Если вы хотите подробнее узнать об описанных особенностях, приобретайте продукт 2iS:Администратор
. Несмотря на наличие в конфигурации защищенного модуля, 99% программного кода конфигурации открыто, то есть Вы можете изучить реализацию описанных приемов.
Зеркало
статьи на случай поломки оформления.
Полезные ссылки на its.1c.ru:
Подключение к информационной базе через com-соединение происходит через внешний com-компонент который настраивается на стороне сервера. Если не создать компонент, то будет появляться ошибка «Класс не зарегистрирован» или «Недопустимая строка с указанием класса».
Бесплатный сервер 1С для подписчиков нашего telegram-канала
!
Данная инструкция выполнена на примере платформы 1С 8.3.17.1549
Вначале необходимо зарегистрировать DLL в системе, для этого запускаем командную строку от имени администратора и вводим:
Regsvr32 “C:\Program Files\1cv8\8.3.17.1549\bin\comcntr.dll"
В случае если это не помогает, то создаем коннектор вручную, для этого:
- Заходим в Панель управления – Администрирование – Службы компонентов.
- В контекстном меню выбираем Создать – Приложение. Откроется Мастер установки приложений COM+. Выбираем «Создать новое приложение». Вводим имя «V83COMConnector». Устанавливаем переключатель «Серверное приложение». Нажимаем «Далее».
- На следующем шаге устанавливаем «Текущий пользователь». Нажимаем «Далее». Выбираем роль «CreatorOwner» и нажимаем «Далее» и «Готово».
- В появившейся ветке V83COMConnector переходим к подветке Компоненты. В контекстном меню выбираем Создать – Компонент. Откроется Мастер установки компонентов COM+. Нажимаем «Далее».
- Выбираем «Установка новых компонентов». Выбираем файл <каталог “C:\Program Files\1cv8\8.3.17.1549\bin\comcntr.dll". Нажимаем «Далее» – «Готово».
- Переходим к ветке V83COMConnector. В контекстном меню выбираем «Свойства». В открывшемся окне переходим на вкладку «Безопасность». Снимаем галку «Принудительная проверка доступа для приложений». Ставим галку «Применить политику программных ограничений». Устанавливаем Уровень ограничений – «Неограниченный».
Рисунок 1 – Итоговый результат настройки COM-Компонента