Как известно, в клиент-серверном режиме 1С прогресс бар (или функция "состояние") бесполезны, если процедура выполняется на сервере.
Одним из решением данной задачи является использование фонового задания. Ниже покажу пример , как это использовать.
Идея заключается в следующем:
1. Запускаем фоновое задание
&НаСервере
Процедура ЗапуститьФоновоеЗадание()
// в данное хранилище можно в обработчике поместить результат выполнения операции
// на форме должен быть реквизит "АдресВременногоХранилища" с типом "строка"
АдресВременногоХранилища = ПоместитьВоВременноеХранилище("", ЭтаФорма.УникальныйИдентификатор);
ПараметрыФоновогоЗадания = Новый Массив;
ПараметрыФоновогоЗадания.Добавить(АдресВременногоХранилища); // параметр 1
ПараметрыФоновогоЗадания.Добавить(ТаблицаДанных.Выгрузить()); // параметр 2
// запускаем фоновое задание и храним его ID
// на форме должеь быть реквизит "ID_ФоновогоЗадания" с типом "УникальныйИдентификатор"
ID_ФоновогоЗадания = ФоновыеЗадания.Выполнить("ОбработчикиФоновыхЗаданий.ВыполнитьОперациюСПрогрессБаром",
ПараметрыФоновогоЗадания, Новый УникальныйИдентификатор, "Загрука").УникальныйИдентификатор;
КонецПроцедуры
2. Мониторим состояние выполнения процедуры, путем считывания сообщения пользователю
&НаКлиенте
Процедура ОбновлениеСостояния() Экспорт
ТекущееЗначение = Прогресс;
Если ПолучитьСостояниеФоновогоЗадания(ТекущееЗначение) Тогда
Прогресс = 100;
ОтключитьОбработчикОжидания("ОбновлениеСостояния");
// получим результат выполнения
РезультатВыполнения = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
Сообщить(РезультатВыполнения);
Иначе
// обновим значение прогресса
Прогресс = ТекущееЗначение;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьСостояниеФоновогоЗадания(ТекущееЗначение)
ФЗ = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ID_ФоновогоЗадания);
Сообщения = ФЗ.ПолучитьСообщенияПользователю(Истина);
Если Сообщения.Количество()>0 Тогда
ТекущееЗначение = Число(Сообщения[Сообщения.ВГраница()].Текст);
Иначе
ТекущееЗначение = ТекущееЗначение;
КонецЕсли;
Если ФЗ.Состояние <> СостояниеФоновогоЗадания.Активно Тогда
Если ФЗ.Состояние <> СостояниеФоновогоЗадания.Активно
И ФЗ.Состояние <> СостояниеФоновогоЗадания.Завершено Тогда
// ошибка выполнения
ИнформацияОбОшибке = ФЗ.ИнформацияОбОшибке.Описание;
КонецЕсли;
КонецЕсли;
Возврат ФЗ.Состояние <> СостояниеФоновогоЗадания.Активно;
КонецФункции
Кроме того, после выполнения процедура зачаустую приходится получать какой-то результат (текстовое сообщение, таблица значений или табличный документ). Любой резултат можно поместить во временное хранилище, а потом на клиенте получить результат.
// получим результат выполнения
РезультатВыполнения = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
Сообщить(РезультатВыполнения);