Меню

Ошибка создания сом объекта 1с

Появилось сообщение «Ошибка при создании COM-объекта»

При запуске внешней обработки со способом обмена «ExtSDK» или заменен способа на «ExtSDK» появилось сообщение «Ошибка при создании COM-объекта (Не зарегистрирована компонента Tensor.SbisPluginClientCOM)».

Причина №1. Не установлено программное обеспечение

Решение №1. Установите недостающее ПО

Выполните диагностику рабочего места. Мастер установит программы, которых не хватает.

Для установки .NET Framework скачайте с сайта Microsoft версию 4.8 и запустите дистрибутив.

Решение №2. Зарегистрируйте COM-объект вручную, если диагностика рабочего места выполнена успешно

  1. Правой кнопкой мыши кликните ярлык программы и выберите «Расположение файла».

  2. Перейдите в папку «service/modules».
  3. Нажмите каталог «Plugin DotNet Host» правой кнопкой мыши и выберите «Свойства».
    • Что делать, если такого каталога нет?
  4. На вкладке «Безопасность» скопируйте имя объекта.

  5. В поиске Windows введите «командная строка» и запустите ее от имени администратора.
  6. В командной строке введите «cd», нажмите <Пробел> и вставьте скопированный адрес в кавычках. Кликните <Enter>.

    Пример

    cd «C:Program Files (x86)Tensor Company LtdSBIS3Plugin22.2118.102servicemodulesPlugin DotNet Host»

  7. Узнайте номер версии .NET Framework, который установлен на вашем компьютере.
  8. Скопируйте команду ниже и вместо «vХ.Х.ХХХХХ» подставьте номер версии:
    • для 32-разрядной версии Windows — %WINDIR%/Microsoft.NET/Framework/vХ.Х.ХХХХХ/regasm.exe SbisPluginClientCOM.dll /codebase;
    • для 64-разрядной — %WINDIR%/Microsoft.NET/Framework64/vХ.Х.ХХХХХ/regasm.exe SbisPluginClientCOM.dll /codebase.

    Пример

    %WINDIR%/Microsoft.NET/Framework64/v4.0.30319/regasm.exe SbisPluginClientCOM.dll /codebase

  9. Вставьте в командную строку и нажмите <Enter>. Дождитесь сообщения «Типы зарегистрированы успешно».

Причина №2. Вы запускаете 1С через технологию «RemoteApp»

Обратитесь в техподдержку для дополнительной настройки.

Нашли неточность? Выделите текст с ошибкой и нажмите ctrl + enter.

Содержание:

1. Почему может возникнуть ошибка при вызове конструктора (COM-объект 1С)?

2. С помощью чего можно исправить ошибку при вызове конструктора (COM-объект 1С)?

3. Параметры при вызове конструктора (COM-объект 1С), которые регистрируют компоненты строки кода перед регистрируемым dll-файлом    

1.      Почему может возникнуть ошибка при вызове конструктора (COM-объект 1С)?

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

Сегодня мы разберем одну из ошибок, которые появляются при работе с базой, а именно ошибку при вызове конструктора (COM-объект 1С).

Ситуацию такую, мы можем наблюдать при загрузке с Excel при использовании (COM-объекта 1С), при обмене между базами. Ситуаций, когда возникает данное сообщение с возникшей проблемой довольно много при работе с программой.

Как правило, данная ошибка возникает из-за того, что при установке платформы1С не произошла автоматическая регистрация 64-х разрядной компоненты, которая отвечает за использование COM-соединения 1С 8.3. А почему это произошло, спросите? Все очень просто и в то же время сложно, если не знаешь, в чем все ядро проблемы. А причина в том, что те, у кого выдаются такие ошибки, используют 32(86) – разрядную операционную систему и ставят вместо платформы необходимой разрядности их системы, платформу 1С предназначенную для совсем другой системы.   

2. С помощью чего можно исправить ошибку при вызове конструктора (COM-объект 1С)?

Исправить данную ошибку, довольно легко. Для этого необходимо всего лишь зарегистрировать библиотеку dll в реестре при помощи командной строки или программы PowerShell, в зависимости от того, что любите использовать, и команды regsvr32.

Для того чтобы выполнить команду, достаточно будет в строке написать такой текст команды «regsvr32 «C:Program Files1cv88.3.ХХ.ХХХХbincomcntr.dll»». Вместо «ХХ.ХХХХ» необходимо указать необходимый релиз платформы, библиотеку которой, необходимо зарегистрировать в реестре системы.

Если все выполнено правильно и регистрация произошла успешно, то должно выдать сообщение, как на скриншоте, об успешной регистрации библиотеки.

Администратор: Командная строка   

3. Параметры при вызове конструктора (COM-объект 1С), которые регистрируют компоненты строки кода перед регистрируемым dll-файлом

Также есть некоторые особенности команды, которая регистрирует компоненты.

На данный момент я знаю только 4 параметра (которые при написании строки кода указываются перед регистрируемым dll-файлом):

·        /u — параметр, отменяет регистрацию

·        /i — параметр, который позволяет при необходимости, в зависимости от библиотеки.

·        /n —параметр используется только для установки компоненты 1С, в основном пишется вместе с предыдущим (/I);

·        /s – возможность отключить все сообщения при регистрации;

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

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

