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

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

При попытке автоматизировать закрытие кассовой смены с помощью регламентного задания разработчики часто сталкиваются с проблемой: метод ПодключитьВнешнююКомпоненту на сервере возвращает Ложь, а закрытие смены на торговом оборудовании завершается ошибкой. Разберем подробнее причины такого поведения платформы и проанализируем варианты архитектурных решений этой задачи.

Почему не удается закрыть смену ККМ напрямую из серверного контекста?

Выясним основные технические причины, по которым закрытие смены через регламентное задание на сервере 1С не работает:

  1. Локальное подключение оборудования: Кассовый аппарат (ККТ/ФР) физически подключен через COM-порт, USB или локальную сеть к конкретному рабочему месту кассира (клиентскому ПК), а не к серверу 1С. Серверная служба платформы не имеет прямого доступа к локальным портам пользователя.
  2. Монопольный захват порта: Физический порт ККМ обычно открыт и удержан сеансом запущенного клиентского приложения кассира. Даже если сервер попытается обратиться к порту, он получит ошибку недоступности устройства.
  3. Разрядность драйверов и особенности серверного контекста: Метод ПодключитьВнешнююКомпоненту на сервере работает только с компонентами, созданными по технологии Native API с явной поддержкой серверной работы без GUI. Если драйвер кассы рассчитан на 32-разрядное клиентское приложение с графическим интерфейсом, 64-разрядный сервер 1С не сможет его загрузить.

Рассмотрим практические способы обойти эти ограничения и корректно организовать закрытие смены.

Способ 1. Клиентский обработчик ожидания на ПК кассира

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

Разберем по шагам, как реализовать эту схему:

  1. При открытии клиентского приложения запускаем обработчик ожидания с помощью процедуры ПодключитьОбработчикОжидания.
  2. Периодически (например, раз в минуту) проверяем текущее время и статус кассовой смены.
  3. За несколько минут до окончания смены или наступления 00:00 выводим пользователю предупреждение. Если ответа нет или время истекло, процедура автоматически вызывает стандартные механизмы работы с ККМ и снимает Z-отчет.

Посмотрим на пример реализации инициализации обработчика ожидания на клиенте:


&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
    // Подключаем проверку каждые 60 секунд
    ПодключитьОбработчикОжидания("ПроверитьНеобходимостьЗакрытияСмены", 60);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьНеобходимостьЗакрытияСмены()
    ТекущееВремя = ТекущаяДата();
    
    // Если время подходит к 23:55 и смена открыта
    Если Час(ТекущееВремя) = 23 И Минута(ТекущееВремя) >= 55 Тогда
        // Отключаем обработчик во избежание повторного срабатывания
        ОтключитьОбработчикОжидания("ПроверитьНеобходимостьЗакрытияСмены");
        
        // Вызываем функцию закрытия смены через торговое оборудование
        ЗакрытьКассовуюСменуНаКлиенте();
    КонецЕсли;
КонецПроцедуры

Способ 2. Архитектура «Очередь команд» (Сервер → Регистр → Клиент)

Если решение о закрытии смены должно приниматься централизованно на сервере (например, регламентным заданием в определенный момент), используем паттерн асинхронной очереди команд:

  1. Серверное регламентное задание создает запись в специальном регистре сведений (например, ОчередьКомандОборудования) с указанием рабочей кассы, вида команды (ЗакрытьСмену) и статуса КВыполнению.
  2. На клиентском ПК кассира обработчик ожидания периодически считывает данные из этого регистра по своей кассе.
  3. При обнаружении новой команды клиентское приложение подключает внешнюю компоненту оборудования, выполняет снятие Z-отчета и возвращает на сервер статус выполнения.

Способ 3. Использование сетевого драйвера или сторонних сервисов (HTTP REST API)

Если требуется закрывать смену полностью автономно, даже когда клиентское приложение 1С закрыто, проанализируем вариант работы через сетевые сервисы оборудования.

Современные кассовые решения и специализированное ПО (например, KKMServer или сетевые драйверы ККТ) умеют работать в режиме HTTP-сервера. В таком случае сервер 1С обращается к ККМ не через внешнюю компоненту, а отправляет сетевые запросы с помощью объектов HTTPСоединение и HTTPЗапрос напрямую по локальной сети компании.

Рассмотрим пример отправки HTTP-запроса на сервер оборудования с сервера 1С:


&НаСервере
Процедура ЗакрытьСменуЧерезHTTP(ИмяСервера, Порт)
    Соединение = Новый HTTPСоединение(ИмяСервера, Порт);
    
    ЗаголовокЗапроса = Новый Соответствие;
    ЗаголовокЗапроса.Вставить("Content-Type", "application/json; charset=utf-8");
    
    // Формируем JSON-команду согласно документации сетевого драйвера
    ТекстЗапросаJSON = "{""Command"": ""CloseShift"", ""NumDevice"": 1}";
    
    Запрос = Новый HTTPЗапрос("/Execute", ЗаголовокЗапроса);
    Запрос.УстановитьТелоИзСтроки(ТекстЗапросаJSON, КодировкаТекста.UTF8);
    
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        // Обрабатываем успешный ответ оборудования
    КонецЕсли;
КонецПроцедуры

Важные организационные и технические нюансы

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

← На главную