Как подключить онлайн-ККТ по 54-ФЗ в устаревших и нетиповых конфигурациях 1С?

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

При необходимости перевести сильно доработанную конфигурацию на обычных формах (например, «Управление производственным предприятием» ред. 1.3 древних релизов или «Управление торговлей» ред. 10.3) на работу с онлайн-кассами по требованиям 54-ФЗ разработчики сталкиваются с серьезной проблемой. Штатная поддержка онлайн-ККТ появилась в типовых конфигурациях значительно позже (в УПП — начиная с релиза 1.3.87). Типовое обновление базы с множеством кастомных доработок часто экономически нецелесообразно или технически затруднено.

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

Технические ограничения устаревших платформ и конфигураций

Прежде чем приступать к доработке, проанализируем базовые препятствия:

  1. Несовместимость с актуальной БПО: Современная Библиотека подключаемого оборудования (версий 2.x и 3.x) жестко завязана на управляемые формы, более поздние режимы совместимости и функционал платформы 8.3. Внедрить ее в конфигурацию на обычных формах без переписывания архитектуры невозможно.
  2. Ограничения платформы 8.2: Современные драйверы ККТ обмениваются данными пакетами в формате JSON. В платформе 8.2 нет встроенных функций для сериализации и десериализации JSON (они появились в 8.3.6). Если база работает под чистой 8.2, формировать такие строки приходится вручную или через внешние COM-компоненты.
  3. Отсутствие полей ФФД: В старых структурах метаданных отсутствуют реквизиты для передачи признаков предмета расчета, признаков способа расчета, кодов маркировки и контактных данных покупателя (телефон/email) для отправки электронного чека.

Способ 1. Доработка внешней обработки обслуживания ТО

Самый распространенный и наименее инвазивный путь — адаптация внешней обработки обслуживания торгового оборудования (например, на базе драйверов Штрих-М или АТОЛ). Рассмотрим, какие изменения необходимо внести в обработку обслуживания и конфигурацию.

В старых версиях механизмы печати чека опирались на пошаговые команды: открытие чека, последовательная регистрация каждой строки с товаром и закрытие чека. В протоколах онлайн-ККТ логика изменилась: формируется единый пакет фискализации (или единый вызов печати чека со списком позиций).

Для корректной работы типовых модулей документов без их масштабного переписывания применим создание функций-заглушек в обработке обслуживания:

  1. Методы открытия и закрытия чека: В старых процедурах документов (например, «Чек ККМ» или «Приходный кассовый ордер») обязательно вызываются методы ОткрытьЧек() и ЗакрытьЧек(). Чтобы не ломать цепочку вызовов, в обработке обслуживания создаем пустые методы-заглушки, возвращающие успешный статус выполнения:
    
    Функция ОткрытьЧек(ОбъектДрайвера, Параметры) Экспорт
        // Заглушка для обратной совместимости со старыми модулями
        Возврат Истина;
    КонецФункции
    
    Функция ЗакрытьЧек(ОбъектДрайвера, Параметры) Экспорт
        // Заглушка для обратной совместимости
        Возврат Истина;
    КонецФункции
    
  2. Реализация вывода строк: Если в документе печать реализована построчно, а драйвер ККТ требует единой команды, в обработку добавляют метод НапечататьСтроки() либо перенаправляют вызов фискализации на метод ПечатьЧека() с передачей массива товарных позиций.
  3. Передача контактов покупателя: Если требуется отправка электронного чека, в модуле печати чека можно добавить запрос данных у кассира. Если телефон или email указаны, передаем их в соответствующее свойство драйвера до закрытия фискального документа.

Проблема интеграции с эквайринговыми терминалами

При совместной работе онлайн-ККТ и эквайринга в старых релизах возникает конфликт интерфейсов. Модули эквайринговых терминалов исторически вызывают ОткрытьЧек() непосредственно у фискального регистратора. Кроме того, в коде форм документов часто заложена жесткая проверка типа подключенного оборудования: система ищет подключенный фискальный регистратор (ФР), а новая ККТ регистрируется как фискальное устройство (ФУ).

