При программной интеграции и обмене данными между базами «1С:Предприятие» разработчики часто сталкиваются с ситуацией, когда обычный пользовательский сеанс в толстом или тонком клиенте запускается без нареканий, однако при попытке установить программное соединение через COM-коннектор возникает исключение:
Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V82.COMConnector.1 / V83.COMConnector.1): Не найдена лицензия. Не обнаружен ключ защиты программы или полученная программная лицензия!
Разберем детально, почему возникает данная ошибка, как работает механизм лицензирования при внешнем подключении и какие шаги необходимо предпринять для восстановления стабильного обмена данными.
Проанализируем механику работы COM-коннектора платформы «1С:Предприятие». В отличие от полноценного клиентского приложения, объект COMConnector реализуется через динамическую библиотеку comcntr.dll. Данная библиотека загружается непосредственно в адресное пространство вызывающего процесса и инициализирует собственный независимый сеанс лицензирования.
Выделим основные причины, по которым коннектор не может получить лицензию:
1CEStart.cfg текущего пользователя. Если в настройках запуска отключен флаг использования аппаратных лицензий (параметр UseHWLicenses=0), COM-соединение полностью игнорирует сетевые ключи HASP и пытается найти только программные лицензии (файлы .lic).USR1CV8). У этой учетной записи может отсутствовать доступ к каталогам с лицензиями или могут быть установлены собственные индивидуальные настройки стартера.Рассмотрим самое быстрое и распространенное решение, когда в организации используются аппаратные USB-ключи защиты HASP. Для того чтобы COM-коннектор начал опрашивать аппаратные ключи, выполним следующие шаги:
Альтернативно мы можем скорректировать конфигурационный файл вручную. Перейдем в каталог профиля пользователя по пути %APPDATA%\1C\1CEStart\ или %LOCALAPPDATA%\1C\1CEStart\, откроем файл 1CEStart.cfg в текстовом редакторе и убедимся, что параметр выставлен в единицу:
UseHWLicenses=1
Если файл был поврежден или содержал некорректные параметры, можно удалить 1CEStart.cfg — платформа создаст его заново со стандартными настройками при следующем старте.
Если рабочие места и сервер лицензирования разделены маршрутизаторами или виртуальными сетями, настроим адресный опрос менеджера лицензий HASP через конфигурационный файл nethasp.ini.
nethasp.ini в каталоге платформы. Обычно он расположен по пути:
C:\Program Files (x86)\1cv82\conf\ (или в каталоге конкретного релиза ...\bin\conf\).[NH_TCPIP].NH_SERVER_ADDR (убрав точку с запятой в начале строки) и укажем точный IP-адрес компьютера или сервера, на котором установлен аппаратный ключ и запущен HASP License Manager:
NH_USE_BROADCAST = Disabled для отключения лишних широковещательных пакетов.Если соединение устанавливается с клиент-серверной базой данных, проанализируем параметры информационной базы в консоли администрирования кластера серверов 1С:
После включения этой опции сервер 1С сможет выделять клиентские лицензии из своего пула для входящих COM-соединений, если у вызывающей стороны отсутствует собственный ключ.
Посмотрим на пример кода на встроенном языке 1С, демонстрирующий безопасную инициализацию COM-подключения с перехватом исключений и корректной очисткой объектов в памяти:
Попытка
// Создаем экземпляр COM-коннектора (для платформы 8.2 используется V82.COMConnector)
COMКоннектор = Новый COMОбъект("V82.COMConnector");
// Строка подключения для клиент-серверной базы
СтрокаПодключения = "Srvr=""Server1C"";Ref=""ZUP_Base"";Usr=""Обмен"";Pwd=""Password123"";";
// Выполняем соединение с информационной базой
ВнешнееСоединение = COMКоннектор.Connect(СтрокаПодключения);
// Выполняем необходимые действия в базе-приемнике
МассивСотрудников = ВнешнееСоединение.Справочники.СотрудникиОрганизаций.Выбрать();
Сообщить("Соединение с информационной базой успешно установлено!");
Исключение
// Обрабатываем ошибки лицензирования и подключения
ОписаниеОшибки = ОписаниеОшибки();
Сообщить("Не удалось установить COM-соединение: " + ОписаниеОшибки);
ВнешнееСоединение = Неопределено;
COMКоннектор = Неопределено;
КонецПопытки;
Важный момент: помните, что каждое активное внешнее подключение через COMConnector занимает одну клиентскую лицензию на все время существования объекта соединения в памяти. После завершения обмена обязательно очищайте переменные соединения (присваивая значение Неопределено) или принудительно вызывайте сборку мусора, чтобы освободить лицензию для других пользователей.