В процессе разработки на платформе 1С:Предприятие 8 программисты часто сталкиваются с ограничением: стандартный механизм ФоновыеЗадания работает исключительно на стороне сервера. Однако существуют сценарии, когда код необходимо выполнить именно на клиентском рабочем месте. Например, если нужно взаимодействовать с локальным торговым оборудованием, регистраторами выбытия (РВ), локальными файлами или специализированными REST-сервисами, доступными только внутри ограниченного сегмента сети пользователя. Главная сложность здесь заключается в том, чтобы не "повесить" интерфейс программы на время выполнения длительной операции.
Рассмотрим несколько эффективных способов решения этой задачи, проанализируем их плюсы и минусы, а также разберем по шагам реализацию каждого метода.
Проанализируем самый распространенный "классический" метод. Суть его заключается в запуске дополнительного клиентского сеанса под специальным пользователем (например, "Робот_Клиент"), который будет заниматься только фоновыми задачами.
Разберем алгоритм реализации данного метода:
ПодключитьОбработчикОжидания для инициации циклической проверки очереди заданий.Пример кода для запуска такого процесса в форме обработки:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Запускаем опрос очереди каждые 60 секунд
ПодключитьОбработчикОжидания("ПроверитьНаличиеЗаданийДляУстройства", 60);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьНаличиеЗаданийДляУстройства() Экспорт
// Здесь мы обращаемся к серверу за списком команд
КомандыДляВыполнения = ПолучитьСписокКомандНаСервере();
Для Каждого Команда Из КомандыДляВыполнения Цикл
Попытка
// Выполняем HTTP-запрос к локальному регистратору
Результат = ОтправитьДанныеНаУстройство(Команда.Данные);
ЗаписатьРезультатНаСервере(Команда.Идентификатор, Результат);
Исключение
ЗаписатьОшибкуНаСервере(Команда.Идентификатор, ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Важный нюанс: этот метод требует наличия свободной лицензии 1С, так как каждый запущенный сеанс потребляет лицензию из общего пула (за исключением базовых версий). Однако он позволяет полностью освободить основной сеанс пользователя от ожидания ответа от внешнего устройства.
Выясним причину, по которой авторы темы часто отказываются от выполнения задач на сервере. Чаще всего это отсутствие прямой сетевой видимости между сервером 1С (кластером) и клиентским устройством в защищенной сети. Рассмотрим, как это можно обойти.
Вместо того чтобы пытаться выполнить код на клиенте, можно настроить сетевой мост (VPN или обратный прокси) таким образом, чтобы сервер 1С мог "видеть" IP-адрес клиентского устройства. В этом случае задача решается стандартным серверным ФоновымЗаданием. Если это невозможно по соображениям безопасности, проанализируем вариант с промежуточной базой данных или файловым ресурсом.
Как отмечалось в обсуждении, если клиентская машина находится в защищенном контуре, можно развернуть на ней легкую файловую базу 1С, которая будет выступать в роли "шлюза". Серверная база кладет задание в общую таблицу, а файловая база на клиенте забирает его, обрабатывает и возвращает ответ. Это позволяет избежать блокировки интерфейса в основной рабочей базе.
В современных версиях платформы 1С реализована концепция асинхронности. Хотя она не является полноценным многопоточным выполнением кода (как в C# или Java), она позволяет выполнять неблокирующие вызовы. Разберем, как это работает при работе с внешними ресурсами.
Вместо использования синхронных методов (например, HTTPСоединение.ОтправитьДляПолучения), мы можем использовать асинхронные аналоги. Это позволяет платформе продолжать обработку интерфейсных событий, пока ожидается ответ от сети.
Пример использования асинхронного подхода:
&НаКлиенте
Асинх Процедура ВыполнитьОбменСУстройством()
Соединение = Новый HTTPСоединение("127.0.0.1", 8080);
Запрос = Новый HTTPЗапрос("/api/v1/data");
// Платформа не замирает на этой строке
Результат = Ждать Соединение.ВызватьHTTPМетодАсинх("POST", Запрос);
Если Результат.КодСостояния = 200 Тогда
Сообщить("Данные успешно отправлены на регистратор выбытия!");
КонецЕсли;
КонецПроцедуры
Использование ключевых слов Асинх и Ждать (Await) кардинально меняет пользовательский опыт: окно 1С остается отзывчивым, пользователь может нажимать кнопки и открывать другие формы, пока идет фоновый обмен данными.
Для решения самых сложных задач, требующих истинной многопоточности на клиенте, рекомендуется использовать внешние компоненты. Посмотрим на этот механизм подробнее. Программист может написать компоненту на языке C++ или C#, которая будет запускать отдельный поток выполнения (Thread) в операционной системе.
Алгоритм взаимодействия выглядит так:
ОбработкаВнешнегоСобытия, где мы получаем результат.Этот метод является наиболее профессиональным, так как он не блокирует интерфейс и не требует дополнительных лицензий 1С для фонового выполнения.
Рассмотрим нестандартный, но эффективный метод. В форму 1С можно добавить невидимый элемент ПолеHTMLДокумента. Внутри этого поля работает движок браузера, который поддерживает полноценную асинхронность через JavaScript.
Проанализируем шаги реализации:
fetch запросы к вашему REST-сервису.Документ.parentWindow.YourFunction().Этот способ отлично подходит для работы с современными веб-сервисами, когда нужно "быстро и дешево" реализовать фоновый опрос без разработки внешних компонент.
Подводя итог нашему анализу, можно сделать следующие выводы. Если вы работаете на старых версиях платформы или в Толстом клиенте (как в случае с УТ 10.3), ваш основной выбор — это второй сеанс с обработчиком ожидания. Это надежно и просто в реализации.
Для современных конфигураций на управляемых формах (УТ 11, БП 3.0, ERP) лучшим выбором будет использование асинхронных вызовов платформы или написание внешней компоненты, если требуется работа с низкоуровневым оборудованием. Всегда помните о лицензионной политике и старайтесь минимизировать количество открытых сеансов там, где это можно решить архитектурными методами на уровне сети.