При интеграции интернет-магазинов с учетными системами 1С (например, 1С:Управление производственным предприятием, 1С:Управление торговлей или 1С:Комплексная автоматизация) возникает задача автоматической фискализации: заказ оплачивается на сайте, документ оплаты создается в базе, а чек должен автоматически пробиться на онлайн-кассе и уйти в ОФД и покупателю на e-mail.
Разработчики часто пытаются решить эту задачу «в лоб» через регламентное задание на сервере, но сталкиваются с тем, что кассовый драйвер не виден серверу либо фоновое задание завершается с ошибками инициализации оборудования. Разберем причины этой проблемы и рассмотрим надежные варианты построения очереди печати чеков.
Попытка вызвать стандартные методы торгового оборудования или подключить компоненту ККТ из серверного фонового задания наталкивается на три ключевых системных ограничения:
rphost). Службы Windows работают в изолированной «Нулевой сессии» (Session 0) без доступа к графическому интерфейсу пользователя (GDI). Устаревшие драйверы ККТ (например, АТОЛ ДТО 8/9) требуют оконную подсистему и аварийно падают при запуске из системной службы.rphost 1С не способен напрямую загрузить 32-разрядные внешние компоненты и DLL-библиотеки драйвера ККТ.USR1CV8) не имеет прямого доступа к локальным USB- и COM-портам конкретных клиентских рабочих мест или сессий пользователей.Самый простой и проверенный на практике подход для конфигураций на обычных формах (1С:УПП 1.3, 1С:КА 1.1, 1С:УТ 10.3) — разделение логики формирования очереди и непосредственной фискализации.
Организуем схему по шагам:
ОчередьЧековККТ со статусом К печати.РоботККТ).ПодключитьОбработчикОжидания.Посмотрим на пример кода клиентской обработки, опрашивающей очередь:
Процедура ПриОткрытии()
// Подключаем опрос очереди каждые 10 секунд
ПодключитьОбработчикОжидания("ОбработатьОчередьЧеков", 10);
КонецПроцедуры
Процедура ОбработатьОчередьЧеков() Экспорт
// Отключаем обработчик на время выполнения, чтобы исключить наложение вызовов
ОтключитьОбработчикОжидания("ОбработатьОчередьЧеков");
Попытка
ЧекКПечати = ПолучитьСледующийЧекИзОчереди();
Пока ЧекКПечати <> Неопределено Цикл
// Вызываем штатную процедуру печати чека на подключенном оборудовании
РезультатПечати = НапечататьЧекНаКлиенте(ЧекКПечати);
Если РезультатПечати.Успешно Тогда
ЗафиксироватьУспехВРегистре(ЧекКПечати);
Иначе
ЗафиксироватьОшибкуВРегистре(ЧекКПечати, РезультатПечати.ОписаниеОшибки);
ОтправитьОповещениеАдминистратору(РезультатПечати.ОписаниеОшибки);
КонецЕсли;
ЧекКПечати = ПолучитьСледующийЧекИзОчереди();
КонецЦикла;
Исключение
ЗаписьЖурналаРегистрации("ПечатьЧековРобот", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
// Включаем обработчик ожидания обратно
ПодключитьОбработчикОжидания("ОбработатьОчередьЧеков", 10);
КонецПроцедуры
Если требуется выполнять печать непосредственно в серверном коде без запуска клиентских окон 1С, перейдем на драйверы 10-й версии (АТОЛ ДТО 10):
Современные драйверы АТОЛ содержат встроенный Web-сервер фискализации. Это позволяет исключить прямую загрузку библиотек в память процесса 1С:
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-сервера ККТ
Иначе
// Обработка ошибки взаимодействия с ККТ
КонецЕсли;
Если используется старая конфигурация и драйвер ККТ доступен исключительно в 32-битной версии COM-объекта, а сервер 1С работает в 64-битной среде, применим системный механизм маршалинга:
Новый COMОбъект("..."). 64-битный процесс rphost будет обращаться к драйверу через суррогатный процесс dllhost.exe.При автоматической печати чеков интернет-магазина обязательно предусмотрим следующие механизмы: