Как известно, в клиент-серверном режиме 1С прогресс бар (или функция «состояние») бесполезны, если процедура выполняется на сервере.
Одним из решением данной задачи является использование фонового задания. Ниже покажу пример , как это использовать.
Идея заключается в следующем:
1. Запускаем фоновое задание
&НаСервере
Процедура ЗапуститьФоновоеЗадание()
// в данное хранилище можно в обработчике поместить результат выполнения операции
// на форме должен быть реквизит "АдресВременногоХранилища" с типом "строка"
АдресВременногоХранилища = ПоместитьВоВременноеХранилище("", ЭтаФорма.УникальныйИдентификатор);
ПараметрыФоновогоЗадания = Новый Массив;
ПараметрыФоновогоЗадания.Добавить(АдресВременногоХранилища); // параметр 1
ПараметрыФоновогоЗадания.Добавить(ТаблицаДанных.Выгрузить()); // параметр 2
// запускаем фоновое задание и храним его ID
// на форме должеь быть реквизит "ID_ФоновогоЗадания" с типом "УникальныйИдентификатор"
ID_ФоновогоЗадания = ФоновыеЗадания.Выполнить("ОбработчикиФоновыхЗаданий.ВыполнитьОперациюСПрогрессБаром",
ПараметрыФоновогоЗадания, Новый УникальныйИдентификатор, "Загрука").УникальныйИдентификатор;
КонецПроцедуры
2. Мониторим состояние выполнения процедуры, путем считывания сообщения пользователю
&НаКлиенте
Процедура ОбновлениеСостояния() Экспорт
ТекущееЗначение = Прогресс;
Если ПолучитьСостояниеФоновогоЗадания(ТекущееЗначение) Тогда
Прогресс = 100;
ОтключитьОбработчикОжидания("ОбновлениеСостояния");
// получим результат выполнения
РезультатВыполнения = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
Сообщить(РезультатВыполнения);
Иначе
// обновим значение прогресса
Прогресс = ТекущееЗначение;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьСостояниеФоновогоЗадания(ТекущееЗначение)
ФЗ = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ID_ФоновогоЗадания);
Сообщения = ФЗ.ПолучитьСообщенияПользователю(Истина);
Если Сообщения.Количество()>0 Тогда
ТекущееЗначение = Число(Сообщения[Сообщения.ВГраница()].Текст);
Иначе
ТекущееЗначение = ТекущееЗначение;
КонецЕсли;
Если ФЗ.Состояние <> СостояниеФоновогоЗадания.Активно Тогда
Если ФЗ.Состояние <> СостояниеФоновогоЗадания.Активно
И ФЗ.Состояние <> СостояниеФоновогоЗадания.Завершено Тогда
// ошибка выполнения
ИнформацияОбОшибке = ФЗ.ИнформацияОбОшибке.Описание;
КонецЕсли;
КонецЕсли;
Возврат ФЗ.Состояние <> СостояниеФоновогоЗадания.Активно;
КонецФункции
Кроме того, после выполнения процедура зачаустую приходится получать какой-то результат (текстовое сообщение, таблица значений или табличный документ). Любой резултат можно поместить во временное хранилище, а потом на клиенте получить результат.
// получим результат выполнения
РезультатВыполнения = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
Сообщить(РезультатВыполнения);
Так это же все в БСП вроде есть.
(1) Много где есть… Эта статья показывает суть данного подхода.
Только я один вспомнил, что в БСП это было реализовано в ранних версиях?
Да, так оно и работает. Если честно синтаксис для такой рядовой функции как отслеживание длительной операции, должен выглядеть проще. А такие выкрутасы говорят об убогости языка предоставляемого программистам для разработки. Зато это позволяет увеличить время разработки и цену для клиента.
Чтобы новичков не обнадёживать — это ведь возможно только для обработок, находящихся в конфигурации, верно ?
(5)
1. Это возможно для любых обработок (внешних, встроенных)
2. Сам обработчик (процедура работа с данными) должна находиться в общем модуле — то есть в конфигурации.
(6) А смысл тогда во внешней обработке, если процедура внутри должна быть.
Самый интерес обычно вызывает обработка для типовой, которую менять нельзя.
Ждём 8.3.11 — там походу сервер уже сможет доставлять сообщения клиентскому окну.
(7)
Данное решение используется для не типовых разработок
К сожалению или к счастью в 8.3.11 анонсировали прямое получение данных на клиент с сервера
https://wonderland.v8.1c.ru/blog/peredacha-informatsii-s-servera/
обработка немного запоздала
(9)не переживай, не опоздала
(10)Здесь принято отвечать по существу , а не так как Вы.
Например объяснять — чем лучше/хуже альтернативных решений
До свидания
(11)Всего доброго!
PS: не красиво говорить что уже поздно…. никогда не поздно что-то показать / рассказать.