ДлительныеОперации.СообщитьПрогресс работает выборочно!
Дано: 1С:Предприятие 8.3 (8.3.24.1342), Бухгалтерия предприятия, редакция 3.0 (3.0.142.67)
База клиент-серверная.
Расширение, в котором есть обработка, которая, в свою очередь запускает фоновые задания - запросы к ФГИС Зерно.
Почему не использую стандартную разработку 1С - это вопрос философский и к делу не относится.
Это первое фоновое задание
Это второе:
В первом случае запуск такой
Во втором случае запуск такой
Так вот: у первого никакой прогресс не выдаётся. Сидит кот, поёт песни, выводится стандартное окно запущенного фонового задания ("Пожалуйста, подождите...")
Во втором случае на фоне того же кота показывает проценты и информацию об обрабатываемой строке.
Вопрос. Почему в первом случае прогресс не показывает?
База клиент-серверная.
Расширение, в котором есть обработка, которая, в свою очередь запускает фоновые задания - запросы к ФГИС Зерно.
Почему не использую стандартную разработку 1С - это вопрос философский и к делу не относится.
Это первое фоновое задание
Процедура ПолучитьРезультатЗапросаЗЕРНО(ПараметрыЗадания, АдресРезультата) Экспорт
РезультатРаботы = Новый Структура("Ошибка,ТекстОшибки,Результат,Операция,Запросы,Ответы",
Ложь, "", Новый Массив, Неопределено, Новый Массив, Новый Массив);
ПараметрыЗапроса = ПараметрыЗадания.ПараметрыЗапроса;
// специально для разграничения запуска в фоне или не в фоне
ЗапущенВФоне = ПараметрыЗапроса.Свойство("ЗапущенВФоне");
Версия = ПараметрыЗапроса.Версия;
Операция = ПараметрыЗадания.Операция;
РезультатРаботы.Операция = Операция;
ПараметрыЗапроса.Страницы.НомерСтраницы = 0;
Если ПараметрыЗадания.Свойство("КоличествоЗапросов") Тогда
КоличествоЗапросов = ?(ПараметрыЗадания.КоличествоЗапросов = 0, 50,
ПараметрыЗадания.КоличествоЗапросов);
Иначе
КоличествоЗапросов = 50;
КонецЕсли;
//ПараметрыЗапроса.Страницы.ДлинаСтраницы = 100;
Если ЗапущенВФоне Тогда
ДлительныеОперации.СообщитьПрогресс(0,
СтрШаблон("[%1] Начинаем...", Операция)
);
КонецЕсли;
// ....................... далее всякое-разное. .................................................
Для к = 1 По КоличествоЗапросов Цикл
ОтветНаГотовность = СГМ_ОбменЗерноСервер.ОтправитьЗапросНаСервер(
ЗапросОГотовности.КонвертSOAP, ПараметрыЗапроса);
Если Не ОтветНаГотовность.Успех Тогда
Если Не ОтветОтправкиЗапроса.Успех Тогда
sReturn = WshShell.run(
СтрШаблон("ping 127.0.0.1 -n %1", Формат(Замедлитель, "ЧГ=0")),
1,True);
Замедлитель = 6 + Окр(?(к <= 10, 0,
?(к <= 50, Окр(((к - 10) / 40) * 93 + 1, 0), 100
) ));
Если ЗапущенВФоне Тогда
ДлительныеОперации.СообщитьПрогресс(Окр(к / КоличествоЗапросов * 100,0),
СтрШаблон("[%1] Запрос №%2: интервал %3", Операция, к, Замедлитель));
КонецЕсли;
Продолжить;
КонецЕсли;
Иначе
// проверить, что ответ на исходный запрос сформирован
КонвертТип = ФабрикаXDTO.Пакеты.Получить(
Метаданные.ПакетыXDTO.Envelope.ПространствоИмен).КорневыеСвойства.Получить("Envelope").Тип;
Ответ = Новый ЧтениеXML;
Ответ.УстановитьСтроку(ОтветНаГотовность.Текст);
ПринятоЛи = ФабрикаXDTO.ПрочитатьXML(Ответ, КонвертТип).Body;
СостояниеОтвета = Неопределено;
Если ПринятоЛи.Свойства().Получить("SendResponseResponse") <> Неопределено Тогда
Если ПринятоЛи.SendResponseResponse.Свойства().Получить("ResponseCode") <> Неопределено Тогда
СостояниеОтвета = НРег(Строка(ПринятоЛи.SendResponseResponse.ResponseCode));
Если СостояниеОтвета = "success" Тогда
// принято и сделано
ФлагПолучено = Истина;
РезультатРаботы.Ответы.Добавить(ОтветНаГотовность.Текст);
Прервать;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// пауза
sReturn = WshShell.run(
СтрШаблон("ping 127.0.0.1 -n %1", Формат(Замедлитель, "ЧГ=0")),
1,True);
Замедлитель = 6 + Окр(?(к <= 10, 0,
?(к <= 50, Окр(((к - 10) / 40) * 93 + 1, 0), 100
) ));
Если ЗапущенВФоне Тогда
ДлительныеОперации.СообщитьПрогресс(Окр(к / КоличествоЗапросов * 100, 0),
СтрШаблон("[%1] Запрос №%2: интервал %3", Операция, к, Замедлитель));
КонецЕсли;
КонецЦикла;
// ................................... дальше обработка полученного и пр........................
ПоказатьЭто второе:
Процедура МассовоеГашениеСДИЗППЗ(ПараметрыЗадания, АдресРезультата) Экспорт
// ......................................... здесь разбор входных данных ......................................
Всего = СписокДляГашения.Количество();
Счетчик = 0;
Для каждого Элем Из СписокДляГашения Цикл
//ПараметрыЗапроса.ЭтоВопрос = Истина;
Если ЗапущенВФоне Тогда
ДлительныеОперации.СообщитьПрогресс(Окр(Счетчик / Всего * 100, 0),
СтрШаблон("Обрабатываем %1, количество %2",
Элем.Номер, Элем.Количество)
);
КонецЕсли;
Счетчик = Счетчик + 1;
// .................................. дальше цикл, всё работает .....................
ПоказатьВ первом случае запуск такой
ИДЗадания = "";
СтруктураФоновогоЗадания = ЗагрузитьСписокСДИЗППЗНаСервере();
ИДЗадания = СтруктураФоновогоЗадания.ИдентификаторЗадания;
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
//ПараметрыОжидания.Интервал = 3;
//ПараметрыОжидания.ВыводитьОкноОжидания = Истина;
//ПараметрыОжидания.ОповещениеОПрогрессеВыполнения
ДлительныеОперацииКлиент.ОжидатьЗавершение(
СтруктураФоновогоЗадания,
Новый ОписаниеОповещения("ОбработатьСписокППЗ", ЭтотОбъект),
ПараметрыОжидания);
ПоказатьВо втором случае запуск такой
СтруктураФоновогоЗадания = ПогаситьСДИЗППЗНаСервере(СписокДляГашения);
ИДЗадания = СтруктураФоновогоЗадания.ИдентификаторЗадания;
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
//ПараметрыОжидания.Интервал = 3;
//ПараметрыОжидания.ВыводитьОкноОжидания = Истина;
//ПараметрыОжидания.ОповещениеОПрогрессеВыполнения
ДлительныеОперацииКлиент.ОжидатьЗавершение(
СтруктураФоновогоЗадания,
Новый ОписаниеОповещения("ОбработатьГашениеСДИЗППЗ", ЭтотОбъект, СписокДляГашения),
ПараметрыОжидания);
ПоказатьТак вот: у первого никакой прогресс не выдаётся. Сидит кот, поёт песни, выводится стандартное окно запущенного фонового задания ("Пожалуйста, подождите...")
Во втором случае на фоне того же кота показывает проценты и информацию об обрабатываемой строке.
Вопрос. Почему в первом случае прогресс не показывает?
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
и
вы реально не видите и не понимаете разницу? Как по-вашему, в первом случае, система должна строить "шкалу", по каким данным?
Новый ОписаниеОповещения("ОбработатьСписокППЗ", ЭтотОбъект),
ПараметрыОжидания);
ПараметрыОжидания);
и
Новый ОписаниеОповещения("ОбработатьГашениеСДИЗППЗ", ЭтотОбъект, СписокДляГашения),
ПараметрыОжидания);
ПараметрыОжидания);
вы реально не видите и не понимаете разницу? Как по-вашему, в первом случае, система должна строить "шкалу", по каким данным?
(2)
Видите ли, если бы я не имел вариант работающего прогресса , я бы свой вопрос не задавал.
А шкалу я ему даю: и проценты и надпись, их сопровождающую.
А то, что СписокГашения, так это ДополнительныеПараметры, тип которых произвольный, которых может и не быть вовсе, а прогресс, тем не менее работать будет. Ибо, повторюсь, имею работающий вариант кода.
Обратите внимание, этой процедуре ничего внешнего не надо. Да и в коде этой процедуры ничего экстроординарного нет.
вы реально не видите и не понимаете разницу? Как по-вашему, в первом случае, система должна строить "шкалу", по каким данным?
Видите ли, если бы я не имел вариант работающего прогресса
Если КонтрольСоответствия Тогда
Объект.Товары.Очистить();
СтруктураФоновогоЗадания = ВыполнитьФоновоеЗаданиеНаСервере(УникальныйИдентификатор);
ИДЗадания = СтруктураФоновогоЗадания.ИдентификаторЗадания;
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
ПараметрыОжидания.Интервал = 2;
ДлительныеОперацииКлиент.ОжидатьЗавершение(
СтруктураФоновогоЗадания,
Новый ОписаниеОповещения("ОбработатьДанные", ЭтотОбъект),
ПараметрыОжидания);
Сообщить("Заполнено " + Объект.Товары.Количество());
Иначе
// если контроля нет, то сразу переходим к заполнению и созданию и обработке документа ИнвентаризацияВЕТИС
ЗаполнитьНаСервере();
Сообщить("Заполнено " + Объект.Товары.Количество());
КонецЕсли;
ПоказатьА шкалу я ему даю: и проценты и надпись, их сопровождающую.
А то, что СписокГашения, так это ДополнительныеПараметры, тип которых произвольный, которых может и не быть вовсе, а прогресс, тем не менее работать будет. Ибо, повторюсь, имею работающий вариант кода.
Процедура СообщитьПрогресс(Знач Процент = Неопределено, Знач Текст = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот