В этой статье мы подробно разберем ситуацию настройки "Мультимерчанта" (использование одного физического эквайрингового терминала для приема оплат на несколько юридических лиц) в конфигурации 1С:Розница 2.3.
Часто возникает проблема: администратор создает два экземпляра подключаемого оборудования и два эквайринговых терминала с разными Terminal ID (TID). При пробитии чека кассовая программа корректно определяет, на какую организацию должен упасть чек, и даже предлагает выбрать терминал. Однако в банк отправляется неверный номер терминала (обычно тот, который был инициализирован первым). В результате выручка смешивается или падает не на ту организацию.
Давайте разберемся, почему так происходит, и рассмотрим рабочие методы решения этой задачи.
Проанализируем механику работы Библиотеки Подключаемого Оборудования (БПО) и драйверов (в частности, Inpas DualConnector). Когда 1С инициализирует оборудование, создается объект драйвера, который загружается в память. Если у нас создано два логических устройства, использующих одну и ту же компоненту (DLL), платформа может использовать один и тот же экземпляр объекта драйвера или не производить повторную передачу параметров подключения перед каждой операцией.
В результате, когда кассир выбирает вторую организацию, 1С обращается к драйверу, но драйвер "помнит" параметры инициализации первого устройства (первый TID) и отправляет транзакцию с ним.
Это наиболее надежный вариант, предложенный в обсуждении. Суть метода заключается в принудительной установке параметров драйвера (включая ID терминала) непосредственно перед выполнением эквайринговой операции.
В типовой схеме работы идентификация подключенного экземпляра происходит по идентификатору устройства, но повторная передача параметров (таких как TID) в драйвер может не выполняться, если драйвер считается уже подключенным. Нам необходимо вмешаться в процесс перед вызовом функции оплаты.
Рассмотрим код, который можно поместить в расширение конфигурации. Нам необходимо перехватить процедуру работы с эквайринговым терминалом и добавить туда блок обновления параметров.
Пример функции, которую мы будем модифицировать (или оборачивать):
Асинх Функция ЭквайринговаяОперация(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации, Команда)
// Проверяем, что работаем именно с эквайринговым терминалом
Если ПараметрыПодключения.ТипОборудования = ПредопределенноеЗначение(Перечисления.ТипыПодключаемогоОборудования.ЭквайринговыйТерминал) Тогда
ПараметрыДрайвера = Новый Структура;
// Перебираем параметры подключения, настроенные в 1С
Если ПараметрыПодключения.Параметры <> Неопределено Тогда
Для Каждого Параметр Из ПараметрыПодключения.Параметры Цикл
// В БПО параметры устройства часто начинаются с префикса "P_"
// Нам нужно отсечь префикс и передать чистое имя параметра и значение в драйвер
Если Лев(Параметр.Ключ, 2) = "P_" Тогда
ЗначениеПараметра = Параметр.Значение;
ИмяПараметра = Сред(Параметр.Ключ, 3);
ПараметрыДрайвера.Вставить(ИмяПараметра, ЗначениеПараметра);
// ПРИНУДИТЕЛЬНО устанавливаем параметр в текущий объект драйвера
ОбъектДрайвера.УстановитьПараметр(ИмяПараметра, ЗначениеПараметра);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
// Далее следует вызов штатной или продолжение выполнения процедуры...
// Например: Возврат ОбъектДрайвера.ВыполнитьКоманду(...);
КонецФункции
Как это работает:
ОбъектДрайвера, который уже загружен в память.ПараметрыПодключения именно того экземпляра оборудования, который выбран для текущей операции (второй организации).ОбъектДрайвера.УстановитьПараметр "проталкивает" правильный TID в драйвер прямо перед транзакцией.Если нет возможности вносить изменения в код конфигурации, можно попробовать разделить среды выполнения драйверов. Это актуально, если поставщик оборудования предоставляет разные варианты компонент.
Например, для терминалов Inpas (UNIPOS) иногда доступны:
Попробуем настроить следующим образом:
Так как это технически разные внешние компоненты, они не будут пересекаться в памяти 1С, и параметры одной не перетрут параметры другой.
Драйвер Inpas часто хранит настройки в файлах DualConnector.xml или использует конфигурационные файлы самого ПО терминала. Если драйвер поддерживает разделение по отделам, нужно убедиться в корректности настройки файла pinpad.ini (если он используется) или настроек внутри самого драйвера.
Настройка отделов:
В настройках экземпляра оборудования в 1С есть поле "Номер отдела" (или секции). Убедимся, что они разные:
Если это не помогает (драйвер все равно путает ID), можно попробовать физически разделить папки драйверов (для Arcus2 или Inpas SmartSale), скопировав папку с интеграционными библиотеками в два разных места (например, C:\INPAS_1 и C:\INPAS_2) и зарегистрировав их как разные компоненты в 1С. Однако это требует навыков администрирования и ручного добавления записей в справочник Драйверы оборудования.
В процессе поиска решения часто возникает идея создать "клон" драйвера в 1С, просто изменив его Идентификатор (ID) в справочнике драйверов.
Разберем, почему это не сработает. Идентификатор драйвера (например, a_inpasdc1c83n) жестко прописан внутри самой DLL компоненты (в манифесте или коде). Если вы создадите в 1С новый элемент справочника драйверов и укажете выдуманный ID, платформа просто не сможет инициализировать объект драйвера, так как не найдет соответствия внутри загруженной библиотеки.
Для стабильной работы мультимерчанта на одном физическом устройстве при использовании драйверов Inpas в 1С:Розница, наиболее эффективным методом является доработка через расширение (Решение 1). Это гарантирует, что перед каждой транзакцией драйвер получает актуальный Terminal ID, соответствующий выбранной организации.