Как реализовать автоматическое пробитие чеков на стороне сервера в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В современной практике автоматизации розничной и интернет-торговли часто возникает задача фискализации чеков без участия оператора. Типовая Библиотека Подключаемого Оборудования (БПО) от 1С ориентирована на работу в клиентском контексте, что создает определенные трудности при попытке "пробить чек" из фонового задания на сервере. В этой статье мы подробно разберем, как организовать автоматическую работу с ККМ (на примере Атол 30Ф) в серверном режиме.

Анализ проблемы и выбор архитектуры

Рассмотрим стандартную ситуацию: в базу 1С поступают данные о продажах из внешней системы (сайт, мобильное приложение, маркетплейс). Нам необходимо, чтобы система самостоятельно открыла смену, пробила чек, отправила его в ОФД и клиенту, а при необходимости — закрыла смену. Основная сложность заключается в том, что драйверы торгового оборудования обычно требуют GUI или инициализируются в контексте пользователя. Проанализируем основные пути решения этой задачи.

Решение 1: Использование Web-сервера Атол (ДТО 10)

Самый современный и надежный способ для серверной фискализации — это использование встроенного Web-сервера, который поставляется вместе с драйвером Атол версии 10 (DTO 10). Разберем по шагам этот механизм:

  1. На компьютере, к которому физически подключена касса (это может быть сам сервер или отдельный ПК в локальной сети), запускается служба «Атол: Сервер ККТ».
  2. Эта служба предоставляет доступ к кассе через JSON API по протоколу HTTP.
  3. В конфигурации 1С мы пишем код НаСервере, который формирует структуру чека в формате JSON и отправляет её через объект HTTPСоединение.

Посмотрим на пример логики формирования запроса к такому серверу:


// Пример формирования структуры чека для Web-сервера Атол
ЗапросJSON = Новый Структура;
ЗапросJSON.Вставить("uuid", Строка(Новый УникальныйИдентификатор));
ЗапросJSON.Вставить("request", Новый Массив);

ДанныеЧека = Новый Структура;
ДанныеЧека.Вставить("type", "sell"); // Тип операции: Продажа
// Добавление позиций чека, налогов и оплат...
ЗапросJSON.request.Добавить(ДанныеЧека);

// Отправка через HTTP
Соединение = Новый HTTPСоединение("127.0.0.1", 16732);
ЗапросHTTP = Новый HTTPЗапрос("/requests");
ЗапросHTTP.УстановитьТелоИзСтроки(ЗаписатьJSON(ЗапросJSON));
Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);

Этот метод полностью снимает проблему «видимости» ККТ сервером 1С, так как взаимодействие идет по сетевому протоколу.

Решение 2: Прямая работа с NativeAPI драйвером на сервере

Если касса подключена непосредственно к серверу 1С по USB или COM-порту, мы можем использовать драйвер Атол 10 напрямую в серверном контексте. Выясним важные технические нюансы этого способа:

Проанализируем пример инициализации драйвера НаСервере:


&НаСервере
Процедура ФискализироватьНаСервере(ДанныеЧека)
    ПутьКДрайверу = "C:\Atol\Drivers10\KKT\bin\fptr10.dll";
    Если ПодключитьВнешнююКомпоненту(ПутьКДрайверу, "AtolDriver", ТипВнешнейКомпоненты.Native) Тогда
        Драйвер = Новый ("AddIn.AtolDriver.Fptr10");
        // Настройка параметров связи
        Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_PORT, Строка(Драйвер.LIBFPTR_PORT_COM));
        Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_COM_FILE, "COM3");
        Драйвер.applySingleSettings();
        
        Драйвер.open();
        // Далее следуют команды открытия чека, регистрации позиций и закрытия чека
    КонецЕсли;
КонецПроцедуры

Решение 3: Организация очереди чеков и фоновых заданий

Поскольку кассовый аппарат — это физическое устройство, которое работает последовательно, нельзя одновременно отправить на него два чека. Для автоматизации крайне важно реализовать механизм очереди чеков.

Рассмотрим правильную структуру этого процесса:

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

Автоматическое управление сменой

Для полной автономности «робота» необходимо программно обрабатывать состояние смены. Перед каждой операцией пробития чека рекомендуется выполнять следующую проверку:

Важный момент: Современные драйверы Атол 10 позволяют делать это без вывода каких-либо диалоговых окон, что идеально подходит для работы «НаСервере».

Ограничения БПО и альтернативы

Как отмечают специалисты, стандартная БПО часто "завязана" на клиентские процедуры. Если ваша конфигурация сильно зависит от БПО, вы можете пойти по пути запуска отдельного сеанса 1С в режиме «Тонкого клиента» на сервере под специальной учетной записью. Этот сеанс будет работать постоянно и выполнять роль «обработчика кассы». В этом случае можно использовать стандартные механизмы БПО, так как для системы это будет выглядеть как работа обычного пользователя.

Однако, для самописных конфигураций или высоконагруженных систем, прямой вызов методов драйвера (NativeAPI) или работа через Web-сервер Атол являются более предпочтительными, так как они потребляют меньше ресурсов и работают стабильнее.

Заключение

Мы выяснили, что пробитие чеков на сервере в 1С вполне реализуемо. Выбор конкретного метода зависит от вашей архитектуры: Web-сервер удобен для распределенных систем, NativeAPI — для прямой работы с кассой на сервере, а регламентные задания в режиме клиента — для быстрого внедрения с использованием существующих механизмов БПО. Главное — обеспечить надежную обработку ошибок и последовательный доступ к устройству через механизм очереди.

← На главную