Чтобы обойти эту проблему, выполним следующие шаги:

  1. В обработке обслуживания ККТ обязательно объявляем экспортный метод ОткрытьЧек(), даже если он не выполняет физических команд на аппарате. В противном случае модуль эквайринга упадет с ошибкой вызова несуществующего метода.
  2. В общих модулях торгового оборудования находим места проверки типа устройства при оплате платежной картой и расширяем условие: разрешаем выполнение операций, если подключено как устройство типа ФР, так и устройство типа ФУ.

Способ 2. Прямое обращение к COM-объекту драйвера ККТ

Если подсистема торгового оборудования в базе сильно разрушена или переписана, проще всего отказаться от типового механизма ТО и написать внешнюю печатную форму или обработку, работающую с драйвером напрямую через COM-соединение:


Драйвер = Новый COMОбъект("AddIn.Fptr10"); // Пример для АТОЛ ДТО 10
Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_MODEL, Строка(Драйвер.LIBFPTR_MODEL_ATOL_AUTO));
Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_PORT, Строка(Драйвер.LIBFPTR_PORT_TCPIP));
Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_IPADDRESS, "192.168.1.100");
Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_IPPORT, "5555");
Драйвер.applySingleSettings();

Если Драйвер.open() = 0 Тогда
    // Формируем чек через прямой API драйвера
    Драйвер.setParam(Драйвер.LIBFPTR_PARAM_RECEIPT_TYPE, Драйвер.LIBFPTR_RT_SELL);
    Драйвер.openReceipt();
    
    // Регистрация позиции
    Драйвер.setParam(Драйвер.LIBFPTR_PARAM_COMMODITY_NAME, "Товар 1");
    Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PRICE, 100.00);
    Драйвер.setParam(Драйвер.LIBFPTR_PARAM_QUANTITY, 1);
    Драйвер.setParam(Драйвер.LIBFPTR_PARAM_TAX_TYPE, Драйвер.LIBFPTR_TAX_VAT20);
    Драйвер.registrationPosition();
    
    // Закрытие чека
    Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PAYMENT_TYPE, Драйвер.LIBFPTR_PT_CASH);
    Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PAYMENT_SUM, 100.00);
    Драйвер.receiptCalculations();
    Драйвер.closeReceipt();
    
    Драйвер.close();
КонецЕсли;

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

Способ 3. Использование локального кассового сервера (Middleware)

Если база работает на платформе 8.2 без поддержки JSON, а на рабочих местах используются терминальные сессии (RDP), оптимальным архитектурным решением является кассовый сервер-посредник:

  1. На компьютере, к которому подключена касса, запускается легкий HTTP-сервер для работы с ККТ.
  2. Из 1С формируется простой HTTP-запрос (через HTTPСоединение) с данными о сумме, товарах и ставках НДС.
  3. Сервер-посредник принимает запрос, валидирует данные, взаимодействует с актуальным 32- или 64-битным драйвером кассы и возвращает в 1С статус фискализации и фискальные реквизиты чека (номер ФД, ФПД).

Важные нюансы настройки и стабильности

При запуске оборудования обратим внимание на аппаратные особенности:

  1. Разрядность клиента: Толстый клиент 1С на обычных формах запускается исключительно в 32-разрядном режиме (x86). Соответственно, все устанавливаемые драйверы ККТ и внешние компоненты должны быть строго 32-битными.
  2. RDP и COM-порты: Проброс физических или виртуальных USB-COM портов через RDP часто приводит к зависаниям драйвера при печати длинных чеков. Рекомендуется подключать ККТ к локальной сети организации через Ethernet или Wi-Fi и работать с аппаратом по стабильному TCP/IP соединению.
  3. Платформа выполнения: Для минимизации сбоев рекомендуется запускать старую конфигурацию под платформой 8.3 (в режиме совместимости с 8.2). Это обеспечит корректную работу современных внешних Native-компонент производителей ККТ.
← На главную