При организации работы кассовых узлов в терминальном режиме (RDP) на базе 1С часто возникает типовая проблема: эквайринговые библиотеки sbrf.dll и sbrfcom.dll периодически теряют регистрацию в операционной системе Windows Server. В результате 1С выдает ошибку: «Драйвер эквайринговой системы не найден» или «Ошибка инициализации объекта», а оплата по банковским картам становится невозможной до повторного выполнения команды regsvr32 администратором сервера.
Разберем подробно, почему возникает такое поведение в многопользовательской среде и как настроить сервер для стабильной работы касс.
Выясним, какие факторы приводят к потере регистрации библиотек Сбербанка в течение рабочего дня:
regsvr32.exe информация о компонентах и их CLSID помещается в общую ветку реестра HKEY_CLASSES_ROOT (связанную с HKEY_LOCAL_MACHINE). Если несколько терминальных пользователей запускают сеансы с разными каталогами или скрипты инициализации пытаются перерегистрировать DLL, сессии перезаписывают системные указатели путей друг друга.C:\sc552), одновременные транзакции на разных кассах вызывают коллизии файлового доступа, приводя к аварийному завершению работы COM-объекта в памяти 1С.HKEY_CURRENT_USER при завершении сеанса (User Profile Disks, сброс сессий по тайм-ауту), что приводит к удалению локальных связей классов.sbrf.dll и sbrfcom.dll являются 32-разрядными (x86). При использовании 64-битной платформы 1С:Предприятие прямая загрузка 32-битного COM-объекта невозможна без суррогатного процесса. На 64-разрядной ОС Windows регистрация должна проводиться утилитой из папки C:\Windows\SysWOW64\regsvr32.exe.Проанализируем базовый шаг для корректной работы нескольких терминалов на одном RDP-сервере. Главная задача — разделить рабочие каталоги драйвера между всеми сессиями кассиров.
%UserProfile%\sc552 или в структурированных папках C:\sc552_kassa1, C:\sc552_kassa2.sbrf.dll, sbrfcom.dll, pilot_nt.dll, конфигурационный файл pinpad.ini).pinpad.ini в каждой папке и явно укажем персональные пути к рабочим файлам:Пример настройки pinpad.ini:
WorkingDir=%UserProfile%\SC552
TlvDir=%UserProfile%\SC552
Такая изоляция исключает блокировку журналов и файлов транзакций при параллельной оплате на разных кассах.
Чтобы избежать конфликтов глобального реестра и необходимости выдавать кассирам административные права, снимем глобальную регистрацию и зафиксируем COM-классы индивидуально в ветке текущего пользователя HKEY_CURRENT_USER\Software\Classes.
C:\Windows\SysWOW64\regsvr32.exe /u "C:\sc552\sbrfcom.dll"
SBRFCOM, и импортируем их в ветку HKEY_CURRENT_USER\Software\Classes\CLSID для каждого терминального пользователя.sbrfcom.dll конкретного кассира.Рассмотрим вариант изоляции работы 32-битной библиотеки через суррогатный процесс Windows:
dcomcnfg.exe).Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.Sberbank_Driver) и выберем запуск от имени системной учетной записи или выделенного локального пользователя с правами.sbrfcom.dll.При такой схеме все вызовы драйвера изолируются в системных процессах dllhost.exe. Это снимает зависимость от прав локального кассира на системные ветки реестра и устраняет падения сессий при многопоточных обращениях.
Если специфика инфраструктуры требует контроля состояния драйвера непосредственно из 1С перед проведением операции, проанализируем пример кода для проверки доступности COM-объекта с перехватом исключений:
Попытка
ДрайверСбербанка = Новый COMОбъект("SBRFSRV.Server");
// Либо обращение к компоненте SBRFCOM.dll в зависимости от используемой версии
ДрайверСбербанка = Новый COMОбъект("Sbrf.Terminal");
Исключение
ТекстОшибки = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("Эквайринг.Сбербанк",
УровеньЖурналаРегистрации.Ошибка,,,
"Ошибка инициализации COM-объекта Сбербанка: " + ТекстОшибки);
ВызватьИсключение "Не удалось инициализировать драйвер эквайринга Сбербанка. Обратитесь к администратору.";
КонецПопытки;
Использование устаревших библиотек sbrf.dll и sbrfcom.dll в среде терминального сервера RDP архитектурно не рекомендуется производителем.
Рассмотрим современные и более надежные способы организации работы:
pilot_nt.dll. Он не требует выполнения regsvr32 и не зависит от записей в реестре Windows.