Таких программ достаточно много и писать, какое-то одно название смысла нет.

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

Специалист компании «Кодерлайн»

Олег Мороз

Перейти к содержимому

Настройка 1С

Решения по использованию программ 1С. Техподдержка. Сопровождение. Услуги программистов.

Пару слов об использовании внешней обработки СБИС в тандеме с 1С. Клиент получил новую ЭП — ключ создан на сберовском токене InfoCrypt VPN-Key-TLS. Все хорошо, но обработка СБИС для 1С в упор не замечала сертификат.

При этом в КриптоПро CSP — все ок. Контейнер виден, ошибок нет, сертификат установлен.

Как настроить подобную связку

Рассмотрим возможные ошибки и варианты решений. Ну что, подправить причёски — погнали.

❃ В окне обработки СБИС не дает выбрать вход по сертификату
► Перейдите в настройки и выберите другой способ обмена. Вход по ЭП доступен в ExtSDK и SDK.


❃ СБИС не находит установленный сертификат с VPN-Key-TLS
► Закройте СБИС Плагин. В конфигурационный файл «%LocalAppData%Sbis3Pluginuser-config.ini» добавьте строки:

[Считыватели]
РежимАктивныхСчитывателейКриптоПро5=true

Повторно запустите СБИС Плагин.


❃ Ошибка при создании COM-объекта (Не зарегистрирована компонента Tensor.SbisPluginClientCOM {ВнешняяОбработка.СБИС.Форма.ExtSDK.Форма(2339)}:
Ошибка при вызове конструктора (COMОбъект):
-2147221005(0х800401F3): Недопустимая строка с указанием класса)

Ошибка при создании COM-объекта

► Причины: не запущен или не установлен СБИС Плагин. Одно из решений — установить или обновить Плагин.

В случае, если Плагин работает, но ошибка сохраняется:

  1. Переустановите СБИС Плагин вручную, указав режим полной конфигурации. Для того, чтобы подтянулся модуль для ExtSDK.
  2. Зарегистрируйте COM-объект вручную.
  3. Обновите компоненты .NET Framework и перезагрузите ПК.
  4. Выполните диагностику рабочего места.

✅ Успехов вам!

__________
Если не получается или требуется дополнительная поддержка, наши программисты 1С готовы помочь → +7-911-500-10-11

   BubbleGumm

21.07.16 — 13:05

Пытаюсь создать СОМ объект

oIE = Новый COMОбъект(«InternetExplorer.Application»);

возникает ошибка:

Ошибка при вызове конструктора (COMОбъект): -2147467259(0x80004005): Неопознанная ошибка

1с — 8.3.8.1479

windows server 2012r2

Internet Explorer установлен, вручную запускается, работает корректно.

В чем может быть дело?

   Cyberhawk

1 — 21.07.16 — 13:17

В правах на приложение СОМ+, например

   BubbleGumm

2 — 21.07.16 — 13:30

Да, пытаюсь добавить его в приложения СОМ+

Он добавляется только как устаревший компонент

Может эксплорер обновить?

   hhhh

3 — 21.07.16 — 13:35

(2) какой хоть Internet Explorer?  надеюсь, не пятый?

   BubbleGumm

4 — 21.07.16 — 13:36

11

   BubbleGumm

5 — 21.07.16 — 13:39

не помогло

   DrZombi

6 — 21.07.16 — 13:52

   DrZombi

7 — 21.07.16 — 13:53

(5) Ты СОМ откуда вызываешь?

С сервера или с клиента?

   BubbleGumm

8 — 21.07.16 — 13:53

с сервера

   BubbleGumm

9 — 21.07.16 — 13:54

хм, а на клиенте работает.

но надо на сервере

   DrZombi

10 — 21.07.16 — 13:54

(8) А на сервере есть ИЕ?

А пользователь из под которого стартует сервер 1С, имеет право на запуск ИЕ?

   BubbleGumm

11 — 21.07.16 — 13:55

я на сервере физическом пробую

пользователь — администратор

   BubbleGumm

12 — 21.07.16 — 13:56

служба 1с от администратора тоже

   DrZombi

13 — 21.07.16 — 13:57

(11) Сервер 1С не запущен ис под Администратора!

   DrZombi

14 — 21.07.16 — 13:57

(12) Серьезно? Жесть

   DrZombi

15 — 21.07.16 — 13:57

Поди сервер 1С х64?

   DrZombi

16 — 21.07.16 — 14:00

   DrZombi

17 — 21.07.16 — 14:07

   BubbleGumm

18 — 21.07.16 — 14:08

у меня 1с 64 бита

запуситил службу 32, создаю объект, пишет класс не зарегистрирован.

екплорер вроде 64бита, лежит по крайней мере в programfiles (не х86)

   DrZombi

19 — 21.07.16 — 14:09

(18) ИЕ по умолчанию стартует х32, смотри в (16)

   DrZombi

20 — 21.07.16 — 14:10

Или наоборот, в общем разбирайся 🙂

   DrZombi

21 — 21.07.16 — 14:11

>>> лежит по крайней мере в programfiles (не х86)

Так то он в обоих папочках лежит

   DrZombi

22 — 21.07.16 — 14:12

Посмотри в настройках, какую версию стартует ком-ок 🙂

   BubbleGumm

