Как реализовать выполнение фоновых задач на клиенте в 1С:Предприятие 8?

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

В процессе разработки на платформе 1С:Предприятие 8 программисты часто сталкиваются с ограничением: стандартный механизм ФоновыеЗадания работает исключительно на стороне сервера. Однако существуют сценарии, когда код необходимо выполнить именно на клиентском рабочем месте. Например, если нужно взаимодействовать с локальным торговым оборудованием, регистраторами выбытия (РВ), локальными файлами или специализированными REST-сервисами, доступными только внутри ограниченного сегмента сети пользователя. Главная сложность здесь заключается в том, чтобы не "повесить" интерфейс программы на время выполнения длительной операции.

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

Метод 1. Использование выделенного сеанса с обработчиком ожидания

Проанализируем самый распространенный "классический" метод. Суть его заключается в запуске дополнительного клиентского сеанса под специальным пользователем (например, "Робот_Клиент"), который будет заниматься только фоновыми задачами.

Разберем алгоритм реализации данного метода:

  1. Создаем в конфигурации небольшую служебную обработку, которая будет служить "диспетчером".
  2. В модуле управляемого приложения или в форме этой обработки прописываем подключение периодического задания.
  3. Используем метод ПодключитьОбработчикОжидания для инициации циклической проверки очереди заданий.

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


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

&НаКлиенте
Процедура ПроверитьНаличиеЗаданийДляУстройства() Экспорт
    // Здесь мы обращаемся к серверу за списком команд
    КомандыДляВыполнения = ПолучитьСписокКомандНаСервере();
    
    Для Каждого Команда Из КомандыДляВыполнения Цикл
        Попытка
            // Выполняем HTTP-запрос к локальному регистратору
            Результат = ОтправитьДанныеНаУстройство(Команда.Данные);
            ЗаписатьРезультатНаСервере(Команда.Идентификатор, Результат);
        Исключение
            ЗаписатьОшибкуНаСервере(Команда.Идентификатор, ОписаниеОшибки());
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры

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

Метод 2. Архитектурный перенос задачи на сервер через проксирование

Выясним причину, по которой авторы темы часто отказываются от выполнения задач на сервере. Чаще всего это отсутствие прямой сетевой видимости между сервером 1С (кластером) и клиентским устройством в защищенной сети. Рассмотрим, как это можно обойти.

Вместо того чтобы пытаться выполнить код на клиенте, можно настроить сетевой мост (VPN или обратный прокси) таким образом, чтобы сервер 1С мог "видеть" IP-адрес клиентского устройства. В этом случае задача решается стандартным серверным ФоновымЗаданием. Если это невозможно по соображениям безопасности, проанализируем вариант с промежуточной базой данных или файловым ресурсом.

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

Метод 3. Асинхронные вызовы и Promises (для платформы 8.3.15+)

В современных версиях платформы 1С реализована концепция асинхронности. Хотя она не является полноценным многопоточным выполнением кода (как в C# или Java), она позволяет выполнять неблокирующие вызовы. Разберем, как это работает при работе с внешними ресурсами.

Вместо использования синхронных методов (например, HTTPСоединение.ОтправитьДляПолучения), мы можем использовать асинхронные аналоги. Это позволяет платформе продолжать обработку интерфейсных событий, пока ожидается ответ от сети.

Пример использования асинхронного подхода:


&НаКлиенте
Асинх Процедура ВыполнитьОбменСУстройством()
    Соединение = Новый HTTPСоединение("127.0.0.1", 8080);
    Запрос = Новый HTTPЗапрос("/api/v1/data");
    
    // Платформа не замирает на этой строке
    Результат = Ждать Соединение.ВызватьHTTPМетодАсинх("POST", Запрос);
    
    Если Результат.КодСостояния = 200 Тогда
        Сообщить("Данные успешно отправлены на регистратор выбытия!");
    КонецЕсли;
КонецПроцедуры

Использование ключевых слов Асинх и Ждать (Await) кардинально меняет пользовательский опыт: окно 1С остается отзывчивым, пользователь может нажимать кнопки и открывать другие формы, пока идет фоновый обмен данными.

Метод 4. Внешние компоненты (Native API)

Для решения самых сложных задач, требующих истинной многопоточности на клиенте, рекомендуется использовать внешние компоненты. Посмотрим на этот механизм подробнее. Программист может написать компоненту на языке C++ или C#, которая будет запускать отдельный поток выполнения (Thread) в операционной системе.

Алгоритм взаимодействия выглядит так:

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

Этот метод является наиболее профессиональным, так как он не блокирует интерфейс и не требует дополнительных лицензий 1С для фонового выполнения.

Метод 5. Использование Поля HTML-документа как скрытого вычислителя

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

Проанализируем шаги реализации:

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

Резюме и рекомендации

Подводя итог нашему анализу, можно сделать следующие выводы. Если вы работаете на старых версиях платформы или в Толстом клиенте (как в случае с УТ 10.3), ваш основной выбор — это второй сеанс с обработчиком ожидания. Это надежно и просто в реализации.

Для современных конфигураций на управляемых формах (УТ 11, БП 3.0, ERP) лучшим выбором будет использование асинхронных вызовов платформы или написание внешней компоненты, если требуется работа с низкоуровневым оборудованием. Всегда помните о лицензионной политике и старайтесь минимизировать количество открытых сеансов там, где это можно решить архитектурными методами на уровне сети.

← На главную