Ошибка загрузки внешней компоненты ККМ Штрих-М после обновления платформы 1С: как решить проблему

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

Перевод конфигураций со старых версий платформ (например, 1С 8.2) на современные релизы 1С 8.3 часто сопровождается трудностями при работе с торговым оборудованием. Типичный сценарий: база успешно обновлена, режим совместимости отключен, но при попытке пробития чека или подключения кассы система выдает ошибку инициализации драйвера. В этой статье мы подробно разберем, почему перестает работать популярная компонента ККМ «Штрих-М» (SMDrvFR1C22) и как вернуть работоспособность торгового оборудования без отката на устаревшие платформы.

Почему возникает ошибка «Ошибка при вызове метода контекста (ЗагрузитьВнешнююКомпоненту)»?

Проанализируем техническую сторону проблемы. При переходе на платформу 1С 8.3 и отключении режима совместимости с версиями 8.1/8.2 кардинально меняются правила взаимодействия платформы с внешними библиотеками. Выделяют две основные причины сбоя:

  1. Несоответствие разрядности (разрядный конфликт). Это ключевая причина. Если на рабочих местах пользователей установлена 64-разрядная версия клиента «1С:Предприятие», она физически не способна загрузить в свое адресное пространство 32-разрядную динамическую библиотеку (DLL). Старые интеграционные компоненты «Штрих-М» (в частности, макеты с драйвером серии 4.14 и библиотека SMDrvFR1C22) поставлялись исключительно в 32-битном исполнении.
  2. Устаревание механизмов платформы. Метод ЗагрузитьВнешнююКомпоненту считается устаревшим. При отключении режима совместимости платформа начинает строже контролировать безопасность и права доступа к системным ресурсам. Старый метод пытается зарегистрировать COM-объект «на лету» из временного файла, что часто блокируется операционной системой из-за настроек контроля учетных записей (UAC) или отсутствия прав администратора у пользователя.

Посмотрим на пример старого кода, который успешно работал на платформе 8.2, но вызывает критическую ошибку на 8.3:


Попытка
    мИмяAddin = "SMDrvFR1C22";
    лДД       = Документы.РасходнаяНакладная.ПолучитьМакет("ИнтеграционнаяКомпонента414");
    лИмяФайла = ПолучитьИмяВременногоФайла("dll");            
    лДД.Записать(лИмяФайла);
    ЗагрузитьВнешнююКомпоненту(лИмяФайла);
    РезультатФункции = Новый ("AddIn." + мИмяAddin);
Исключение
    ТекстОшибки = ОписаниеОшибки();
    Сообщить("Ошибка загрузки внешней компоненты 'SMDrvFR1C22': " + СокрЛП(ТекстОшибки));
КонецПопытки; 

При выполнении этого кода на 64-битном клиенте строка ЗагрузитьВнешнююКомпоненту(лИмяФайла); всегда будет вызывать исключение, поскольку платформа не сможет инициализировать 32-битную DLL-библиотеку драйвера.

Решение 1. Использование 32-разрядного клиента 1С (Быстрый способ)

Если вам необходимо восстановить работу кассы немедленно, самым простым и быстрым решением будет установка и запуск 32-разрядной (x86) версии тонкого или толстого клиента «1С:Предприятие».

Поскольку операционная система Windows x64 поддерживает выполнение 32-битных приложений, запуск x86-клиента 1С позволит ему корректно загрузить 32-битную компоненту драйвера ККМ Штрих-М. Этот способ не требует изменения программного кода конфигурации или обновления физических драйверов ККТ на рабочем месте кассира. Для решения сопутствующих проблем совместимости оборудования при переходе на современные версии систем можно использовать драйвер для интеграции старых ККТ «Штрих-М» с новыми релизами 1С.

Решение 2. Переход на современные версии драйверов Штрих-М (Рекомендуемый способ)

Рано или поздно от использования 32-битного клиента придется отказаться (например, из-за нехватки оперативной памяти при формировании сложных отчетов или при переходе на Linux-клиенты). Чтобы полноценно использовать преимущества 64-битной платформы 1С 8.3, необходимо обновить драйвер оборудования:

  1. Скачайте и установите на рабочем компьютере актуальную версию драйвера ККТ «Штрих-М» (начиная с версий 5.15/5.16 и выше). Современные дистрибутивы производителя содержат как 32-битные, так и 64-битные версии интеграционных библиотек.
  2. При установке драйвера в системе будут зарегистрированы обе версии компонент. При этом 64-битный клиент 1С сможет автоматически подхватить нужную библиотеку (например, smdrvfr_34_5_16_0_877_win_64.dll).

Решение 3. Перевод кода на технологию Native API и использование ZIP-макетов

Рассмотрим, как правильно модернизировать программный код для работы в новых версиях платформы 1С 8.3 без использования устаревших и небезопасных методов. Современный стандарт разработки внешних компонент подразумевает технологию Native API. Компоненты Native API не требуют регистрации в реестре Windows и могут поставляться в едином ZIP-архиве под любые архитектуры.

Разберем по шагам процесс перевода загрузки компоненты на новые рельсы:

  1. Поместите файлы библиотек драйвера для разных разрядностей (например, smdrvfr32.dll и smdrvfr64.dll) в один ZIP-архив.
  2. Добавьте в архив файл описания (манифест) с именем MANIFEST.xml, где укажите соответствие файлов операционным системам и разрядностям.
  3. Загрузите полученный ZIP-архив в макет конфигурации с типом Двоичные данные.
  4. Используйте метод ПодключитьВнешнююКомпоненту вместо устаревшего ЗагрузитьВнешнююКомпоненту.

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


ИмяМакета = "ОбщийМакет.ИнтеграционнаяКомпонентаШтрихМ";
ИмяКомпоненты = "SMDrvFR1C22";

// Используем безопасное подключение по технологии Native API
Если ПодключитьВнешнююКомпоненту(ИмяМакета, "ShtrihM", ТипВнешнейКомпоненты.Native) Тогда
    Попытка
        ДрайверККМ = Новый("AddIn.ShtrihM." + ИмяКомпоненты);
        Сообщить("Компонента Штрих-М успешно подключена!");
    Исключение
        Сообщить("Ошибка создания объекта компоненты: " + ОписаниеОшибки());
    КонецПопытки;
Иначе
    Сообщить("Не удалось подключить внешнюю компоненту из макета!");
КонецЕсли;

При таком подходе платформа 1С 8.3 самостоятельно проанализирует разрядность запущенного сеанса (x86 или x64), извлечет из ZIP-архива соответствующую DLL-библиотеку и безопасно подключит её без обращения к реестру Windows.

Решение 4. Очистка локального кэша внешних компонент

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

Очень часто старая, поврежденная или заблокированная процессами версия библиотеки зависает в кэше и блокирует загрузку обновленного драйвера. Для решения этой проблемы выполните следующие действия:

  1. Полностью закройте все запущенные сеансы «1С:Предприятие», что также требуется, когда программа архивирует, обновляет и тестирует базы 1С в автоматическом режиме.
  2. Перейдите в каталог кэша внешних компонент на рабочем компьютере. Обычно он расположен по пути: %AppData%\Roaming\1C\1Cv8\ExtCompT\ (а также проверьте аналогичный каталог для старых версий платформ: %AppData%\Roaming\1C\1Cv82\ExtCompT\).
  3. Полностью удалите все содержимое папки ExtCompT.
  4. Запустите 1С и повторите попытку подключения торгового оборудования — платформа автоматически загрузит актуальную чистую копию библиотеки.
← На главную