При администрировании баз данных на платформе 1С:Предприятие 8.3 программисты и системные администраторы часто сталкиваются с проблемой принудительного завершения сеансов пользователей. В конфигурации Управление производственным предприятием (УПП) для этих целей используется типовая обработка БлокировкаСоединенийСИнформационнойБазой. Однако при переходе на 64-битную версию платформы (например, 8.3.12.1567) штатный механизм часто перестает работать, выдавая ошибку: Ошибка при вызове конструктора (COMОбъект): -2147221005(0x800401F3): Недопустимая строка с указанием класса.
В этой статье мы подробно разберем, почему возникает эта проблема, как правильно регистрировать компоненты в системе и каким образом обеспечить стабильную работу механизмов администрирования в смешанной среде (32-битные клиенты и 64-битный сервер).
Разберем природу ошибки 0x800401F3. Она означает, что операционная система Windows не может найти в реестре программный идентификатор (ProgID) V83.COMConnector. Основная сложность заключается в разрядности процессов. В 64-битных операционных системах реестр разделен на две части: для 64-битных и для 32-битных (WOW64) приложений. Если библиотека зарегистрирована только для одной архитектуры, приложение другой архитектуры ее просто «не увидит».
Вторая проблема — ошибка Метод объекта не обнаружен (ConnectAgent). Она обычно возникает, когда вместо компактного COMConnector по ошибке создается объект Application, либо когда происходит попытка обращения к методам административного интерфейса через объект, который не был должным образом инициализирован в контексте 64-битного сервера.
Первым делом проверим правильность регистрации библиотеки. На 64-битном сервере библиотека comcntr.dll находится в двух разных папках (если установлены оба клиента) или только в Program Files. Проанализируем путь к файлу для платформы 8.3.12.1567:
C:\Program Files\1cv8\8.3.12.1567\bin\comcntr.dllC:\Program Files (x86)\1cv8\8.3.12.1567\bin\comcntr.dllДля регистрации выполним следующие шаги. Запустим командную строку (CMD) от имени администратора. Рассмотрим команды для регистрации 64-битной компоненты:
cd "C:\Windows\System32"
regsvr32 "C:\Program Files\1cv8\8.3.12.1567\bin\comcntr.dll"
Если же ваш сервер приложений или клиент, инициирующий соединение, является 32-битным, необходимо использовать утилиту из папки SysWOW64:
cd "C:\Windows\SysWOW64"
regsvr32 "C:\Program Files (x86)\1cv8\8.3.12.1567\bin\comcntr.dll"
Важный нюанс: при установке платформы 8.3.12.1567 x64 регистрация часто не происходит автоматически. Ручная перерегистрация решает проблему "Недопустимой строки с указанием класса" в большинстве случаев.
Если в вашей инфраструктуре используется 64-битный сервер 1С, а запуск обработки происходит из 32-битного клиентского приложения (или наоборот), стандартная регистрация может не помочь из-за конфликта разрядности процессов. В этом случае мы воспользуемся механизмом COM+ (обертка в виде dllhost.exe).
Разберем пошагово процесс настройки «суррогатного» процесса:
Компьютеры — Мой компьютер — Приложения COM+.Создать — Приложение.Создать новое приложение, укажем имя (например, 1C_COM_Connector) и выберем тип Серверное приложение.Учетная запись укажем пользователя, под которым запускается служба Агент сервера 1С:Предприятие. Это критично для доступа к ресурсам кластера.Компоненты, нажмем Создать — Компонент.Установка новых компонентов и укажем путь к comcntr.dll из папки bin 64-битной платформы.После этого в свойствах созданного компонента нужно найти CLSID (уникальный идентификатор). Теперь при вызове в коде 1С система будет перенаправлять запрос в отдельный процесс dllhost.exe, который успешно свяжет 32-битную и 64-битную архитектуры.
Часто проблема кроется в самом программном коде. Обратим внимание на пример кода, который использовал автор темы для работы с нестандартным портом (2141). Рассмотрим правильную последовательность инициализации соединения:
// Инициализация соединителя
Попытка
// Используем универсальный метод получения имени COM-соединителя
ИмяCOM = "V83.COMConnector";
COMСоединитель = Новый COMОбъект(ИмяCOM);
Исключение
Сообщить("Не удалось создать COM-объект " + ИмяCOM + ". Проверьте регистрацию comcntr.dll");
Возврат;
КонецПопытки;
// Подключение к агенту сервера с учетом порта
Попытка
// Важно: порт агента (ragent) по умолчанию 1540,
// но в строке подключения нужно указывать адрес сервера и порт через двоеточие
АгентСервера = COMСоединитель.ConnectAgent(ИдентификаторАгентаСервера + ":2141");
Исключение
Сообщить("Ошибка подключения к агенту сервера: " + ОписаниеОшибки());
КонецПопытки;
Проанализируем ситуацию с ошибкой Метод объекта не обнаружен (ConnectAgent). Если вы видите такую ошибку, убедитесь, что переменная COMСоединитель действительно является объектом V83.COMConnector. Если в системе зарегистрирован только V83.Application, 1С может попытаться создать его в качестве "запасного" варианта, но у объекта Application (запускающего окно программы) нет метода ConnectAgent. Этот метод есть только у легковесного COM-соединителя.
Выясним, почему в современных конфигурациях, таких как ERP, эта проблема встречается реже. Платформа 1С:Предприятие предлагает более современный механизм администрирования — RAS (Remote Administration Service) и утилиту RAC.
Этот способ не использует технологию COM, а работает через TCP-порты (по умолчанию 1545). Проанализируем преимущества этого метода:
Если ваша задача — регулярное управление сеансами, рекомендуем рассмотреть настройку службы ras.exe на сервере. В коде 1С это реализуется через запуск внешнего приложения rac.exe с параметрами или через использование объектов типа АдминистрированиеКластера, доступных в последних версиях БСП.
Подводя итог, если ваша обработка в УПП перестала выбрасывать пользователей на 64-битном сервере, выполните следующие действия:
regsvr32 для 64-битной comcntr.dll от имени администратора.ConnectAgent.V83.COMConnector, а не V83.Application.Следуя этим инструкциям, вы сможете восстановить работоспособность механизмов администрирования и обеспечите стабильную работу пользователей при выполнении регламентных операций, таких как восстановление последовательности или обновление информационной базы.