23 — 21.07.16 — 14:13

класс {0002DF01-0000-0000-C000-000000000046}

путь «%ProgramFiles%Internet Exploreriexplore.exe»

   BubbleGumm

24 — 21.07.16 — 14:13

а в сом+ он установился как устаревший компонент

в обычных его нет

   BubbleGumm

25 — 21.07.16 — 14:16

хотя в сом+ в свойствах компонента он реализован как локальный 32 разрядный сервер — «C:Program FilesInternet Exploreriexplore.exe»

   BubbleGumm

26 — 21.07.16 — 14:19

сейчас и на 64 1с сервере пишет — класс не зарегистрирован

   DrZombi

27 — 21.07.16 — 15:12

(26) Поиграйся, создай новый класс, для х64 🙂

И потом для х32, если не получится 🙂

   DrZombi

28 — 21.07.16 — 15:12

(23) %ProgramFiles% — что содержит?

   BubbleGumm

29 — 21.07.16 — 15:16

На аналогичном сервере (оба виртуальные) все ОК

Пробую настроить СOM+, пишет не хватает памяти, черт.

   DrZombi

30 — 21.07.16 — 15:17

(29) Может все же прав нет?

У Админа 🙂

   BubbleGumm

31 — 21.07.16 — 15:19

да запускал 1с от администратора — нифига

   Serginio1

32 — 21.07.16 — 15:29

   DrZombi

33 — 21.07.16 — 15:31

  

DrZombi

34 — 21.07.16 — 15:31

(32) Спасибо 🙂

Если при выполнении регламентного задания 1С необходимо создавать COM объект, например для периодического обмена с Диадоком, то может выпадать ошибка:

Процесс сервера не может быть запущен, так как указана неправильная идентификация. Проверьте правильность указания имени пользователя и пароля.

В этой ошибке может быть 2 пути решения.

  1. У пользователя, под которым запущена служба 1С, нет прав на создание пакетных заданий когда сеанс завершён.

Решается просто.
Переходим в Панель управления — Администрирование — Локальная политика безопасности.
В дереве переходим Локальные политики — Назначение прав пользователя.
Выбираем политику «Вход в качестве пакетного задания», добавляем в список пользователя, под которым запущена служба сервера 1С.

2. Переходим в Панель управления — Администрирование — Службы компонентов.
В дереве переходим Компьютеры — Мой компьютер — Приложения СОМ+ — находим Diadoc — ПКМ — Свойства.
Открываем вкладку Удостоверение — выбираем «Указанный пользователь» и указываем пользователя под которым запускается служба 1С и установлен сертификат.

Метки: Метки 1С Администрирование 1С

В этой статье речь пойдет об ошибках в COM-соединениях. Один из вариантов ошибки –
это «Ошибка при вызове конструктора (COMObject):
-2147221164(0x80040154): Класс не зарегистрирован…»
. Бывают и другие варианты
сообщений, все я перечислять не буду, в большинстве случаев — это означает, что
при установке платформы компонента comcntr.dll не смогла зарегистрироваться
автоматически.
COM — соединения используются в обменах между конфигурациями.

У меня в готовых решениях есть обработка
загрузки сотрудников из ЗУП, в которой тоже используется
COM — соединение и у
пользователей тоже может появиться ошибка. В случае с моей обработкой, при
проверке соединения, может появиться сообщение, что невозможно установить
соединение с конфигурацией ЗУП.  Это
может произойти, если Вы неправильно указали настройки подключения, неправильно
настроены права пользователя, через которого Вы подключаетесь или чаще всего – проблема
в компоненте comcntr.dll, которая при смене платформы автоматически не
зарегистрировалась. Вот и рассмотрим, как ее зарегистрировать вручную.

Первое что нужно сделать, это запустить
командную строку от имени администратора.

В командной строке Windows набираете cmd, в
писке выбора появится программа с таким названием, устанавливаете курсор на эту
программу и выбираете из контекстного меню «Запуск под администратором» (см.
картинку ниже).

Запуск командной строки от имени администратора

Затем ввести команду (можно двумя способами):

1.     
regsvr32
«C:Program Files (x86)1cv8[
версия платформы]bincomcntr.dll»

2.     
C:Program
Files (x86)1cv8[
версия платформы]bin>regsvr32 comcntr.dll

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

командная строка

Для смены каталога нужно написать cd, после которого установить пробел, а
затем указать тот путь, который нам нужен, например
C:Program Files (x86)1cv8[версия платформы]bin, затем после указания пути к каталогу нажимаете Enter. Смотрите пример смены каталога на
картинке ниже.

смена каталога в cmd

Вот теперь
рядом с каталогом можно ввести
regsvr32 comcntr.dll, нажать Enter и
зарегистрировать компоненту (смотрите пример на картинке ниже).

запуск regsvr3

Если все
сделали правильно, то получите сообщение (см. картинку ниже).

успешное выполнение регистрации компоненты comcntr.dll

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

После сообщения об успешной регистрации,
можно вновь запустить обмен или обработку, с которой у вас возникли проблемы.  

в командной строке:

Regsvr32 «C:Program Files1cv88.3.20.1789bincomcntr.dll»
C:WindowsSysWOW64Regsvr32 «C:Program Files1cv88.3.20.1789bincomcntr.dl

