Перевод конфигураций со старых версий платформ (например, 1С 8.2) на современные релизы 1С 8.3 часто сопровождается трудностями при работе с торговым оборудованием. Типичный сценарий: база успешно обновлена, режим совместимости отключен, но при попытке пробития чека или подключения кассы система выдает ошибку инициализации драйвера. В этой статье мы подробно разберем, почему перестает работать популярная компонента ККМ «Штрих-М» (SMDrvFR1C22) и как вернуть работоспособность торгового оборудования без отката на устаревшие платформы.
Проанализируем техническую сторону проблемы. При переходе на платформу 1С 8.3 и отключении режима совместимости с версиями 8.1/8.2 кардинально меняются правила взаимодействия платформы с внешними библиотеками. Выделяют две основные причины сбоя:
SMDrvFR1C22) поставлялись исключительно в 32-битном исполнении.ЗагрузитьВнешнююКомпоненту считается устаревшим. При отключении режима совместимости платформа начинает строже контролировать безопасность и права доступа к системным ресурсам. Старый метод пытается зарегистрировать COM-объект «на лету» из временного файла, что часто блокируется операционной системой из-за настроек контроля учетных записей (UAC) или отсутствия прав администратора у пользователя.Посмотрим на пример старого кода, который успешно работал на платформе 8.2, но вызывает критическую ошибку на 8.3:
Попытка
мИмяAddin = "SMDrvFR1C22";
лДД = Документы.РасходнаяНакладная.ПолучитьМакет("ИнтеграционнаяКомпонента414");
лИмяФайла = ПолучитьИмяВременногоФайла("dll");
лДД.Записать(лИмяФайла);
ЗагрузитьВнешнююКомпоненту(лИмяФайла);
РезультатФункции = Новый ("AddIn." + мИмяAddin);
Исключение
ТекстОшибки = ОписаниеОшибки();
Сообщить("Ошибка загрузки внешней компоненты 'SMDrvFR1C22': " + СокрЛП(ТекстОшибки));
КонецПопытки;
При выполнении этого кода на 64-битном клиенте строка ЗагрузитьВнешнююКомпоненту(лИмяФайла); всегда будет вызывать исключение, поскольку платформа не сможет инициализировать 32-битную DLL-библиотеку драйвера.
Если вам необходимо восстановить работу кассы немедленно, самым простым и быстрым решением будет установка и запуск 32-разрядной (x86) версии тонкого или толстого клиента «1С:Предприятие».
Поскольку операционная система Windows x64 поддерживает выполнение 32-битных приложений, запуск x86-клиента 1С позволит ему корректно загрузить 32-битную компоненту драйвера ККМ Штрих-М. Этот способ не требует изменения программного кода конфигурации или обновления физических драйверов ККТ на рабочем месте кассира. Для решения сопутствующих проблем совместимости оборудования при переходе на современные версии систем можно использовать драйвер для интеграции старых ККТ «Штрих-М» с новыми релизами 1С.
Рано или поздно от использования 32-битного клиента придется отказаться (например, из-за нехватки оперативной памяти при формировании сложных отчетов или при переходе на Linux-клиенты). Чтобы полноценно использовать преимущества 64-битной платформы 1С 8.3, необходимо обновить драйвер оборудования:
smdrvfr_34_5_16_0_877_win_64.dll).Рассмотрим, как правильно модернизировать программный код для работы в новых версиях платформы 1С 8.3 без использования устаревших и небезопасных методов. Современный стандарт разработки внешних компонент подразумевает технологию Native API. Компоненты Native API не требуют регистрации в реестре Windows и могут поставляться в едином ZIP-архиве под любые архитектуры.
Разберем по шагам процесс перевода загрузки компоненты на новые рельсы:
smdrvfr32.dll и smdrvfr64.dll) в один ZIP-архив.MANIFEST.xml, где укажите соответствие файлов операционным системам и разрядностям.ПодключитьВнешнююКомпоненту вместо устаревшего ЗагрузитьВнешнююКомпоненту.Проанализируем пример современного и безопасного кода загрузки внешней компоненты из макета конфигурации:
ИмяМакета = "ОбщийМакет.ИнтеграционнаяКомпонентаШтрихМ";
ИмяКомпоненты = "SMDrvFR1C22";
// Используем безопасное подключение по технологии Native API
Если ПодключитьВнешнююКомпоненту(ИмяМакета, "ShtrihM", ТипВнешнейКомпоненты.Native) Тогда
Попытка
ДрайверККМ = Новый("AddIn.ShtrihM." + ИмяКомпоненты);
Сообщить("Компонента Штрих-М успешно подключена!");
Исключение
Сообщить("Ошибка создания объекта компоненты: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Не удалось подключить внешнюю компоненту из макета!");
КонецЕсли;
При таком подходе платформа 1С 8.3 самостоятельно проанализирует разрядность запущенного сеанса (x86 или x64), извлечет из ZIP-архива соответствующую DLL-библиотеку и безопасно подключит её без обращения к реестру Windows.
Выясним еще одну скрытую причину, из-за которой компонента может отказываться работать даже после перехода на правильную разрядность платформы. При работе разных версий 1С файлы внешних компонент кэшируются в локальных каталогах пользователя операционной системы.
Очень часто старая, поврежденная или заблокированная процессами версия библиотеки зависает в кэше и блокирует загрузку обновленного драйвера. Для решения этой проблемы выполните следующие действия:
%AppData%\Roaming\1C\1Cv8\ExtCompT\ (а также проверьте аналогичный каталог для старых версий платформ: %AppData%\Roaming\1C\1Cv82\ExtCompT\).ExtCompT.