Как реализовать пробитие чеков из HTTP-сервиса 1С на удаленных кассах?

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

При автоматизации торговых точек, терминалов самообслуживания или электронных кассиров возникают задачи, когда внешняя система передает данные об оплате в 1С через HTTP-сервис, а программа должна моментально пробить чек на фискальном регистраторе. В конфигурациях (например, «Альфа-Авто») вызов штатных механизмов печати из серверного контекста сталкивается с архитектурными ограничениями 1С. Рассмотрим подробно, почему возникают эти сложности и как правильно реализовать взаимодействие с ККТ.

Анализ ограничений и причин возникающих ошибок

Проанализируем ситуацию, почему стандартный код печати чека из формы 1С не работает внутри HTTP-сервиса:

  1. Контекст исполнения на сервере: Обработчики HTTP-сервисов выполняются строго на стороне сервера в фоновом неинтерактивном режиме. Клиентская часть, интерфейсные формы и вызовы внешних компонент, рассчитанные на работу НаКлиенте, здесь недоступны.
  2. Разрядность и внешние компоненты: Если кластер серверов 1С работает в 64-разрядном режиме, он не может напрямую загрузить 32-разрядные COM-объекты или NativeAPI-драйверы кассового оборудования.
  3. Конфликты параллельного доступа: HTTP-запросы обрабатываются параллельно в нескольких рабочих процессах (rphost). Фискальный регистратор является устройством монопольного доступа. При одновременном поступлении двух вызовов возникает ошибка блокировки COM-порта или сетевого TCP-сокета ("Устройство занято").
  4. Распределенная сеть касс: Если в магазинах установлено несколько кассовых аппаратов, обработчик 1С на сервере должен точно знать, на какой именно IP-адрес или устройство в локальной сети конкретного магазина отправлять команду печати.

Вариант 1. Использование стороннего локального ККМ-сервера

Разберем наиболее надежный способ работы с кассами в распределенной сети. На рабочий компьютер в магазине, к которому физически подключен фискальный регистратор (например, Атол 55Ф), устанавливается специализированная служба-прокладка (например, kkmserver).

Эта служба предоставляет локальный REST API. HTTP-сервис 1С выступает в роли HTTP-клиента: он формирует JSON-пакет с данными чека и отправляет POST-запрос прямо на IP-адрес службы в конкретном магазине.

Посмотрим на пример кода 1С для отправки документа на печать через HTTPСоединение:


// Формирование структуры чека для ККМ-сервера
ДанныеЧека = Новый Структура;
ДанныеЧека.Вставить("Command", "RegisterCheck");
ДанныеЧека.Вставить("NumDevice", 1);
ДанныеЧека.Вставить("InnCustomer", "1234567890");

// Формируем список позиций чека
Позиции = Новый Массив;
СтрокаТовара = Новый Структура;
СтрокаТовара.Вставить("Name", "Оплата услуг по договору");
СтрокаТовара.Вставить("Price", 1500.00);
СтрокаТовара.Вставить("Quantity", 1);
СтрокаТовара.Вставить("Amount", 1500.00);
СтрокаТовара.Вставить("Tax", "vat20");
Позиции.Добавить(СтрокаТовара);

ДанныеЧека.Вставить("CheckStrings", Позиции);

// Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЧека);
СтрокаJSON = ЗаписьJSON.Закрыть();

// Отправка HTTP-запроса на локальный адрес кассы
ИПАдресКассы = "192.168.1.50"; // IP-адрес ПК с кассой в магазине
ПортКассы = 4444;

ЗащищенноеСоединение = Неопределено;
Соединение = Новый HTTPСоединение(ИПАдресКассы, ПортКассы, , , , 10, ЗащищенноеСоединение);
Запрос = Новый HTTPЗапрос("/Execute");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);

Попытка
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        // Чек успешно передан в очередь печати ККМ-сервера
    КонецЕсли;
Исключение
    ЗаписьЖурналаРегистрации("ОшибкаПечатиЧека", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;

Вариант 2. Прямое подключение через сетевой драйвер ККТ

Современные драйверы ККТ (например, Драйвер ККТ Атол 9.х или 10.х) поддерживают работу по сети TCP/IP и могут быть запущены в режиме веб-сервера. Служба драйвера разворачивается на машине с кассовым аппаратом и принимают входящие JSON-запросы по протоколу HTTP.

При таком подходе в 1С используются объекты HTTPСоединение, HTTPЗапрос и ЧтениеJSON. Это позволяет избежать загрузки внешних компонент и COM-объектов внутри кластера 1С, обеспечивая стабильность работы сервера.

Вариант 3. Асинхронная схема через очередь чеков (Рекомендуемый вариант)

Для исключения проблем с зависанием HTTP-сервиса при обрывах связи с кассой или отсутствии бумаги в аппарате проанализируем асинхронную модель взаимодействия:

  1. Прием запроса: HTTP-сервис 1С принимает данные от электронного кассира, создает документ оплаты или регистрирует запись в специальном регистре сведений ОчередьЧековКПечати со статусом Новый.
  2. Быстрый ответ: HTTP-сервис не ждет физической печати чека, а моментально возвращает электронному кассиру ответ со статусом 200 OK и GUID сформированного документа.
  3. Обработка на клиенте: На локальном компьютере кассира в магазине запущен тонкий или обычный клиент 1С. В нем по обработчику ожидания (ПодключитьОбработчикОжидания) каждые 3–5 секунд выполняется процедура, которая запрашивает с сервера необработанные записи своей кассы и печатает чеки в штатном интерактивном контексте с использованием стандартной Библиотеки Подключаемого Оборудования (БПО).

Сохранение фискальных реквизитов

Независимо от выбранного способа интеграции, вызов ККТ должен возвращать фискальные данные. Обязательно считывайте из ответа устройства и сохраняйте в базе 1С следующие реквизиты:

Сохранение этих данных позволяет соблюдать требования 54-ФЗ и оперативно проверять статус отправки чеков в ОФД.

← На главную