Недавно перенес несколько баз на платформу 8.3, и столкнулся со следующей проблемой: при замене в нескольких обработках объекта V82.COMConnector на V83.COMConnector при запуске стал получать сообщение «v83.comconnector класс не зарегистрирован». Решение выкладываю, т.к. не нашел похожей статьи на данном сайте, возможно, невнимательно искал.  

Стандартный простой  способ (вызвать в cmd  regsvr32 «C:Program Files1cv8[номер платформы]bincomcntr.dll» ) не помог: выдавал ошибку:

V82.COMConnector, V83.COMConnector класс не зарегистрирован

Пришлось регистрировать объект «вручную» (это решение нашел раньше, чем причину выдаваемой ошибки): заходим в Панель управления=>  Администрирование => Службы компонентов => Компьютеры => Мой компьютер => Приложения COM+ => Создать приложение => Создать новое приложение (Вводим имя приложения) V83.COMConnector => (Поставить переключатель в) Серверное приложение => Указанный пользователь (Любой с правами администратора)

Далее необходимо создать компонент V82COMConnector => Компоненты => Создание нового компонента => Установка новых компонентов => (Открываем каталог с 1С  и ищем библиотеку)  comcntr.dll

Теперь щелкаем правой кнопкой мыши  V83COMConnector и настраиваем его:  V83COMConnector => Свойства => Безопасность => (Снимает галочку) Принудительная проверка доступа для приложений => (Ставим галочку)  => Применить политику программных ограничений => Уровень ограничений => Неограниченный.

После проверяем соединенние и видим, что все работает.

источник: https://infostart.ru/public/400951/

Регистрация компоненты comcntr.dll (для COM соединения с базой 1С)

Если фоновый процесс COM-соединения завершается с ошибкой:

{Обработка.ОбменДаннымиXML.МодульОбъекта(15947)}: Ошибка при вызове конструктора (COMОбъект): -2147221005(0x800401F3): Invalid class string

Нужно зарегистрировать библиотеку ComConnector comcntr.dll из каталога программы.

!!! Перед этим нужно отключить службу агента сервера 1С:Предприятия и все программы, использующие эту DLL !!!

В 32-битной версии сервера проблема решилась бы командой: regsvr32 «C:Program Files (x86)1cv88.3.5.1119bincomcntr.dll»

V82.COMConnector, V83.COMConnector класс не зарегистрирован

но в 64-битной версии команда будет примерно такой * : C:WindowsSysWOW64regsvr32 «C:Program Files (x86)1cv88.3.5.1119bincomcntr.dll»

При удачном выполнении Вы увидите:

V82.COMConnector, V83.COMConnector класс не зарегистрирован

Если команда регистрации не помогла, то нужно предварительно удалить регистрацию библиотеки comcntr.dll, запустив ту же команду вызова regsvr32 с ключом /u

Если и это не помогло, попробуйте переустановить платформу 1С в режиме Исправить и отметьте COM соединение

источник: https://helpf.pro/faq/view/1825.htm

ну и еще раз

83.COMConnector класс не зарегистрирован

Случается, что при попытке подключения к информационной базе через com-соединение возникает ошибка при вызове конструктора (COMОбъект): «Класс не зарегистрирован» или «Недопустимая строка с указанием класса».

Первым делом необходимо зарегистрировать DLL в системе

Regsvr32 "C:Program Files1cv88.3.7.1776bincomcntr.dll"

В случае, если не помогает — создаём коннектор руками:

  • Заходим в Панель управления — Администрирование — Службы компонентов.
  • Переходим к ветке Компьютеры — Мой компьютер — Приложения COM+.
  • В контекстном меню выбираем Создать — Приложение. Откроется Мастер установки приложений COM+.
  • Нажимаем «Далее».
  • Выбираем «Создать новое приложение».
  • Вводим имя «V83COMConnector». Устанавливаем переключатель «Серверное приложение». Нажимаем «Далее».
  • На следующем шаге устанавливаем «Текущий пользователь». Нажимаем «Далее».
  • Нажимаем «Готово».
  • В появившейся ветке V83COMConnector переходим к подветке Компоненты.
  • В контекстном меню выбираем Создать — Компонент. Откроется Мастер установки компонентов COM+.
  • Нажимаем «Далее».
  • Выбираем «Установка новых компонентов».
  • Выбираем файл <каталог 1С>bincomcntr.dll.
  • Нажимаем «Далее» — «Готово».
  • Переходим к ветке V83COMConnector.
  • В контекстном меню выбираем «Свойства». В открывшемся окне переходим на вкладку «Безопасность».
  • Снимаем галку «Принудительная проверка доступа для приложений». Ставим галку «Применить политику программных ограничений». Устанавливаем Уровень ограничений — «Неограниченный».
  • Нажимаем «ОК».

Класс V83.COMConnector зарегистрирован и может использоваться для подключения к информационным базам.

Сначала зарегистрируем библиотеку comcntr.dll. Для этого запускаем cmd от имени администратора и выполним поочередно следующие команды:

cd C:Program Files (x86)1cv88.3.13.1690bin
regsvr32 comcntr.dll
Вместо «8.3.13.1690» — нужно подставить требуемую версию платформы

Или можно обойтись одной строкой команды:

