Как исправить ошибку COM-соединения в 1С при зарегистрированной библиотеке comcntr.dll?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Типичная ситуация: после планового обновления или переустановки сервера 1С:Предприятие (например, на релиз 8.3.12.1685) ломается привычный автоматический обмен данными между базами (например, между «Зарплата и управление персоналом» и «Бухгалтерия предприятия»). При попытке запустить синхронизацию система выдает лаконичное, но крайне неприятное сообщение: «Ошибка COM-соединения».

При этом администратор уже выполнил базовые действия: библиотека comcntr.dll успешно зарегистрирована в операционной системе через утилиту regsvr32, на сервере установлена только одна версия платформы 1С, а сама архитектура операционной системы, сервера 1С и платформы является полностью 64-разрядной. Казалось бы, конфликта разрядностей быть не должно. Однако обмен все равно отказывается работать.

В этой статье мы подробно разберем по шагам, почему возникает эта проблема и как настроить операционную систему Windows и сервер 1С для восстановления корректной работы COM-соединения.

Выясняем причины: почему стандартной регистрации DLL недостаточно?

Для начала проанализируем ситуацию с архитектурной точки зрения. Ошибка COM-соединения в среде 64-битных систем чаще всего кроется в одной из следующих причин:

  1. Проблема разрядности процессов (32-bit vs 64-bit). Даже если сервер 1С и ОС являются 64-битными, инициатором соединения может выступать 32-битный процесс. Например, у пользователя на компьютере запущен 32-битный тонкий клиент, или фоновое задание пытается вызвать соединение. Напрямую загрузить 64-битную DLL-библиотеку внутрипроцессно в 32-битное приложение (и наоборот) Windows физически не способна.
  2. Права доступа службы сервера 1С. Если обмен запускается регламентным (фоновым) заданием, то исполнителем кода выступает процесс rphost, запущенный от имени системной учетной записи (обычно это usr1cv8). По умолчанию у этого пользователя отсутствуют права на запуск и активацию локальных COM-объектов в системе.
  3. Конфликты в реестре Windows. При частых обновлениях платформы в системном реестре остаются устаревшие ветки, указывающие на несуществующие каталоги старых релизов 1С.
  4. Отсутствие необходимых компонентов C++ в ОС. Современные версии платформы 1С (начиная с 8.3.11 и выше) жестко завязаны на обновленные системные библиотеки Microsoft Visual C++ и универсальную среду выполнения C (Universal CRT). Без них библиотека регистрируется, но при вызове падает без объяснения причин.

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

Решение 1. Создание внепроцессного COM+ приложения в Windows (обертка DLL)

Это самый надежный способ решить проблему разрядности. Мы заставим Windows запускать библиотеку comcntr.dll в изолированном системном хост-процессе dllhost.exe, который будет выступать «мостом» между процессами разной разрядности.

Выполним настройку по шагам:

  1. Откройте утилиту управления компонентами. Для этого нажмите сочетание клавиш Win + R, введите команду dcomcnfg и нажмите Enter.
  2. В открывшемся окне перейдите по дереву: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Нажмите правой кнопкой мыши на раздел Приложения COM+, выберите в контекстном меню Создать -> Приложение.
  4. В открывшемся мастере нажмите Далее, затем выберите Создать новое приложение.
  5. Введите имя для нового приложения (например, V83_COMConnector) и обязательно выберите способ активации: Серверное приложение (Server Application). Нажмите Далее.
  6. В окне выбора удостоверения (Identity) укажите учетную запись, под которой будет запускаться данный процесс. Рекомендуется использовать специального локального администратора или системную учетную запись с достаточными правами. В простых случаях можно выбрать Указанный пользователь и ввести данные администратора сервера. Нажмите Далее и завершите создание приложения.
  7. Теперь раскройте созданную ветку V83_COMConnector, найдите в ней папку Компоненты. Нажмите на нее правой кнопкой мыши и выберите Создать -> Компонент.
  8. В мастере выберите Установка новых компонентов и укажите путь к файлу вашей зарегистрированной библиотеки. Путь выглядит примерно так: C:\Program Files\1cv8\8.3.12.1685\bin\comcntr.dll. Завершите добавление.

После проведения этих манипуляций Windows сможет корректно транслировать вызовы к 1С независимо от того, какой разрядности процесс пытается инициировать соединение.

