Как пробить чек ККМ по 54-ФЗ из регламентного задания в 1С?

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

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

Причины сложности работы с ККМ на сервере 1С

Проанализируем ситуацию и выясним, почему штатные механизмы торговли (например, библиотека подключаемого оборудования БПО или модуль Торгового Оборудования в УТ 10.3) ориентированы на исполнение на стороне клиента:

  1. Отсутствие пользовательского интерфейса (GUI): Фоновые и регламентные задания выполняются в контексте сервера приложений 1С (процесс rphost). У сервера отсутствует контекст рабочего стола и сеанс взаимодействия с пользователем, поэтому стандартная подсистема торгового оборудования, завязанная на формы и клиентские события, не может сработать.
  2. Ограничения внешних компонент: Штатные модули 1С формируют данные для печати чека и передают XML-пакет внешней компоненте драйвера, которая традиционно подключается в контексте &НаКлиенте.
  3. Разрядность и доступ к портам: Сервер 1С часто является 64-разрядным, в то время как драйвер фискального регистратора может быть 32-разрядным. Кроме того, служба сервера 1С запущен под ограниченной системной учетной записью, не имеющей прямого доступа к COM/USB-портам локальных ПК.

Вариант 1. Прямой вызов драйвера ККТ через COM-объект на сервере

Если необходимо выполнять фискализацию непосредственно в серверном коде, можно отказаться от типовых надстроек (БПО / СерверТО) и обратиться к COM-объекту драйвера ККМ (например, АТОЛ или Штрих-М) напрямую, используя метод ПодключитьВнешнююКомпоненту или создание COM-объекта.

Рассмотрим пример кода 1С для работы с драйвером АТОЛ напрямую через COM-интерфейс:


// Подключение компоненты и создание объекта драйвера ККМ
ЗагрузитьВнешнююКомпоненту("FPRNM1C.dll");
ECR = Новый("AddIn.FprnM45");

// Включаем устройство
ECR.DeviceEnabled = 1;
Если ECR.ResultCode <> 0 Тогда
    Возврат;
КонецЕсли;

// Проверяем состояние ККМ
Если ECR.GetStatus() <> 0 Тогда
    Возврат;
КонецЕсли;

// Если есть незавершенный чек, отменяем его
Если ECR.CheckState <> 0 Тогда
    ECR.CancelCheck();
КонецЕсли;

// Входим в режим регистрации (пароль кассира)
ECR.Password = "1";
ECR.Mode = 1;
Если ECR.SetMode() <> 0 Тогда
    Возврат;
КонецЕсли;

// Регистрация позиции товара 1
ECR.Name = "Молоко";
ECR.Price = 10.45;
ECR.Quantity = 1;
ECR.Department = 2;
ECR.Registration();

// Регистрация позиции товара 2
ECR.Name = "Фанта";
ECR.Price = 25.00;
ECR.Quantity = 5;
ECR.Department = 1;
ECR.Registration();

// Закрытие чека наличными (TypeClose = 0)
ECR.TypeClose = 0;
ECR.CloseCheck();

// Отключаем устройство и освобождаем порт
ECR.DeviceEnabled = 0;

Важное примечание: При данном подходе касса должна быть физически подключена к серверу или проброшена через сетевой COM-порт (например, через RS-232 over IP), а разрядность драйвера должна соответствовать разрядности платформы сервера 1С.

Вариант 2. Организация очереди чеков и клиентского сеанса-обработчика

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

Разберем по шагам, как устроена данная схема:

  1. Регламентное задание на сервере: Формирует документы (Заказ покупателя, Реализация товаров и услуг, Чек ККМ) и записывает задание на пробитие чека в специальный регистр сведений или справочник (со статусом «К пробитию»).
  2. Клиентский сеанс 1С: На рабочем месте, где физически подключена ККМ, запускается клиент 1С (обычный или тонкий). В сеансе запускается обработчик ожидания через ПодключитьОбработчикОжидания.
  3. Обработка очереди: С заданной периодичностью (например, раз в 10–30 секунд) клиентский сеанс считывает записи из очереди, вызывает штатный механизм пробития чека в контексте &НаКлиенте и меняет статус записи на «Пробит».

Вариант 3. Использование Web-сервиса драйвера (HTTP API / REST)

Современные драйверы ККТ (например, АТОЛ ДККТ 10) и специализированные сервисы печати чеков позволяют запускать локальный HTTP-сервер. В этом случае регламентное задание 1С отправляет JSON/XML-пакет с данными чека с помощью объектов HTTPСоединение и HTTPЗапрос непосредственно в веб-сервис драйвера, исключая необходимость вызова внешних компонент в 1С.

Данный подход полностью независим от контекста исполнения 1С и отлично подходит для серверной фискализации интернет-заказов и эквайринга.

← На главную