ДлительныеОперации.СообщитьПрогресс работает выборочно!

1. Mastershi 31.05.24 16:31 Сейчас в теме
Дано: 1С:Предприятие 8.3 (8.3.24.1342), Бухгалтерия предприятия, редакция 3.0 (3.0.142.67)
База клиент-серверная.
Расширение, в котором есть обработка, которая, в свою очередь запускает фоновые задания - запросы к ФГИС Зерно.
Почему не использую стандартную разработку 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;
        //ПараметрыОжидания.ВыводитьОкноОжидания = Истина;
        //ПараметрыОжидания.ОповещениеОПрогрессеВыполнения
    
    ДлительныеОперацииКлиент.ОжидатьЗавершение(
        СтруктураФоновогоЗадания, 
        Новый ОписаниеОповещения("ОбработатьГашениеСДИЗППЗ", ЭтотОбъект, СписокДляГашения), 
        ПараметрыОжидания);
        

Показать


Так вот: у первого никакой прогресс не выдаётся. Сидит кот, поёт песни, выводится стандартное окно запущенного фонового задания ("Пожалуйста, подождите...")
Во втором случае на фоне того же кота показывает проценты и информацию об обрабатываемой строке.

Вопрос. Почему в первом случае прогресс не показывает?
Найденные решения
5. Mastershi 05.06.24 12:32 Сейчас в теме
Вопрос снят. Нашёл опечатку, которую трудно заметить.
В строке первого фрагмента
// специально для разграничения запуска в фоне или не в фоне
    ЗапущенВФоне = ПараметрыЗапроса.Свойство("ЗапущенВФоне"); 
вместо ПараметрыЗапроса, должно стоять ПараметрыЗадания. .
Прошу прощения за отнятое время.
user2033849; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 81 31.05.24 18:18 Сейчас в теме
(1)
Новый ОписаниеОповещения("ОбработатьСписокППЗ", ЭтотОбъект),
ПараметрыОжидания);


и

Новый ОписаниеОповещения("ОбработатьГашениеСДИЗППЗ", ЭтотОбъект, СписокДляГашения),
ПараметрыОжидания);


вы реально не видите и не понимаете разницу? Как по-вашему, в первом случае, система должна строить "шкалу", по каким данным?
3. Mastershi 03.06.24 11:50 Сейчас в теме
(2)
вы реально не видите и не понимаете разницу? Как по-вашему, в первом случае, система должна строить "шкалу", по каким данным?

Видите ли, если бы я не имел вариант работающего прогресса
    Если КонтрольСоответствия Тогда
        Объект.Товары.Очистить();
    
        СтруктураФоновогоЗадания = ВыполнитьФоновоеЗаданиеНаСервере(УникальныйИдентификатор);
        ИДЗадания     = СтруктураФоновогоЗадания.ИдентификаторЗадания;
    
        ПараметрыОжидания  = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
        ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
        ПараметрыОжидания.Интервал  = 2;
    
        ДлительныеОперацииКлиент.ОжидатьЗавершение(
            СтруктураФоновогоЗадания, 
            Новый ОписаниеОповещения("ОбработатьДанные", ЭтотОбъект), 
            ПараметрыОжидания);
        Сообщить("Заполнено " + Объект.Товары.Количество());
    
    Иначе
        // если контроля нет, то сразу переходим к заполнению и созданию и обработке документа ИнвентаризацияВЕТИС
        ЗаполнитьНаСервере();
        Сообщить("Заполнено " + Объект.Товары.Количество());
    КонецЕсли;

Показать
, я бы свой вопрос не задавал.
А шкалу я ему даю: и проценты и надпись, их сопровождающую.
А то, что СписокГашения, так это ДополнительныеПараметры, тип которых произвольный, которых может и не быть вовсе, а прогресс, тем не менее работать будет. Ибо, повторюсь, имею работающий вариант кода.
Процедура СообщитьПрогресс(Знач Процент = Неопределено, Знач Текст = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт
Обратите внимание, этой процедуре ничего внешнего не надо. Да и в коде этой процедуры ничего экстроординарного нет.
4. Mastershi 04.06.24 09:12 Сейчас в теме
... экстраординарного...
5. Mastershi 05.06.24 12:32 Сейчас в теме
Вопрос снят. Нашёл опечатку, которую трудно заметить.
В строке первого фрагмента
// специально для разграничения запуска в фоне или не в фоне
    ЗапущенВФоне = ПараметрыЗапроса.Свойство("ЗапущенВФоне"); 
вместо ПараметрыЗапроса, должно стоять ПараметрыЗадания. .
Прошу прощения за отнятое время.
user2033849; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот