Как настроить мультимерчант (Inpas) в 1С:Розница, если транзакции уходят на неверный Terminal ID?

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

В этой статье мы подробно разберем ситуацию настройки "Мультимерчанта" (использование одного физического эквайрингового терминала для приема оплат на несколько юридических лиц) в конфигурации 1С:Розница 2.3.

Часто возникает проблема: администратор создает два экземпляра подключаемого оборудования и два эквайринговых терминала с разными Terminal ID (TID). При пробитии чека кассовая программа корректно определяет, на какую организацию должен упасть чек, и даже предлагает выбрать терминал. Однако в банк отправляется неверный номер терминала (обычно тот, который был инициализирован первым). В результате выручка смешивается или падает не на ту организацию.

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

Суть проблемы: Кэширование объекта драйвера

Проанализируем механику работы Библиотеки Подключаемого Оборудования (БПО) и драйверов (в частности, Inpas DualConnector). Когда 1С инициализирует оборудование, создается объект драйвера, который загружается в память. Если у нас создано два логических устройства, использующих одну и ту же компоненту (DLL), платформа может использовать один и тот же экземпляр объекта драйвера или не производить повторную передачу параметров подключения перед каждой операцией.

В результате, когда кассир выбирает вторую организацию, 1С обращается к драйверу, но драйвер "помнит" параметры инициализации первого устройства (первый TID) и отправляет транзакцию с ним.

Решение 1: Программное расширение (Патч)

Это наиболее надежный вариант, предложенный в обсуждении. Суть метода заключается в принудительной установке параметров драйвера (включая ID терминала) непосредственно перед выполнением эквайринговой операции.

В типовой схеме работы идентификация подключенного экземпляра происходит по идентификатору устройства, но повторная передача параметров (таких как TID) в драйвер может не выполняться, если драйвер считается уже подключенным. Нам необходимо вмешаться в процесс перед вызовом функции оплаты.

Рассмотрим код, который можно поместить в расширение конфигурации. Нам необходимо перехватить процедуру работы с эквайринговым терминалом и добавить туда блок обновления параметров.

Пример функции, которую мы будем модифицировать (или оборачивать):


Асинх Функция ЭквайринговаяОперация(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации, Команда)
    
    // Проверяем, что работаем именно с эквайринговым терминалом
    Если ПараметрыПодключения.ТипОборудования = ПредопределенноеЗначение(Перечисления.ТипыПодключаемогоОборудования.ЭквайринговыйТерминал) Тогда
        
        ПараметрыДрайвера = Новый Структура;
        
        // Перебираем параметры подключения, настроенные в 1С
        Если ПараметрыПодключения.Параметры <> Неопределено Тогда
            Для Каждого Параметр Из ПараметрыПодключения.Параметры Цикл
                
                // В БПО параметры устройства часто начинаются с префикса "P_"
                // Нам нужно отсечь префикс и передать чистое имя параметра и значение в драйвер
                Если Лев(Параметр.Ключ, 2) = "P_" Тогда
                    ЗначениеПараметра = Параметр.Значение;
                    ИмяПараметра      = Сред(Параметр.Ключ, 3);
                    
                    ПараметрыДрайвера.Вставить(ИмяПараметра, ЗначениеПараметра);
                    
                    // ПРИНУДИТЕЛЬНО устанавливаем параметр в текущий объект драйвера
                    ОбъектДрайвера.УстановитьПараметр(ИмяПараметра, ЗначениеПараметра);
                КонецЕсли;
                
            КонецЦикла;
        КонецЕсли;
        
    КонецЕсли;

    // Далее следует вызов штатной или продолжение выполнения процедуры...
    // Например: Возврат ОбъектДрайвера.ВыполнитьКоманду(...);

КонецФункции

Как это работает:

  1. Мы получаем ссылку на ОбъектДрайвера, который уже загружен в память.
  2. Мы берем ПараметрыПодключения именно того экземпляра оборудования, который выбран для текущей операции (второй организации).
  3. Метод ОбъектДрайвера.УстановитьПараметр "проталкивает" правильный TID в драйвер прямо перед транзакцией.

Решение 2: Использование разных версий драйверов

Если нет возможности вносить изменения в код конфигурации, можно попробовать разделить среды выполнения драйверов. Это актуально, если поставщик оборудования предоставляет разные варианты компонент.

Например, для терминалов Inpas (UNIPOS) иногда доступны:

Попробуем настроить следующим образом:

  1. Для Организации 1 создаем оборудование, используя драйвер "ИНПАС:Эквайринговые терминалы UNIPOS (ФЗ-491)" (Native).
  2. Для Организации 2 создаем оборудование, используя драйвер "ИНПАС: Эквайринговые терминалы UNIPOS" (x86 / COM).

Так как это технически разные внешние компоненты, они не будут пересекаться в памяти 1С, и параметры одной не перетрут параметры другой.

Решение 3: Разделение на уровне файловой системы (для Inpas DualConnector)

Драйвер 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, соответствующий выбранной организации.

← На главную