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

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

При разработке механизмов автоматического обмена данными с торговым оборудованием разработчики часто сталкиваются с ошибкой: Метод задания не найден. Попытка вызвать метод общего модуля из регламентного задания завершается неудачей, либо платформа сообщает о невозможности вызова клиентской процедуры из серверного контекста. Разберем архитектурные особенности платформы 1С:Предприятие 8.3, выясним причины такого поведения и рассмотрим рабочие способы периодического запуска процедур библиотеки подключаемого оборудования.

Анализ проблемы: контекст регламентных заданий и вызовы на клиенте

Проанализируем типичную ситуацию. В конфигурации «1С:Розница» создано новое регламентное задание, метод которого указывает на процедуру общего модуля:


&НаКлиенте
Процедура УРА() Экспорт
    МассиУстройств = Новый Массив;
    МассиУстройств.Добавить(М1_ОбщийСервер.ПолучитьССЫлкк());
    
    ОписаниеОповещения = Неопределено;
    ПодключаемоеОборудованиеOfflineКлиент.НачатьВыгрузкуТоваровВККМOffline(ОписаниеОповещения, МассиУстройств, Ложь);
КонецПроцедуры

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


&НаСервере
Процедура УРА_Сервер() Экспорт
    УРА(); // Попытка вызвать &НаКлиенте из &НаСервере
КонецПроцедуры

Выясним причину такого поведения платформы. В архитектуре клиент-серверного взаимодействия 1С действуют строгие правила выполнения кода:

  1. Регламентные и фоновые задания всегда выполняются на сервере. Это правило одинаково строго работает как в клиент-серверном варианте информационной базы, так и в файловом. Регламентное задание выполняется в отдельном системном потоке или сеансе, где графический интерфейс и клиентский контекст полностью отсутствуют. Вызов метода, скомпилированного с директивой &НаКлиенте, из регламентного задания в принципе невозможен.
  2. Сервер не может вызывать клиентский код. Вызовы в 1С направлены строго в одну сторону: с клиента на сервер. Серверный сеанс не знает о существовании клиентских приложений, у него нет физической возможности передать управление на рабочее место пользователя.
  3. Ограничения библиотеки подключаемого оборудования (БПО). Процедуры выгрузки в кассы Offline, такие как ПодключаемоеОборудованиеOfflineКлиент.НачатьВыгрузкуТоваровВККМOffline, выполняются на клиенте. Драйверы торгового оборудования, внешние компоненты, COM-порты и сетевые службы конкретных рабочих мест доступны только локально из сеанса операционной системы, где запущено клиентское приложение.

Таким образом, решить задачу прямой привязкой регламентного задания к процедурам модуля с постфиксом Клиент невозможно. Рассмотрим альтернативные и правильные решения задачи периодической выгрузки.

Решение 1. Использование обработчика ожидания на клиенте

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

Синтаксис метода:

ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>)

Разберем требования к вызываемой процедуре:

  1. Она должна быть объявлена с ключевым словом Экспорт.
  2. Процедура не должна принимать никаких параметров.
  3. Она должна располагаться либо в модуле управляемого приложения, либо в глобальном общем модуле с признаком доступности Клиент (управляемое приложение).

Посмотрим на пример реализации. Создадим глобальный клиентский общий модуль (например, М1_ОбменДаннымиКлиентГлобальный) со свойствами Клиент (управляемое приложение) и Глобальный. Добавим в него процедуру выполнения обмена:


Процедура ВыполнитьПериодическуюВыгрузкуВККМ() Экспорт
    
    МассивУстройств = Новый Массив;
    МассивУстройств.Добавить(М1_ОбщийСервер.ПолучитьСсылкуНаКассу());
    
    ОписаниеОповещения = Неопределено;
    ПодключаемоеОборудованиеOfflineКлиент.НачатьВыгрузкуТоваровВККМOffline(ОписаниеОповещения, МассивУстройств, Ложь);
    
КонецПроцедуры

Теперь подключим обработчик при старте программы. В модуле управляемого приложения внутри обработчика событий ПриНачалеРаботыСистемы пропишем регистрацию расписания:


&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
    
    // Подключаем опрос оборудования раз в 300 секунд (5 минут)
    #Если Не ВебКлиент Тогда
        ПодключитьОбработчикОжидания("ВыполнитьПериодическуюВыгрузкуВККМ", 300);
    #КонецЕсли
    
КонецПроцедуры

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

Решение 2. Штатный механизм типовой конфигурации «Розница 2»

В конфигурации «1С:Розница 2» разработчиками БПО уже предусмотрен штатный механизм автоматического обмена с кассами и весами Offline, не требующий доработки программного кода конфигурации.

Разберем, как его задействовать:

  1. Перейдем в раздел Администрирование → Подключаемое оборудование.
  2. Откроем карточку экземпляра подключаемого оборудования Offline (ККМ Offline).
  3. Настроим параметры автообмена: укажем периодичность выгрузки данных и загрузки отчетов о продажах.
  4. Определим выделенный рабочий сеанс. Поскольку локальное оборудование требует клиентского контекста, на рабочем месте, подключенном к кассе, запускается служебный сеанс пользователя (например, под учетной записью «Робот обмена»). Конфигурация самостоятельно запускает внутренний таймер БПО и обновляет кассы по заданному расписанию.

Решение 3. Реализация через расширение конфигурации

Чтобы не изменять конфигурацию поставщика и не испытывать сложностей при последующих обновлениях «1С:Розницы», вынесем логику обработчика ожидания в расширение.

  1. Создадим новое расширение с назначением Адаптация или Дополнение.
  2. Добавим в расширение модуль управляемого приложения и перехватим обработчик ПриНачалеРаботыСистемы с директивой &После.
  3. Создадим в расширении общий модуль с установленными флажками Клиент (управляемое приложение) и Глобальный.
  4. Поместим код инициализации и выгрузки в модуль расширения. Основная база данных останется на полной типовой поддержке поставщика.

Решение 4. Прямой серверный обмен через общие сетевые папки

Если формат взаимодействия с ККМ Offline не требует локальных драйверов (например, обмен происходит через текстовые файлы формата АТОЛ или Штрих-М, записываемые в общий сетевой каталог по UNC-пути вида \\server\share\exchange\), от клиентских процедур можно отказаться полностью.

В этом сценарии используем серверные функции генерации данных:

  1. Создаем серверный общий модуль с установленным признаком Сервер.
  2. Вызываем специализированные методы формирования пакетов данных выгрузки из серверных модулей БПО (например, ПодключаемоеОборудованиеOfflineСервер).
  3. Сохраняем сформированный текстовый файл непосредственно на диск или в сетевую папку встроенными средствами 1С (объект ЗаписьТекста).
  4. Привязываем такую процедуру к стандартному регламентному заданию, которое будет работать полностью автономно в серверном пространстве без открытых пользовательских сеансов.
← На главную