regsvr32 «C:Program Files (x86)1cv88.3.13.1690bincomcntr.dll«

ДАЛЕЕ ОПИШУ ПОЛНЫЙ ПРОЦЕСС СОЗДАНИЯ COM+ СОЕДИНЕНИЯ

1. Запускаем оснастку «Службы компонентов» из папки Администрирование.

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

или

win+R -> control userpasswords -> Службы компонентов

2. Раскрываем ветку «Службы компонентов» — компьютер — Приложения COM+

3. Откроется окно мастера установки приложений COM+. Ждем «Далее»

4. Выбираем «Создать новое приложение»

5. Вбиваем имя приложения. В моем примере — «v83COMConnector». Отмечаем чекбокс «Серверное приложение»

6. В следующем окне указывается учетная запись, от имени которой будет запускаться компонент. В моем примере я выбираю чекбокс «Текущий (вошедший в систему) пользователь

7. В следующем окне просто жмем «Далее»

8. На следующем шаге можно добавить пользователей, либо группу пользователей, которым необходимо предоставить права на запуск COM+ приложения (локальные/доменные — не важно)

9. Закрываем мастер кнопкой «Готово»

10. Теперь необходимо создать компонент. Возвращаемся к оснастке «Службы компонентов», раскрываем созданное COM+ приложение, встаем на ветку «Компоненты»

11. Откроется окно «Мастера установки компонентов COM+». Жмем «Далее»

12. В следующем окне выбираем «Установка новых компонентов»

13. Теперь с помощью открывшегося окна проводника выберите ранее зарегистрированную библиотеку comcntr.dll, которая лежит в папке установленной 1С, в каталоге bin. В моем случае

C:Program Files (x86)1cv88.3.13.1690bincomcntr.dll

«Enter» или кнопка «Открыть»

14. В следующем окне просто жмите «Далее»

15. Закрываем окно мастера кнопкой «Готово»

16. Раскройте ветку «Компоненты». Здесь вы должны увидеть созданный на предыдущем шаге компонент. Выделите его, нажмите ПКМ — Свойства

17. На вкладке «Безопасность» нужно отметить галочкой CreateOwner и нажать «ОК»

Компонента COM+ создана. COM+ приложение настроено!

ОБНОВЛЕНИЕ ВЕРСИИ КОМПОНЕНТА

Иногда необходимо зарегистрировать иную версию библиотеки comcntr.dll.

Для того, чтобы посмотреть текущую зарегистрированную версию, необходимо войти в свойства компонена V83.COMConnector (см п.16) данного руководства

На вкладке «Общие» будет прописан путь. В моем случае это версия 8.3.13.1690

Зарегистрировать другую версию библиотеки можно при помощи уже рассмотренной команды regsvr32

regsvr32 "C:Program Files (x86)1cv88.3.14.1565bincomcntr.dll" 

ПРАВА НА ЗАПУСК COM+

Если в п.8 вы забыли указать пользователей или группы, кому необходимы права для запуска COM+ приложения, то добавить нужных пользователей можно так:

  • Панель управления — Система и безопасность — Администрирование — Службы компонентов
  • Раскрываем ветку: Приложения COM+ — v83COMConnector — Роли — CreateOwner
  • ПКМ на разделе «Пользователи», «Создать — Пользователь»
  • В открывшемся окне выбираем локального или доменного пользователя, либо группу

источник https://winrcmd.wordpress.com/2019/04/02/sozdaniye-com-soedineniya-1c/

Взаимодействие между базами 1С через COM

Рассмотрено много особенностей взаимодействия между базами 1С по 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).

  1. V8X.ComСonnector — Com-соединитель / Менеджер COM-соединений
    1. С помощью данного объекта выполняется установка внешнего соединения с информационной базой 1С:Предприятия 8 и администрирование кластера серверов. С помощью одного экземпляра объекта может быть установлено неограниченное число соединений.
    2. Регистрация и отмена регистрации выполняется отдельно для каждой разрядности (32b и 64b)
    1. Регистрация: Regsvr32 “<ПутьНужнойРазрядности>bincomcntr.dll”
    2. Отмена регистрации: Regsvr32 “<ПутьНужнойРазрядности>bincomcntr.dll” /u
  2. V8X.Application — Automation-сервер толстого клиента
    1. Предоставляет доступ ко всем свойствам и методам глобального контекста клиентского приложения, а также включение и выключение пользовательского интерфейса (главного окна приложения).
    2. Может запускать как обычное, так и управляемое приложение в зависимости от параметров конфигурации и пользователя базы, но явно задавать тип приложения нельзя.
    3. Регистрация и отмена регистрации
    1. Регистрация — 1cv8.exe /regserver
    2. Отмена регистрации — 1cv8.exe /unregserver
  3. V8Xc.Application — Automation-сервер тонкого клиента
  1. Предоставляет доступ ко всем свойствам и методам глобального контекста клиентского приложения, а также включение и выключение пользовательского интерфейса (главного окна приложения).
  2. Регистрация и отмена регистрации
  1. Регистрация — 1cv8c.exe /regserver
  2. Отмена регистрации — 1cv8c.exe /unregserver

Привязка COM классов к dll-файлам

