При работе в клиент-серверном варианте 1С:Предприятие программисты часто сталкиваются с ошибкой -2147221005 (0x800401F3) Недопустимая строка с указанием класса. Эта проблема возникает в момент инициализации COM-соединения, когда система пытается выполнить код Новый COMОбъект("V83.COMConnector"). Ошибка может проявляться внезапно: вчера всё работало, а сегодня у пользователя с правами администратора или бухгалтера возникает сбой. В этой статье мы подробно разберем, почему это происходит и как правильно настроить систему для стабильной работы.
Для начала проанализируем техническую суть проблемы. Ошибка «Недопустимая строка с указанием класса» означает, что операционная система Windows в своем реестре не может найти описание (CLSID) для программного идентификатора V83.COMConnector. Простыми словами, Windows не знает, какую библиотеку (DLL) нужно запустить, чтобы создать этот объект.
Рассмотрим основные причины, по которым это случается:
comcntr.dll, отвечающий за COM-соединение, не зарегистрирован в системе через regsvr32.&НаКлиенте (на терминальном сервере), а библиотека установлена только на сервере 1С.HKEY_CLASSES_ROOT, где хранятся данные о COM-объектах.Как показывает практика и обсуждение на форумах, наиболее эффективным решением в клиент-серверной архитектуре является перенос создания объекта V83.COMConnector с клиента на сервер. Проанализируем ситуацию: если мы запускаем код с директивой &НаКлиенте, 1С ищет библиотеку на локальном компьютере пользователя (или на терминальном сервере). Если же мы используем директиву &НаСервере, поиск происходит на сервере, где запущен кластер 1С.
Выясним, как это выглядит в коде. Вместо того чтобы создавать объект прямо в форме, вынесем эту логику в серверный модуль:
&НаСервере
Функция УстановитьСоединениеНаСервере(СтрокаПодключения)
Попытка
Коннектор = Новый COMОбъект("V83.COMConnector");
Соединение = Коннектор.Connect(СтрокаПодключения);
Возврат Соединение;
Исключение
ЗаписьЖурналаРегистрации("Ошибка COM", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
ВызватьИсключение "Не удалось установить COM-соединение на сервере.";
КонецПопытки;
КонецФункции
&НаКлиенте
Процедура ВыполнитьПодключение()
СтрокаСоединения = "Srvr='Server1C';Ref='BaseName';Usr='Admin';Pwd='123';";
Результат = УстановитьСоединениеНаСервере(СтрокаСоединения);
КонецПроцедуры
В данном случае нам становится неважно, зарегистрирована ли компонента на терминальном сервере у бухгалтера. Главное, чтобы она была корректно установлена на сервере 1С:Предприятие. Поскольку серверная часть 1С обычно устанавливается полностью, нужные библиотеки там уже есть. Наличие зарегистрированной серверной компоненты особенно важно для фоновых задач, выполняющих регулярный автоматический обмен данными между базами 1С через COM-соединение.
Если специфика вашей задачи требует создания объекта именно &НаКлиенте (например, при интеграции с локальными файлами пользователя на терминале), необходимо убедиться, что библиотека зарегистрирована в ОС. Проанализируем шаги по регистрации:
comcntr.dll. Обычно он находится по пути: C:\Program Files\1cv8\8.3.X.XXXX\bin\ (где X.XXXX — номер вашей версии платформы).
regsvr32 "C:\Program Files\1cv8\8.3.23.1865\bin\comcntr.dll"
Важный момент: Если на сервере установлено несколько версий платформы, регистрируйте ту, которая используется в данный момент. Помните, что регистрация V83.COMConnector является общей для системы, и последняя зарегистрированная библиотека станет «главной» для этого программного идентификатора.
Часто возникает ситуация: сервер 1С 64-битный, а клиентское приложение — 32-битное. Напрямую они не смогут работать с одной и той же версией comcntr.dll. В этом случае рассмотрим настройку «обертки» через Службы компонентов (Component Services).
Разберем этот процесс по шагам:
1C_COM_Connector) и выберем способ активации «Серверное приложение».comcntr.dll.Такая настройка позволяет 32-битному клиенту обращаться к 64-битной библиотеке через прослойку Windows, что полностью решает проблему «Недопустимой строки с указанием класса». После выполнения этой настройки внешние компоненты начнут работать стабильно, что необходимо, например, для запуска автоматической сверки бухгалтерских и налоговых проводок между базами 1С.
Чтобы быстро проверить, видит ли текущий пользователь (например, тот самый бухгалтер) нужный класс в системе, мы можем воспользоваться инструментом PowerShell. Рассмотрим простую команду:
New-Object -ComObject "V83.COMConnector"
Если команда возвращает данные об объекте без ошибок, значит, регистрация в реестре прошла успешно. Если же PowerShell выдает ошибку "Class not registered", значит, проблема в системных настройках Windows или правах доступа к ветке HKEY_CLASSES_ROOT.
Подводя итог, проанализируем наиболее стабильную стратегию работы. Мы рекомендуем всегда стремиться к выполнению кода &НаСервере. Это избавляет системных администраторов от необходимости регистрировать COM-компоненты на каждом терминальном сервере или клиентском ПК. Если же ошибка возникла внезапно, проверьте, не обновлялась ли платформа 1С накануне: при обновлении регистрация старой библиотеки может «слететь», а новая может не прописаться автоматически из-за политик безопасности.
Использование связки &НаСервере + COM+ обертка является «золотым стандартом» для крупных систем, обеспечивая независимость от разрядности приложений и прав локальных пользователей.