Почему зависает 1С 7.7 при загрузке внешней компоненты DrvFR.dll и как это исправить?

Системный администратор 1С v7.7 1С:Управление торговлей Торговля и дистрибуция
← На главную

При работе с конфигурацией «Торговля и Склад 9.2» на платформе 1С:Предприятие 7.7 часто встречается неприятная проблема: при запуске программы или при попытке обращения к фискальному регистратору система наглухо зависает на сообщении «Выполняется обработка». Процесс 1cv7s.exe перестает откликаться и не завершается даже через Диспетчер задач или утилиту taskkill.

Посмотрим, почему происходит этот сбой, проанализируем основные причины и разберем проверенные способы решения данной проблемы.

Почему возникает зависание при загрузке внешней компоненты?

Выясним главные факторы, вызвающие блокировку потока исполнения 1С 7.7 при вызове метода ЗагрузитьВнешнююКомпоненту:

  1. Неопределенность каталога поиска библиотеки. Передача короткого имени файла (например, "DrvFR.dll") заставляет 1С искать библиотеку по очереди в каталоге программы (папка BIN), каталоге базы данных, текущем рабочем каталоге и папках переменной PATH. Если текущий каталог изменился или в системе присутствуют устаревшие дубликаты, загружается не тот файл.
  2. Блокировка при саморегистрации (DllRegisterServer). Метод ЗагрузитьВнешнююКомпоненту автоматически пытается зарегистрировать DLL в реестре Windows. При недостатке прав администратора или блокировке ключей HKCR\AddIn.DrvFR процесс зависает в ожидании ответа от ОС.
  3. Отсутствие необходимых зависимых файлов. Современные версии драйвера фискального регистратора (Штрих-М) требуют наличия сопутствующих файлов, таких как sqlite.dll (или sqlite3.dll) и файла лицензии DrvFR.lic. Если их нет рядом с исполняемой библиотекой, процесс инициализации DLL зацикливается.
  4. Опрос занятых COM-портов. При первой инициализации DrvFR.dll может опрашивать доступные последовательные порты. Если в системе установлено ПО банковского эквайринга (например, пинпад Сбербанка) и создан виртуальный COM-порт, драйвер ФР попадает в бесконечное ожидание отклика от занятого порта.

Способ 1. Использование абсолютного пути к файлу библиотеки

Рассмотрим самое быстрое и эффективное решение. Вместо использования относительно имени файла сформируем полный путь к компоненте с помощью встроенных функций платформы КаталогПрограммы() или КаталогБД().

Найдем в конфигурации или обработке торгового оборудования место вызова внешней компоненты и заменим короткое имя на явный абсолютный путь:


// Не рекомендуется: 1С ищет файл по непредсказуемому пути
// ЗагрузитьВнешнююКомпоненту("DrvFR.dll");

// Рекомендуется: явное указание каталога программы
ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "DrvFR.dll");

// Или явный путь к системному каталогу, если файл размещен там:
// ЗагрузитьВнешнююКомпоненту("C:\Windows\System32\DrvFR.dll");

Передача полного пути гарантирует, что платформа обратится именно к той версии файла, которая размещена в папке с платформой 1С или в системном каталоге.

Способ 2. Добавление зависимых файлов (sqlite.dll и DrvFR.lic)

Проанализируем состав файлов драйвера. Для полноценной работы драйверам ККМ от компании «Штрих-М» требуются дополнительные библиотеки. Если положить в папку BIN только один файл DrvFR.dll, вызов компоненты будет завершаться сбоем.

Проверим наличие и скопируем в каталог, где расположена DrvFR.dll (например, в C:\Program Files\1Cv77\BIN\), следующие файлы из дистрибутива драйвера:

  1. sqlite.dll (или sqlite3.dll) — библиотека базы данных для работы драйвера;
  2. DrvFR.lic — файл лицензии драйвера;
  3. DrvFR.ini — файл конфигурации параметров подключения.

Способ 3. Предварительная регистрация библиотеки через regsvr32

Чтобы исключить попытки платформы 1С 7.7 регистрировать библиотеку при каждом запуске, выполним регистрацию вручную в операционной системе под правами администратора.

Разберем по шагам порядок действий:

  1. Запустим командную строку (cmd.exe) от имени Администратора.
  2. Выполним команду регистрации библиотеки: regsvr32 "C:\Program Files\1Cv77\BIN\DrvFR.dll"
  3. В коде 1С заменим вызов метода ЗагрузитьВнешнююКомпоненту на инициализацию уже зарегистрированного COM-объекта через метод ПодключитьВнешнююКомпоненту:
    
    Если ПодключитьВнешнююКомпоненту("AddIn.DrvFR") = 0 Тогда
        Предупреждение("Не удалось подключить внешнюю компоненту DrvFR!");
    КонецЕсли;
    

Этот подход полностью предотвращает зависание при старте, так как 1С обращается к уже готовой записи в реестре Windows без выполнения синхронного вызова DllRegisterServer.

Способ 4. Ограничение опроса COM-портов и очистка реестра

Если сбой возник после установки ПО банковского терминала, проанализируем настройки драйвера ККМ:

  1. Откроем утилиту «Тест драйвера ФР» вне 1С и зайдем в настройки свойства устройства.
  2. Ограничим список сканируемых COM-портов, явно указав конкретный номер порта (например, COM1), к которому подключен фискальный регистратор. Это исключит попытки драйвера опрашивать виртуальный порт эквайринга.
  3. Удалим устаревшие копии DrvFR.dll из каталогов C:\Windows\System32 и C:\Windows\SysWOW64, чтобы в системе осталась только одна актуальная версия библиотеки.
← На главную