Привязка имени COM класса к конкретному dll-файлу осуществляется через ветку HKEY_CLASSES_ROOT системного реестра, которая собирается следующим образом:

  1. Берется содержимое ветки HKEY_CURRENT_USERSoftwareClasses
  2. Добавляется содержимое ветки HKEY_LOCAL_MACHINESoftwareClasses, но только те ключи, которые отсутствуют в п.1.

Поэтому регистрация класса от имени пользователя имеет приоритет на общей регистрацией.

Для 32-b и 64-b режимов исполнения кода в реестре хранятся отдельные ветки и соответственно отдельные привязки. Поэтому управление COM-классами для них осуществляется независимо. В частности это касается класса V8X.ComConnector (на 64-b операционной системе)

  1. 64-b — c:Program Files1cv8*<Версия>bincomcntr.dll
  2. 32-b — c:Program Files (x86)1cv8*<Версия>bincomcntr.dll

Подключение внешнего соединения

Рассмотрим алгоритм подключения внешнего соединения в деталях

  1. Создание COM-объекта Com-соединитель (Имя класса — V8X.ComConnector). Варианты:
  1. Внутрипроцессное (inproc)
    1. Должен быть зарегистрирован класс V8X.ComConnector той же разрядности, что и COM-клиент
      1. Если издание платформы COM-клиента совпадает с изданием платформы COM-сервера, то также требуется равенство сборки платформы COM-клиента и COM-сервера.
      2. Он регистрируется при установке платформы с опцией «Внешнее соединение». В любой момент его можно зарегистрировать командой «Regsvr32 comcntr.dll» в каталоге исполняемых файлов платформы.
    2. COM-объект создается в памяти COM-клиента
    3. Затраты на создание примерно – 0.01(первое)/0.001(второе) cек
    4. Пример
      КомСоединитель = Новый COMОбъект(“V83.ComConnector”);
      ВнешнееСоединение
      = КомСоединитель.Connect(СтрокаСоединения);
  2. Внепроцессное локальное (local)
    1. Должен быть зарегистрирован класс V8X.ComConnector любой разрядности и сборки платформы. Необходимо настроить через dcomcnfg.exe COM+ приложение с активацией «серверное приложение»/«Server apllication». Подробнее рассмотрено далее.
    2. COM-объект создается в памяти служебного хост-процесса (dllhost.exe) на компьютере COM-клиента
    3. Затраты на создание примерно – 0.06(первое)/0.03(второе) сек
    4. Пример
      КомСоединитель = Новый COMОбъект(“V83.ComConnector”);
      ВнешнееСоединение
      = КомСоединитель.Connect(СтрокаСоединения);
  3. Внепроцессное нелокальное (DCOM)
  1. На нелокальном компьютере должен быть зарегистрирован класс V8X.ComConnector любой разрядности и сборки платформы. Необходимо настроить на нелокальном компьютере через dcomcnfg.exe COM+ приложение с активацией «Cерверное приложение»/«Server apllication». Подробнее рассмотрено далее.
  2. Необходимо настроить на нелокальном компьютере роль «Сервер приложений»/«Application server» и включить нелокальный доступ к COM+, выбрав опцию «Сетевой доступ к COM+»/”COM+ network access”. Подробнее рассмотрено далее.
  3. COM-объект создается в памяти служебного хост-процесса (dllhost.exe) на другом компьютере
  4. Затраты на создание примерно


На графике видно, что длительность создания этого COM-объекта прямо пропорциональна задержке канала и коэффициент пропорциональности составляет примерно 24. Можно предположить, что при создании этого COM-объекта происходит 24 вызова через канал.

  1. Пример
    КомСоединитель = Новый COMОбъект(“V83.ComConnector”, ИмяКомпьютера);
    ВнешнееСоединение
    = КомСоединитель.Connect(СтрокаСоединения);

2. Выполнение метода Connect (создание внешнего соединения)

  1. Создание сеанса – 1 сек
  2. Инициализация сеанса – [0;?] сек
  1. Подгрузка нужных метаданных (кэш метаданных не используется)
  2. Инициализация параметров сеанса
  3. Событие ПриНачалеРаботыСистемы

Подключение Automation-сервера (OLE)

  1. Создание COM-объекта Automation-сервера (Имя класса — V8X.Application).
    1. Затраты на создание примерно – 0.5 cек
  2. Выполнение метода Connect
    1. Создание сеанса – 1 сек
    2. Инициализация сеанса – [0;?] сек
    1. Подгрузка нужных метаданных (кэш метаданных используется, если база есть в списке пользователя)
    2. Инициализация параметров сеанса
    3. ПередНачаломРаботыСистемы
    4. ПриНачалеРаботыСистемы
  3. Пример
    AutomationСервер = Новый COMОбъект(«V83.Application»);
    AutomationСервер
    .Connect(СтрокаСоединения);

Затраты на COM-вызовы

Каждый раз, когда мы обращаемся во встроенном языке к свойству или методу COM-объекта (выполняем COM-вызов), происходит ряд дополнительных действий по сравнению с обращением к родному объекту встроенного языка. Если COM-сервер находится в другом локальном процессе, то при этом еще сначала выполняется перенос всех параметров из COM-клиента в COM-сервер и в конце выполняется обратный перенос параметров в COM-клиент. Для такого переноса информация естественно должна быть сериализована на стороне отправителя и затем десериализована на стороне получателя, что в совокупности с некоторыми другими действиями получило название маршалинга и демаршалинга. В нелокальном режиме (DCOM) такой перенос будет еще тратить время на сетевые коммуникации и при первом обращении к новому COM-объекту на передачу его «скелета», и поэтому задержка канала будет играть решающую роль (Подробнее о COM вызовах, DCOM в википедии, Технический обзор DCOM,)

