Прогресс бар и серверная процедура (тонкий клиент)

В данной публикации показан пример использования прогресс бара для серверной процедуры с использованием фонового задания (Тонкий клиент).

Как известно, в клиент-серверном режиме 1С прогресс бар (или функция «состояние») бесполезны, если процедура выполняется на сервере.

Одним из решением данной задачи является использование фонового задания. Ниже покажу пример , как это использовать.

Идея заключается в следующем:

1. Запускаем фоновое задание

&НаСервере
Процедура ЗапуститьФоновоеЗадание()

// в данное хранилище можно в обработчике поместить результат выполнения операции
// на форме должен быть реквизит "АдресВременногоХранилища" с типом "строка"
АдресВременногоХранилища = ПоместитьВоВременноеХранилище("", ЭтаФорма.УникальныйИдентификатор);

ПараметрыФоновогоЗадания = Новый Массив;
ПараметрыФоновогоЗадания.Добавить(АдресВременногоХранилища);    // параметр 1
ПараметрыФоновогоЗадания.Добавить(ТаблицаДанных.Выгрузить()); // параметр 2

// запускаем фоновое задание и храним его ID
// на форме должеь быть реквизит "ID_ФоновогоЗадания" с типом "УникальныйИдентификатор"
ID_ФоновогоЗадания = ФоновыеЗадания.Выполнить("ОбработчикиФоновыхЗаданий.ВыполнитьОперациюСПрогрессБаром",
ПараметрыФоновогоЗадания, Новый УникальныйИдентификатор, "Загрука").УникальныйИдентификатор;

КонецПроцедуры

2. Мониторим состояние выполнения процедуры, путем считывания сообщения пользователю

&НаКлиенте
Процедура ОбновлениеСостояния() Экспорт

ТекущееЗначение = Прогресс;
Если ПолучитьСостояниеФоновогоЗадания(ТекущееЗначение) Тогда
Прогресс = 100;
ОтключитьОбработчикОжидания("ОбновлениеСостояния");
// получим результат выполнения
РезультатВыполнения = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
Сообщить(РезультатВыполнения);
Иначе
// обновим значение прогресса
Прогресс = ТекущееЗначение;
КонецЕсли;

КонецПроцедуры

&НаСервере
Функция ПолучитьСостояниеФоновогоЗадания(ТекущееЗначение)
ФЗ = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ID_ФоновогоЗадания);
Сообщения = ФЗ.ПолучитьСообщенияПользователю(Истина);
Если Сообщения.Количество()>0 Тогда
ТекущееЗначение = Число(Сообщения[Сообщения.ВГраница()].Текст);
Иначе
ТекущееЗначение = ТекущееЗначение;
КонецЕсли;
Если ФЗ.Состояние <> СостояниеФоновогоЗадания.Активно Тогда
Если ФЗ.Состояние <> СостояниеФоновогоЗадания.Активно
И ФЗ.Состояние <> СостояниеФоновогоЗадания.Завершено Тогда
// ошибка выполнения
ИнформацияОбОшибке = ФЗ.ИнформацияОбОшибке.Описание;
КонецЕсли;
КонецЕсли;
Возврат ФЗ.Состояние <> СостояниеФоновогоЗадания.Активно;
КонецФункции

Кроме того, после выполнения процедура зачаустую приходится получать какой-то результат (текстовое сообщение, таблица значений или табличный документ). Любой резултат можно поместить во временное хранилище, а потом на клиенте получить результат.

 // получим результат выполнения
РезультатВыполнения = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
Сообщить(РезультатВыполнения);

12 Comments

  1. MSConfig

    Так это же все в БСП вроде есть.

    Reply
  2. Isonic

    (1) Много где есть… Эта статья показывает суть данного подхода.

    Reply
  3. Поручик

    Только я один вспомнил, что в БСП это было реализовано в ранних версиях?

    Reply
  4. surikateg

    Да, так оно и работает. Если честно синтаксис для такой рядовой функции как отслеживание длительной операции, должен выглядеть проще. А такие выкрутасы говорят об убогости языка предоставляемого программистам для разработки. Зато это позволяет увеличить время разработки и цену для клиента.

    Reply
  5. 7OH

    Чтобы новичков не обнадёживать — это ведь возможно только для обработок, находящихся в конфигурации, верно ?

    Reply
  6. Isonic

    (5)

    1. Это возможно для любых обработок (внешних, встроенных)

    2. Сам обработчик (процедура работа с данными) должна находиться в общем модуле — то есть в конфигурации.

    Reply
  7. 7OH

    (6) А смысл тогда во внешней обработке, если процедура внутри должна быть.

    Самый интерес обычно вызывает обработка для типовой, которую менять нельзя.

    Ждём 8.3.11 — там походу сервер уже сможет доставлять сообщения клиентскому окну.

    Reply
  8. Isonic

    (7)

    Данное решение используется для не типовых разработок

    Reply
  9. kiruha

    К сожалению или к счастью в 8.3.11 анонсировали прямое получение данных на клиент с сервера

    https://wonderland.v8.1c.ru/blog/peredacha-informatsii-s-servera/

    обработка немного запоздала

    Reply
  10. Isonic

    (9)не переживай, не опоздала

    Reply
  11. kiruha

    (10)Здесь принято отвечать по существу , а не так как Вы.

    Например объяснять — чем лучше/хуже альтернативных решений

    До свидания

    Reply
  12. Isonic

    (11)Всего доброго!

    PS: не красиво говорить что уже поздно…. никогда не поздно что-то показать / рассказать.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *