При попытке автоматизировать закрытие кассовой смены с помощью регламентного задания разработчики часто сталкиваются с проблемой: метод ПодключитьВнешнююКомпоненту на сервере возвращает Ложь, а закрытие смены на торговом оборудовании завершается ошибкой. Разберем подробнее причины такого поведения платформы и проанализируем варианты архитектурных решений этой задачи.
Выясним основные технические причины, по которым закрытие смены через регламентное задание на сервере 1С не работает:
ПодключитьВнешнююКомпоненту на сервере работает только с компонентами, созданными по технологии Native API с явной поддержкой серверной работы без GUI. Если драйвер кассы рассчитан на 32-разрядное клиентское приложение с графическим интерфейсом, 64-разрядный сервер 1С не сможет его загрузить.Рассмотрим практические способы обойти эти ограничения и корректно организовать закрытие смены.
Самый надежный и стандартный подход — выполнять команды работы с фискальным регистратором на стороне клиента, где кассовый аппарат подсоединен и доступен драйверу. Чтобы исключить человеческий фактор, в сеансе кассира запускается фоновый алгоритм проверки времени.
Разберем по шагам, как реализовать эту схему:
ПодключитьОбработчикОжидания.Посмотрим на пример реализации инициализации обработчика ожидания на клиенте:
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
// Подключаем проверку каждые 60 секунд
ПодключитьОбработчикОжидания("ПроверитьНеобходимостьЗакрытияСмены", 60);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьНеобходимостьЗакрытияСмены()
ТекущееВремя = ТекущаяДата();
// Если время подходит к 23:55 и смена открыта
Если Час(ТекущееВремя) = 23 И Минута(ТекущееВремя) >= 55 Тогда
// Отключаем обработчик во избежание повторного срабатывания
ОтключитьОбработчикОжидания("ПроверитьНеобходимостьЗакрытияСмены");
// Вызываем функцию закрытия смены через торговое оборудование
ЗакрытьКассовуюСменуНаКлиенте();
КонецЕсли;
КонецПроцедуры
Если решение о закрытии смены должно приниматься централизованно на сервере (например, регламентным заданием в определенный момент), используем паттерн асинхронной очереди команд:
ОчередьКомандОборудования) с указанием рабочей кассы, вида команды (ЗакрытьСмену) и статуса КВыполнению.Если требуется закрывать смену полностью автономно, даже когда клиентское приложение 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 Тогда
// Обрабатываем успешный ответ оборудования
КонецЕсли;
КонецПроцедуры
При внедрении автоматического закрытия смены обязательно учтем следующие моменты:
ОтчетОРозничныхПродажах в информационной базе.