Как организовать автоматическую печать чеков на ККМ в 1С с помощью фоновых заданий или обработчика очереди?

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

При интеграции интернет-магазинов с учетными системами 1С (например, 1С:Управление производственным предприятием, 1С:Управление торговлей или 1С:Комплексная автоматизация) возникает задача автоматической фискализации: заказ оплачивается на сайте, документ оплаты создается в базе, а чек должен автоматически пробиться на онлайн-кассе и уйти в ОФД и покупателю на e-mail.

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

Почему регламентное задание на сервере не может напечатать чек напрямую

Попытка вызвать стандартные методы торгового оборудования или подключить компоненту ККТ из серверного фонового задания наталкивается на три ключевых системных ограничения:

  1. Изоляция сессий (Session 0 Isolation): Фоновые и регламентные задания платформы 1С выполняются в контексте службы сервера (процессы rphost). Службы Windows работают в изолированной «Нулевой сессии» (Session 0) без доступа к графическому интерфейсу пользователя (GDI). Устаревшие драйверы ККТ (например, АТОЛ ДТО 8/9) требуют оконную подсистему и аварийно падают при запуске из системной службы.
  2. Несовместимость разрядности (32-бит и 64-бит): 64-разрядный рабочий процесс rphost 1С не способен напрямую загрузить 32-разрядные внешние компоненты и DLL-библиотеки драйвера ККТ.
  3. Права системной учетной записи: Служба сервера 1С (по умолчанию запускаемая от учетной записи USR1CV8) не имеет прямого доступа к локальным USB- и COM-портам конкретных клиентских рабочих мест или сессий пользователей.

Вариант 1. Архитектура с выделенным клиентским роботом (эмуляция кассира)

Самый простой и проверенный на практике подход для конфигураций на обычных формах (1С:УПП 1.3, 1С:КА 1.1, 1С:УТ 10.3) — разделение логики формирования очереди и непосредственной фискализации.

Организуем схему по шагам:

  1. Серверное фоновое задание или веб-сервис загружает заказы из интернет-магазина, формирует документы оплаты и делает запись в специальный регистр сведений ОчередьЧековККТ со статусом К печати.
  2. На сервере или выделенном компьютере запускается отдельный сеанс 1С в режиме 32-разрядного клиента (тонкого или толстого) под специально созданным технологическим пользователем (например, РоботККТ).
  3. К данному рабочему месту штатно подключается физическая онлайн-касса с установленным 32-битным драйвером торгового оборудования.
  4. В сеансе пользователя запускается внешняя обработка или код в модуле управляемого/обычного приложения с использованием метода ПодключитьОбработчикОжидания.

Посмотрим на пример кода клиентской обработки, опрашивающей очередь:


Процедура ПриОткрытии()
    // Подключаем опрос очереди каждые 10 секунд
    ПодключитьОбработчикОжидания("ОбработатьОчередьЧеков", 10);
КонецПроцедуры

Процедура ОбработатьОчередьЧеков() Экспорт
    // Отключаем обработчик на время выполнения, чтобы исключить наложение вызовов
    ОтключитьОбработчикОжидания("ОбработатьОчередьЧеков");
    
    Попытка
        ЧекКПечати = ПолучитьСледующийЧекИзОчереди();
        Пока ЧекКПечати <> Неопределено Цикл
            // Вызываем штатную процедуру печати чека на подключенном оборудовании
            РезультатПечати = НапечататьЧекНаКлиенте(ЧекКПечати);
            
            Если РезультатПечати.Успешно Тогда
                ЗафиксироватьУспехВРегистре(ЧекКПечати);
            Иначе
                ЗафиксироватьОшибкуВРегистре(ЧекКПечати, РезультатПечати.ОписаниеОшибки);
                ОтправитьОповещениеАдминистратору(РезультатПечати.ОписаниеОшибки);
            КонецЕсли;
            
            ЧекКПечати = ПолучитьСледующийЧекИзОчереди();
        КонецЦикла;
    Исключение
        ЗаписьЖурналаРегистрации("ПечатьЧековРобот", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    КонецПопытки;
    
    // Включаем обработчик ожидания обратно
    ПодключитьОбработчикОжидания("ОбработатьОчередьЧеков", 10);
КонецПроцедуры

Вариант 2. Использование современных драйверов АТОЛ ДТО 10 (Native API x64)

Если требуется выполнять печать непосредственно в серверном коде без запуска клиентских окон 1С, перейдем на драйверы 10-й версии (АТОЛ ДТО 10):

  1. ДТО 10 поставляется с полноценной нативной 64-битной компонентой (Native API), которая поддерживает инициализацию в процессах служб Windows и Linux.
  2. Касса подключается к локальной сети по Ethernet или Wi-Fi (имеет собственный статический IP-адрес) либо через службу сетевого проброса портов.
  3. Сервер 1С взаимодействует с кассой напрямую по протоколу TCP/IP, создавая объект драйвера в серверном модуле без привязки к сессии пользователя.

Вариант 3. Использование локального веб-сервера ККТ (JSON API)

Современные драйверы АТОЛ содержат встроенный Web-сервер фискализации. Это позволяет исключить прямую загрузку библиотек в память процесса 1С:

  1. На компьютере, к которому подключена касса, запускается служба Web-сервера АТОЛ.
  2. Серверное регламентное задание 1С формирует структуру чека в формате JSON.
  3. Отправка задания на печать выполняется через стандартный объект платформы HTTPСоединение методом POST.

Разберем пример отправки чека через HTTP-запрос:


СерверККТ = "192.168.1.50";
ПортККТ = 16732;

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

HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 201 Тогда
    // Задание на фискализацию успешно принято в очередь Web-сервера ККТ
Иначе
    // Обработка ошибки взаимодействия с ККТ
КонецЕсли;

Вариант 4. Обертка 32-битного COM-драйвера в службу компонентов Windows (COM+)

Если используется старая конфигурация и драйвер ККТ доступен исключительно в 32-битной версии COM-объекта, а сервер 1С работает в 64-битной среде, применим системный механизм маршалинга:

  1. В Windows Server открываем оснастку Службы компонентов (Component Services).
  2. Создаем новое пустое COM+ приложение со свойствами активации «Серверное приложение» (Server Application).
  3. Добавляем в приложение 32-битную DLL кассового драйвера.
  4. В коде 1С инициализируем объект стандартно через Новый COMОбъект("..."). 64-битный процесс rphost будет обращаться к драйверу через суррогатный процесс dllhost.exe.

Рекомендации по надежности

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

  1. Контроль смены: Перед фискализацией первого чека суток необходимо программно проверять статус кассовой смены и при необходимости автоматически открывать или закрывать смену, если с момента открытия прошло более 24 часов.
  2. Электронная отправка: При фискализации чеков интернет-заказов в параметрах фискализации необходимо передавать телефон или e-mail покупателя и устанавливать признак безналичной оплаты (электронными средствами), чтобы физическая лента не расходовалась.
  3. Оповещение об ошибках: При окончании чековой ленты, потере связи с ККТ или ошибках ФН робот должен отправлять уведомление системному администратору (по почте или через мессенджер) и временно приостанавливать обработку очереди.
← На главную