Соотношение затрат на вызов по типам расположения COM-сервера

  1. Минимальные для внутрипроцессного Com-сервера
  1. Средние для локального внепроцессного Com-сервера
  2. От средних до больших для нелокального внепроцессного Cоm-сервера в зависимости от качества канала связи

Минимизация количества COM-вызовов

  1. Создаем базовую внешнюю обработку с набором общих методов для приема вызовов от COM-клиента на стороне COM-сервера
    1. Теперь нам не нужно изменять конфигурацию базы COM-сервера, чтобы использовать там сложный функционал.
    2. В нашем продукте мы назвали ее «Сервисный процессор». На ее передачу и инициализацию уходит около 1 сек
    3. Пример универсальной передачи файла в COM-сервер
      ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайлаЛокальное);
      ЗаписьХмл = Новый ЗаписьXML;
      ЗаписьХмл.УстановитьСтроку();
      ЗаписатьXML(ЗаписьХмл, ДвоичныеДанные);
      ЧтениеХмлНаСервере = COMСервер.NewObject(«ЧтениеXML»);
      ЧтениеХмлНаСервере.УстановитьСтроку(ЗаписьХмл.Закрыть());
      ДвоичныеДанныеНаСервере = COMСервер.ПрочитатьXML(ЧтениеХмлНаСервере);
      ИмяФайлаНаCOMСервере = COMСервер.ПолучитьИмяВременногоФайла(Файл.Расширение);
      ДвоичныеДанныеНаСервере.Записать(ИмяФайлаНаCOMСервере);
    4. Пример вызова обработки
      COMОбработка
      = COMСервер.ВнешниеОбработки.Создать(ИмяФайлаНаCOMСервере, Ложь);
      Результат
      = COMОбработка.МойМетод(ПараметрыXML);
  2. Проектируем взаимодействие с COM-сервером по принципу «минимум COM-вызовов”, т.е. готовим все нужное на стороне COM-клиента и передаем в качестве параметров «большого» вызова
  1. Создаем встроенную обработку для выполнения такого вызова в COM-клиенте
  2. Передача агрегатных объектов
    1. Сериализуем все входные параметры на стороне COM-клиента
    2. Десериализуем все входные параметры на стороне COM-сервера
    3. Выполняем действия с параметрами на стороне COM-сервера
    4. Сериализуем все выходные параметры на стороне COM-сервера
    5. Десериализуем все выходные параметры на стороне COM-клиента
  3. В нашем продукте мы назвали ее «Выполнение сервиса инфобазы»
  1. Для многократных COM-вызовов предусматриваем регулируемую частоту
  1. Например, информационные вызовы могут выполняться с изменяемой частотой

Обратная связь

При использовании принципа «минимум COM-вызовов» значительную часть времени код будет выполняться в чужом контексте, что серьезно усиливает некоторые неудобства COM-вызовов:

  1. Нельзя прервать поток COM-Клиента и его соединение с сервером приложений 1С, пока не завершится вызов COM-сервера
  2. У COM-Клиента нет информации о прогрессе выполнения вызова в COM-сервере

