Почему 1С путает ККТ при работе с двумя фискальными регистраторами и как это исправить?

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

В конфигурациях на обычных формах (таких как «1С:Комплексная автоматизация 1.1», «1С:Управление торговлей 10.3» или «1С:Управление производственным предприятием 1.3») нередко встречается ситуация, когда на одном рабочем месте подключены два фискальных регистратора для раздельного учета по двум организациям. При отправке чека на печать или при открытии кассовой смены система внезапно выбирает не тот аппарат: документ выписан по Организации №1, а фискальный чек выходит на кассе Организации №2. Проанализируем, почему возникает такая коллизия и как правильно настроить программный комплекс.

Выясним причину подмены кассового аппарата

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

  1. Кэширование объекта драйвера в сеансе: Когда к компьютеру подключены два фискальных регистратора одного производителя (например, «Штрих-М» или «РР-Электро»), система использует для взаимодействия с ними одну и ту же внешнюю компоненту с общим идентификатором (например, AddIn.DrvFR). При инициализации соединения библиотека загружается в оперативную память один раз. При обращении ко второму аппарату его сетевые настройки (IP-адрес, TCP-порт, пароли) перезаписывают свойства уже загруженного в память объекта. В результате все последующие команды транслируются на устройство, параметры которого были записаны последними.
  2. Удержание открытого TCP-сокета: При работе по протоколу TCP/IP драйвер держит сетевой канал открытым. Если драйвер не получил команду на закрытие сессии, последующие вызовы продолжают уходить по ранее созданному соединению. Если бы кассы были от разных производителей (например, одна «Атол», а вторая «Штрих-М»), конфликта не возникло бы, так как использовались бы разные внешние компоненты.
  3. Отсутствие жесткой связи документа с кассой ККМ: В типовых документах («Приходный кассовый ордер», «Расходный кассовый ордер») нет прямого сопоставления между организацией шапки документа и конкретным экземпляром фискального регистратора из справочника торгового оборудования. Программа берет первое попавшееся доступное устройство на текущем рабочем месте.

Способ 1. Программная доработка: повторная инициализация перед печатью

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

Посмотрим на пример логики, которую необходимо встроить в общий модуль РаботаСТорговымОборудованием либо в обработку обслуживания фискального регистратора:


// Определяем правильное устройство по организации текущего документа
КассаККМ = НайтиКассуККМПоОрганизации(ДокументОбъект.Организация);
Если ЗначениеЗаполнено(КассаККМ) Тогда
    НужнаяККТ = КассаККМ.ПодключенноеОборудование;
    
    // Принудительно отключаем текущий экземпляр драйвера
    ПолучитьСерверТО().ОтключитьКлиента(НужнаяККТ);
    
    // Выполняем повторное подключение с явной передачей настроек (IP, порт, пароль)
    ПараметрыПодключения = ПолучитьПараметрыПодключения(НужнаяККТ);
    Результат = ПолучитьСерверТО().ПодключитьКлиента(НужнаяККТ, ПараметрыПодключения);
    
    Если НЕ Результат Тогда
        ВызватьИсключение "Не удалось переинициализировать фискальный регистратор для организации!";
    КонецЕсли;
КонецЕсли;

После такой доработки перед каждой отправкой чека драйвер принудительно переключает сокет на целевой IP-адрес нужного фискального регистратора, что полностью исключает пробитие чека на чужом аппарате.

Способ 2. Корректировка параметров драйвера и разрыв соединений

Если требуется обойтись минимальными вмешательствами в конфигурацию, проверим настройки самого драйвера торгового оборудования:

  1. Откроем форму настройки параметров фискального регистратора в «1С:Предприятии» через меню Сервис — Торговое оборудование — Подключение и настройка торгового оборудования.
  2. Для каждого подключенного аппарата проверим параметр «Закрывать сессию» или «Разрывать соединение после каждой операции» (наименование зависит от версии обработки обслуживания). Включение этого флага заставляет драйвер закрывать TCP-сессию сразу после выдачи чека или отчета.
  3. Убедимся, что для аппаратов назначены статические сетевые IP-адреса и разные входящие TCP-порты во избежание сетевых коллизий.

Способ 3. Разделение сеансов пользователя

Рассмотрим альтернативный административный вариант, когда изменение типового кода конфигурации нежелательно:

  1. Настроим в операционной системе запуск двух параллельных сеансов 1С под разными пользователями или с разными рабочими местами торгового оборудования (параметр запуска /WMSpecified).
  2. В первом сеансе в настройках торгового оборудования подключим только ККТ Организации №1.
  3. Во втором сеансе подключим исключительно ККТ Организации №2.

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

← На главную