При автоматизации торговых процессов в 1С часто возникает задача автоматического формирования документов (заказ покупателя, реализация товаров) и последующей фискализации чеков ККМ. Однако при попытке пробить чек непосредственно в регламентном или фоновом задании разработчики сталкиваются с техническими ограничениями платформы 1С. Разберем, почему возникает эта проблема и какими способами её можно решить.
Проанализируем ситуацию и выясним, почему штатные механизмы торговли (например, библиотека подключаемого оборудования БПО или модуль Торгового Оборудования в УТ 10.3) ориентированы на исполнение на стороне клиента:
rphost). У сервера отсутствует контекст рабочего стола и сеанс взаимодействия с пользователем, поэтому стандартная подсистема торгового оборудования, завязанная на формы и клиентские события, не может сработать.&НаКлиенте.Если необходимо выполнять фискализацию непосредственно в серверном коде, можно отказаться от типовых надстроек (БПО / СерверТО) и обратиться к 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С.
Наиболее безопасным и популярным архитектурным решением в типовых конфигурациях является разделение ответственности между сервером и клиентом по схеме «Очередь чеков».
Разберем по шагам, как устроена данная схема:
ПодключитьОбработчикОжидания.&НаКлиенте и меняет статус записи на «Пробит».Современные драйверы ККТ (например, АТОЛ ДККТ 10) и специализированные сервисы печати чеков позволяют запускать локальный HTTP-сервер. В этом случае регламентное задание 1С отправляет JSON/XML-пакет с данными чека с помощью объектов HTTPСоединение и HTTPЗапрос непосредственно в веб-сервис драйвера, исключая необходимость вызова внешних компонент в 1С.
Данный подход полностью независим от контекста исполнения 1С и отлично подходит для серверной фискализации интернет-заказов и эквайринга.