Как выводить статус длительной обработки на форму в 1С?

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

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

Почему прямой доступ невозможен

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

Решение через фоновые задания

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

Рассмотрим пошагово, как организовать этот процесс:

  1. Запуск операции: Вместо прямого вызова серверного метода, мы запускаем ФоновоеЗадание через менеджер фоновых заданий.
  2. Хранение состояния: Поскольку процесс выполняется в отдельном потоке, нам нужно место, где он будет «оставлять следы» своего прогресса. Для этого отлично подходят РегистрСведений, ВременноеХранилище или специализированный файл-лог.
  3. Опрос состояния: На стороне клиента (в форме) мы подключаем ОбработчикОжидания. Это периодическое действие (например, раз в 2 секунды), которое будет обращаться к серверу, проверять актуальный статус процесса и обновлять элементы формы.

Пример реализации

Рассмотрим структуру кода для запуска фонового задания из модуля формы:


// В модуле формы
&НаКлиенте
Процедура ПускНажатие(Команда)
    ИдентификаторЗадания = ЗапуститьДлительнуюОперациюНаСервере();
    ПодключитьОбработчикОжидания("ПроверитьСтатусВыполнения", 2);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСтатусВыполнения()
    Статус = ПолучитьСтатусНаСервере(ИдентификаторЗадания);
    Элементы.ПолеСтатуса.Заголовок = Статус;
КонецПроцедуры

На стороне сервера мы реализуем логику, которая записывает этапы работы в доступное для обоих потоков место:


// В модуле объекта
Функция ВыполнитьДлительныйРасчет() Экспорт
    // Этап 1
    ЗаписатьСтатусВРегистр("Начало расчета...");
    // ... логика ...
    // Этап 2
    ЗаписатьСтатусВРегистр("Расчет завершен на 50%");
    // ... логика ...
КонецФункции

Почему использование фоновых заданий — это стандарт

Используя данный подход, мы получаем следующие преимущества:

Альтернативный подход: Механизм оповещений

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

Проанализировав ситуацию, мы рекомендуем отказаться от попыток «дотянуться» до формы из сервера и сосредоточиться на организации обмена данными через промежуточный объект — статусную таблицу или регистр. Это превратит вашу обработку в профессиональный инструмент, который будет радовать пользователей понятной визуализацией прогресса.

← На главную