Разберем типичную задачу, с которой сталкивается каждый разработчик: у нас есть тяжелая обработка, работающая на сервере, и пользователю жизненно необходимо видеть прогресс ее выполнения в реальном времени, вместо того чтобы просто смотреть на «зависшее» окно.
В архитектуре клиент-серверного взаимодействия платформы 1С код, исполняемый на сервере, не имеет прямой «связи» с элементами интерфейса, которые живут на клиенте. Попытка передать ссылку на форму в серверную функцию не принесет результата, так как объект формы не может быть передан на сервер. Для решения этой задачи нам необходимо изменить подход к архитектуре выполнения операций.
Самым правильным и современным способом организации длительных процессов является использование фоновых заданий. Это позволяет вынести тяжелые вычисления за пределы основного потока, освободив интерфейс пользователя.
Рассмотрим пошагово, как организовать этот процесс:
ФоновоеЗадание через менеджер фоновых заданий.РегистрСведений, ВременноеХранилище или специализированный файл-лог.ОбработчикОжидания. Это периодическое действие (например, раз в 2 секунды), которое будет обращаться к серверу, проверять актуальный статус процесса и обновлять элементы формы.Рассмотрим структуру кода для запуска фонового задания из модуля формы:
// В модуле формы
&НаКлиенте
Процедура ПускНажатие(Команда)
ИдентификаторЗадания = ЗапуститьДлительнуюОперациюНаСервере();
ПодключитьОбработчикОжидания("ПроверитьСтатусВыполнения", 2);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСтатусВыполнения()
Статус = ПолучитьСтатусНаСервере(ИдентификаторЗадания);
Элементы.ПолеСтатуса.Заголовок = Статус;
КонецПроцедуры
На стороне сервера мы реализуем логику, которая записывает этапы работы в доступное для обоих потоков место:
// В модуле объекта
Функция ВыполнитьДлительныйРасчет() Экспорт
// Этап 1
ЗаписатьСтатусВРегистр("Начало расчета...");
// ... логика ...
// Этап 2
ЗаписатьСтатусВРегистр("Расчет завершен на 50%");
// ... логика ...
КонецФункции
Используя данный подход, мы получаем следующие преимущества:
Если вы хотите, чтобы форма получала данные не по запросу (через обработчик ожидания), а «проактивно», можно рассмотреть использование механизма Оповестить. Однако стоит помнить, что Оповестить работает только в рамках одного сеанса. При использовании фоновых заданий основным и самым надежным инструментом остается именно периодический опрос состояния (polling).
Проанализировав ситуацию, мы рекомендуем отказаться от попыток «дотянуться» до формы из сервера и сосредоточиться на организации обмена данными через промежуточный объект — статусную таблицу или регистр. Это превратит вашу обработку в профессиональный инструмент, который будет радовать пользователей понятной визуализацией прогресса.