Для борьбы с этими неудобствами можно организовать обратную связь от COM-сервера к COM-клиенту, передав COM-Серверу ссылку на общий модуль COM-клиента и периодически вызывая через нее COM-клиент. Нужно отметить, что есть ошибки платформы (https://partners.v8.1c.ru/forum/t/1382465/m/1382465 ), проявляющиеся при создании ссылок на один общий модуль более чем в одном COM-севере сеанса. Поэтому пока лучше очищать ссылки на общий модуль во всех удерживаемых COM-серверах перед помещением в новый. В обратных вызовах можно передавать:

  1. информацию о прогрессе выполнения

накопленные сообщения пользователю (получать функцией ПолучитьСообщенияПользователю(Истина))

Схема принципа “минимум 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С

Осуществляется через оснастку dcomcnfg.exe. Для регистрации 1С в качестве COM+ приложения необходимо открыть оснастку «dcomcnfg». В ней в ветке «Службы компонентов»-«Компьютеры»-«Мой компьютер»-«Приложения COM+»(COM+ Applications) необходимо добавить новое приложение (application). При добавлении можно указать любое имя. Далее необходимо указать пользователя, от имени которого будет работать COM+ приложение, на закладке Идентификация (Identity). Также нужно задать доступ к приложению для нужных пользователей путем добавления, если отсутствует, роли с любым именем в ветке Роли (Roles), и добавления в ее ветку Пользователи (Users) пользователя «Прошедшие проверку» (Authenticated Users). После добавления приложения необходимо создать новую компоненту. Для этого в ветке «Компоненты» созданного приложения необходимо выбрать пункт меню «Создать»-«Компонент». При создании выбрать импорт уже зарегистрированных компонентов и найдите в списке (желательно 64-битную) компоненту 1С (V8x.COMConnector.1). Подробнее о настройке COM+ приложений читайте Интерфейс пользователя: службы компонентов

Далее можно изменить тип активации (внутрипроцессный/внепроцессный) на закладке Активация/Activation.


В нашем продукте имеется инструмент «Управление COM классами 1С» для просмотра/регистрации/изменения всех COM классов и 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 станет работать только по указанным портам.

Проблемы

  1. Высокие затраты на подключение/инициализацию
    1. Удержание com-серверов – эффективное средство борьбы. Варианты:
    1. Временное хранилище. Производитель не рекомендует, но деваться больше некуда. http://infostart.ru/public/331683/
    2. Повторное использование возвращаемых значений. Очищаются каждые 20 мин

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

  2. Разные сборки платформы клиента и сервера при одинаковом издании платформы
    1. Для обхода для каждой отличной от COM-клиента сборки платформы назначаем и настраиваем DCOM сервер
  3. Отсутствие информации о типах вложенных в COM-объекты объектов 1С (вместо типа объекта 1С везде получаем тип «COMОбъект») и отсутствие контекстной подсказки по ним
    1. Для обхода применяем принцип «минимум COM-вызовов»
  4. При передаче исключения из COM-сервера оно принимает краткую форму из-за ошибки платформы
    1. Для обхода оборачиваем каждый вызов на стороне COM-сервера в попытку и в исключении перевызываем исключение с полным описанием ошибки
  5. При создании COM-объекта ошибка “Версия компоненты ‘comcntr’ (8.X.XX.XXX) отличается от версии корневого модуля ‘core82’ (8.X.YY.YYY)”
    1. Для обхода создаем COM+ приложение с внепроцессной активацией. Тогда COM-сервер будет создаваться в отдельном процессе и совпадения версий этих модулей не потребуется.
  6. Медленные каналы (большие задержки)
    1. Каждой подсети за отдельным медленным каналом назначаем и настраиваем свой DCOM сервер и при обращении к базам за этим каналом COM-серверы создаем на этом компьютере, минимизируя количество и объемы вызовов Com-клиент<->Com-сервер
    2. Кешируем (повторно используем) COM-серверы
  7. Невозможно разорвать соединение рабочего процесса, в котором ожидается завершение вызова COM-сервера
    1. Для обхода можно использовать создание COM-объектов в выделенных хост-процессах, настроив соответствующим образом COM+ приложение, и регистрировать идентификаторы этих процессов в привязке к сеансам COM-клиентов. Тогда при необходимости завершить серверное соединение такого сеанса можно сначала убить процесс COM-сервера, а потом и сам сеанс.
  8. При обращении к COM-объекту может возникать ошибка «Неизвестная ошибка». Возможные причины:
    1. Com-сервер перестал существовать. Возможные причины:
      1. Переполнение стека
      2. Невосстановимая ошибка
      3. Хост-процесс завершился
    2. Потеря связи с нелокальным COM-сервером
  9. Совпадение имен свойств и методов без параметров объекта создает неоднозначность обращения к ним через COM
    1. Например, если у справочника есть реквизит ПолноеНаименование, то из-за наличия метода ПолноеНаименование() обращение к реквизиту ПолноеНаименование через COM может привести к вызову метода ПолноеНаименование()
    2. Для обхода используем принцип “минимум COM-вызовов”
  10. При создании COM-объекта через DCOM может возникать ошибка «Сервер RPC недоступен»
  1. Проверьте работу службы “Remote Procedure Call (RPC)” на обоих компьютерах
  2. Проверьте настройки сетевого экрана на обоих компьютерах

Com-технология VS веб-сервисы в локальной сети

Недостатки

  1. Рассмотренные выше сложности с взаимодействием разных сборок платформы 1C, требующие для своего решения сервисный механизм
  2. Высокие затраты на подключение/инициализацию, поэтому при отсутствии кеширования неэффективно для частых мелких вызовов
  3. Привязка к семейству операционных систем (платформе) Windows
  4. Требуется закрытая сеть (LAN, VPN)

Преимущества

  1. Отсутствие необходимости изменять конфигурацию баз, к которым подключаемся
  2. Широкая функциональность
  3. Проще отладка
  4. Не требуется разворачивать и поддерживать веб-сервер
  5. Программно доступен интерактивный режим подключенной базы

Захват клиентских лицензий

В большинстве случаев всем клиентским приложениям, частным случаем которого являются Automation-сервер и внешнее соединение, в одном сеансе ОС требуется всего лишь одна на всех лицензия. Однако если клиентскому приложению не удалось получить аппаратную лицензию (от локального HASP или сетевого HASP) и программную лицензию (платформы или базовой конфигурации), то предпринимается попытка получить отдельную лицензию с сервера 1С:Предприятия. Сервер 1С:Предприятия может выдать лицензию только, если в свойствах базы разрешена выдача лицензий сервером 1С:Предприятия. В таком случае каждое клиентское приложение и внешнее соединение может захватывать свою собственную лицензию.

Заключение

Если вы хотите подробнее узнать об описанных особенностях, приобретайте продукт 2iS:Администратор. Несмотря на наличие в конфигурации защищенного модуля, 99% программного кода конфигурации открыто, то есть Вы можете изучить реализацию описанных приемов.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка сос тигуан 2
  • Ошибка создания сокета что это