Решение 2. Настройка прав для учетной записи службы 1С (usr1cv8)

Если обмен запускается по расписанию на сервере, нам необходимо предоставить службе 1С права на использование созданного нами COM-объекта.

Проанализируем шаги по настройке прав безопасности:

  1. В утилите dcomcnfg нажмите правой кнопкой мыши на наше созданное приложение V83_COMConnector и откройте его Свойства.
  2. Перейдите на вкладку Безопасность (Security).
  3. В области «Авторизация» снимите флажок Принудительная проверка доступа для приложений.
  4. В уровне ограничений для пакетов выберите значение Идентификация.
  5. Перейдите во вкладку Удостоверение (Identity) и убедитесь, что там выбран пользователь с достаточными правами для работы с файловой системой и сетью (например, локальный системный администратор).
  6. Дополнительно откройте ветку Настройка DCOM в службах компонентов, найдите там параметры запуска для созданного класса и предоставьте права пользователю usr1cv8 на локальный запуск и локальную активацию.

Решение 3. Полная перерегистрация библиотеки и очистка реестра

Если в системе ранее было установлено несколько версий платформы 1С, реестр Windows может хранить старые ключи классов V83.COMConnector, которые перенаправляют вызовы по некорректным путям.

Для исправления ситуации выполним полную перерегистрацию. Запустите командную строку (CMD) обязательно от имени Администратора и выполните следующие команды по очереди:


rem Сначала принудительно отменяем регистрацию библиотеки для старого и нового релизов
regsvr32 /u "C:\Program Files\1cv8\8.3.12.1685\bin\comcntr.dll"

rem Заново регистрируем целевую библиотеку актуальной версии платформы
regsvr32 "C:\Program Files\1cv8\8.3.12.1685\bin\comcntr.dll"

После этого рекомендуется проверить реестр Windows. Нажмите Win + R, введите regedit. Перейдите по пути HKEY_CLASSES_ROOT\CLSID\ и найдите уникальный идентификатор (GUID) компоненты 1С. Убедитесь, что параметр InprocServer32 указывает на корректный физический путь к файлу в папке 8.3.12.1685\bin.

Решение 4. Обновление системного окружения Windows (Visual C++ и Universal CRT)

Начиная с версии платформы 8.3.11, фирма 1С повысила требования к операционной системе. Библиотека comcntr.dll не сможет инициализироваться, если в ОС отсутствуют современные библиотеки среды выполнения.

Выясним, какие компоненты необходимо установить на сервер:

Решение 5. Проверка состава установленных компонентов 1С

В некоторых случаях при быстром или автоматическом обновлении платформы системные администраторы забывают указать установку COM-компонентов. По умолчанию при выборочной установке данный флаг может быть снят.

Чтобы проверить это:

  1. Зайдите в Панель управления сервером -> Программы и компоненты.
  2. Найдите установленную платформу 1С:Предприятие вашей версии и нажмите кнопку Изменить.
  3. В появившемся окне установщика выберите пункт Изменить.
  4. Убедитесь, что на компоненте COM-соединение (в некоторых версиях называется «Внешнее соединение») не стоит красный крестик. Если компонент отключен, включите его установку на локальный жесткий диск и завершите работу мастера установки.

После проведения установки обязательно повторите регистрацию библиотеки в командной строке, как это было описано в Решении 3.

Проверка выполненной работы

Для того чтобы убедиться, что COM-соединение теперь функционирует нормально, мы можем запустить внешнюю обработку или выполнить простой скрипт на встроенном языке 1С. Посмотрим на пример кода, который инициализирует соединение:


Попытка
    Комнектор = Новый COMОбъект("V83.COMConnector");
    ПараметрыПодключения = "Srvr=""ИмяСервера"";Ref=""ИмяБазы"";Usr=""Администратор"";Pwd=""Пароль"";";
    Соединение = Комнектор.Connect(ПараметрыПодключения);
    Сообщить("Успешное подключение! Версия платформы: " + Соединение.Metadata.Version);
Исключение
    Сообщить("Ошибка инициализации COM-объекта: " + ОписаниеОшибки());
КонецПопытки;

Если код возвращает сообщение об успешном подключении и выводит версию платформы, значит, все настройки выполнены верно, права безопасности настроены корректно, а системные компоненты Windows находятся в актуальном состоянии.

← На главную