При разработке механизмов автоматического обмена данными с торговым оборудованием разработчики часто сталкиваются с ошибкой: Метод задания не найден. Попытка вызвать метод общего модуля из регламентного задания завершается неудачей, либо платформа сообщает о невозможности вызова клиентской процедуры из серверного контекста. Разберем архитектурные особенности платформы 1С:Предприятие 8.3, выясним причины такого поведения и рассмотрим рабочие способы периодического запуска процедур библиотеки подключаемого оборудования.
Проанализируем типичную ситуацию. В конфигурации «1С:Розница» создано новое регламентное задание, метод которого указывает на процедуру общего модуля:
&НаКлиенте
Процедура УРА() Экспорт
МассиУстройств = Новый Массив;
МассиУстройств.Добавить(М1_ОбщийСервер.ПолучитьССЫлкк());
ОписаниеОповещения = Неопределено;
ПодключаемоеОборудованиеOfflineКлиент.НачатьВыгрузкуТоваровВККМOffline(ОписаниеОповещения, МассиУстройств, Ложь);
КонецПроцедуры
При попытке выполнения этого задания платформа выдает исключение об отсутствии метода. Даже если разработчик пытается обойти ограничение и создает серверную процедуру-обертку, возникает системная ошибка компиляции или времени выполнения:
&НаСервере
Процедура УРА_Сервер() Экспорт
УРА(); // Попытка вызвать &НаКлиенте из &НаСервере
КонецПроцедуры
Выясним причину такого поведения платформы. В архитектуре клиент-серверного взаимодействия 1С действуют строгие правила выполнения кода:
&НаКлиенте, из регламентного задания в принципе невозможен.ПодключаемоеОборудованиеOfflineКлиент.НачатьВыгрузкуТоваровВККМOffline, выполняются на клиенте. Драйверы торгового оборудования, внешние компоненты, COM-порты и сетевые службы конкретных рабочих мест доступны только локально из сеанса операционной системы, где запущено клиентское приложение.Таким образом, решить задачу прямой привязкой регламентного задания к процедурам модуля с постфиксом Клиент невозможно. Рассмотрим альтернативные и правильные решения задачи периодической выгрузки.
Если оборудование жестко привязано к клиентскому рабочему месту и управляется локальными драйверами, периодический запуск должен инициироваться внутри запущенного сеанса пользователя. Для этого платформа предоставляет метод глобального контекста ПодключитьОбработчикОжидания.
Синтаксис метода:
ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Разберем требования к вызываемой процедуре:
Экспорт.Посмотрим на пример реализации. Создадим глобальный клиентский общий модуль (например, М1_ОбменДаннымиКлиентГлобальный) со свойствами Клиент (управляемое приложение) и Глобальный. Добавим в него процедуру выполнения обмена:
Процедура ВыполнитьПериодическуюВыгрузкуВККМ() Экспорт
МассивУстройств = Новый Массив;
МассивУстройств.Добавить(М1_ОбщийСервер.ПолучитьСсылкуНаКассу());
ОписаниеОповещения = Неопределено;
ПодключаемоеОборудованиеOfflineКлиент.НачатьВыгрузкуТоваровВККМOffline(ОписаниеОповещения, МассивУстройств, Ложь);
КонецПроцедуры
Теперь подключим обработчик при старте программы. В модуле управляемого приложения внутри обработчика событий ПриНачалеРаботыСистемы пропишем регистрацию расписания:
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
// Подключаем опрос оборудования раз в 300 секунд (5 минут)
#Если Не ВебКлиент Тогда
ПодключитьОбработчикОжидания("ВыполнитьПериодическуюВыгрузкуВККМ", 300);
#КонецЕсли
КонецПроцедуры
Обработчик ожидания выполняется в фоновом режиме, когда интерфейс пользователя находится в состоянии покоя, не блокируя работу оператора.
В конфигурации «1С:Розница 2» разработчиками БПО уже предусмотрен штатный механизм автоматического обмена с кассами и весами Offline, не требующий доработки программного кода конфигурации.
Разберем, как его задействовать:
Чтобы не изменять конфигурацию поставщика и не испытывать сложностей при последующих обновлениях «1С:Розницы», вынесем логику обработчика ожидания в расширение.
ПриНачалеРаботыСистемы с директивой &После.Если формат взаимодействия с ККМ Offline не требует локальных драйверов (например, обмен происходит через текстовые файлы формата АТОЛ или Штрих-М, записываемые в общий сетевой каталог по UNC-пути вида \\server\share\exchange\), от клиентских процедур можно отказаться полностью.
В этом сценарии используем серверные функции генерации данных:
ПодключаемоеОборудованиеOfflineСервер).ЗаписьТекста).