При автоматизации торговых точек, терминалов самообслуживания или электронных кассиров возникают задачи, когда внешняя система передает данные об оплате в 1С через HTTP-сервис, а программа должна моментально пробить чек на фискальном регистраторе. В конфигурациях (например, «Альфа-Авто») вызов штатных механизмов печати из серверного контекста сталкивается с архитектурными ограничениями 1С. Рассмотрим подробно, почему возникают эти сложности и как правильно реализовать взаимодействие с ККТ.
Проанализируем ситуацию, почему стандартный код печати чека из формы 1С не работает внутри HTTP-сервиса:
HTTP-сервисов выполняются строго на стороне сервера в фоновом неинтерактивном режиме. Клиентская часть, интерфейсные формы и вызовы внешних компонент, рассчитанные на работу НаКлиенте, здесь недоступны.COM-объекты или NativeAPI-драйверы кассового оборудования.rphost). Фискальный регистратор является устройством монопольного доступа. При одновременном поступлении двух вызовов возникает ошибка блокировки COM-порта или сетевого TCP-сокета ("Устройство занято").Разберем наиболее надежный способ работы с кассами в распределенной сети. На рабочий компьютер в магазине, к которому физически подключен фискальный регистратор (например, Атол 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 Тогда
// Чек успешно передан в очередь печати ККМ-сервера
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("ОшибкаПечатиЧека", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
Современные драйверы ККТ (например, Драйвер ККТ Атол 9.х или 10.х) поддерживают работу по сети TCP/IP и могут быть запущены в режиме веб-сервера. Служба драйвера разворачивается на машине с кассовым аппаратом и принимают входящие JSON-запросы по протоколу HTTP.
При таком подходе в 1С используются объекты HTTPСоединение, HTTPЗапрос и ЧтениеJSON. Это позволяет избежать загрузки внешних компонент и COM-объектов внутри кластера 1С, обеспечивая стабильность работы сервера.
Для исключения проблем с зависанием HTTP-сервиса при обрывах связи с кассой или отсутствии бумаги в аппарате проанализируем асинхронную модель взаимодействия:
ОчередьЧековКПечати со статусом Новый.200 OK и GUID сформированного документа.ПодключитьОбработчикОжидания) каждые 3–5 секунд выполняется процедура, которая запрашивает с сервера необработанные записи своей кассы и печатает чеки в штатном интерактивном контексте с использованием стандартной Библиотеки Подключаемого Оборудования (БПО).Независимо от выбранного способа интеграции, вызов ККТ должен возвращать фискальные данные. Обязательно считывайте из ответа устройства и сохраняйте в базе 1С следующие реквизиты:
Сохранение этих данных позволяет соблюдать требования 54-ФЗ и оперативно проверять статус отправки чеков в ОФД.