Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

СообщениеПользователю и фоновый режим

СообщениеПользователю и фоновый режим
Я
   Nicole
 
07.05.20 - 14:39
Есть некая длительная обработка, которая запускается в фоновом режиме. В ходе обработки перезаписываются документы (наподобие ГрупповогоИзмененияРеквизитов). В процедуре ПередЗаписью() выполняется ряд проверок и выводятся сообщения ОбщегоНазначенияКлиентСервер.СообщитьПользователю("");
Так вот в режиме отладки эти сообщения после окончания длительной обработки выводятся на экран. В обычном пользовательском режиме - нет.
Пробовала воспользоваться функцией ДлительныеОперации.СообщенияПользователю() - то же самое: в режиме отладки возвращаются накопленные сообщения в фиксированном массиве, в обычном пользовательском режиме массив пустой.

Что и как сделать, чтобы все-таки получить и вывести накопленные в ходе длительной обработки сообщения?
Спасибо.
   Franchiser
 
1 - 07.05.20 - 15:25
У ФЗ есть свойство в котором можно прочитать сообщения все. Через эти сообщения в БСП и реализована передача прогресса.
   Franchiser
 
2 - 07.05.20 - 15:28
Задание.ПолучитьСообщенияПользователю()
   Nicole
 
3 - 07.05.20 - 15:32
(2) Возвращается пустое в пользовательском режиме. В режиме отладки - со всеми сообщениями.
   Garykom
 
4 - 07.05.20 - 15:35
(0)
1. Писать в журнал регистрации и не страдать не пойми чем
2. Если фоновое запущено на сервере 1С, причем оно может работать даже когда ни одного клиента нет то?
Обработка ожидания на клиенте и читай периодически сообщения (каким образом пофиг) которые фоновое куда то пишет.
   Franchiser
 
5 - 07.05.20 - 15:37
В режиме отладки у тебя обработка работает без ФЗ?
Ты уверен что именно используешь ФЗ.Получитьсообщенияпользователю(), а не просто Получитьсообщенияпользователю()?
К меня выводятся сообщения по многопоточным обработкам.
   Franchiser
 
6 - 07.05.20 - 15:38
Я опрашивпю состояние фонового задания и считываю сообщения по мере проверки в отдельный массив.
   Nicole
 
7 - 07.05.20 - 15:51
(5) ФЗ.ПолучитьСообщенияПользователю() - это тоже пустое.
   Franchiser
 
8 - 07.05.20 - 16:00
(7) в каком  момент ты проверяешь сообщения? Нужно проверять на клиенте каждый раз, когда выполняется проверка завешения ФЗ.
   Franchiser
 
9 - 07.05.20 - 16:02
Сообщ = ФЗ.ПолучитьСообщенияПользователю();
   Nicole
 
10 - 07.05.20 - 16:03
Не может быть дело в том, что в процедуре ПередЗаписью() после сообщения пользователю идет "Отказ=Истина;" и в ходе выполнения ФЗ срабатывает исключение?
   Franchiser
 
11 - 07.05.20 - 16:05
Нет, у меня даже если возникает ошибка записи видны все сообщения проведения.
   Franchiser
 
12 - 07.05.20 - 16:07
Если в ФЗ возникла необработанная исключительная ситуация то будет аварийное завершение ФЗ.
   Nicole
 
13 - 07.05.20 - 16:10
(8) На клиенте? Для метода ФоновоеЗадание.ПолучитьСообщенияПользователю() написано, что он доступен на сервере...
   Franchiser
 
14 - 07.05.20 - 16:12
(13) в обработке ожидания клиента вызывай метод на сервере
   Franchiser
 
15 - 07.05.20 - 16:17
Считывает информацию о ходе выполнения фонового задания и сообщения, которые в нем были сформированы.
//

// Параметры:
//   ИдентификаторЗадания - УникальныйИдентификатор - идентификатор фонового задания.

//   Режим                - Строка - "ПрогрессИСообщения", "Прогресс" или "Сообщения".
//

// Возвращаемое значение:
//   Структура - со свойствами:

//    * Прогресс  - Неопределено, Структура - Информация о ходе выполнения фонового задания, записанная процедурой СообщитьПрогресс:
//     ** Процент                 - Число  - Необязательный. Процент выполнения.

//     ** Текст                   - Строка - Необязательный. Информация о текущей операции.
//     ** ДополнительныеПараметры - Произвольный - Необязательный. Любая дополнительная информация.

//    * Сообщения - ФиксированныйМассив - Массив объектов СообщениеПользователю, которые были сформированы в фоновом задании.
//

Функция ПрочитатьПрогрессИСообщения(Знач ИдентификаторЗадания, Знач Режим = "ПрогрессИСообщения")
    
    Сообщения = Новый ФиксированныйМассив(Новый Массив);
    Результат = Новый Структура("Сообщения, Прогресс", Сообщения, Неопределено);
    
    Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
    Если Задание = Неопределено Тогда
        //Сообщить("НЕТ ЗАДАНИЯ");

        Возврат Результат;
    КонецЕсли;
    
    МассивСообщений = Задание.ПолучитьСообщенияПользователю(Истина);
    Если МассивСообщений = Неопределено Тогда
        //Сообщить("НЕТ СООБЩЕНИЙ");


        Возврат Результат;
    КонецЕсли;
    
    Количество = МассивСообщений.Количество();
    //Сообщить("Количество сообщений прогресса" +Количество);

    Сообщения = Новый Массив;
    ЧитатьСообщения = (Режим = "ПрогрессИСообщения" Или Режим = "Сообщения"); 
    ЧитатьПрогресс  = (Режим = "ПрогрессИСообщения" Или Режим = "Прогресс"); 
    
    Если ЧитатьСообщения И Не ЧитатьПрогресс Тогда
        Результат.Сообщения = Новый ФиксированныйМассив(МассивСообщений);
        Возврат Результат;
    КонецЕсли;
    
    Для Номер = 0 По Количество - 1 Цикл
        Сообщение = МассивСообщений[Номер];
        
        Если ЧитатьПрогресс И СтрНачинаетсяС(Сообщение.Текст, "{") Тогда
            //Сообщение.Сообщить(); //+SAV отладка...

            Позиция = СтрНайти(Сообщение.Текст, "}");
            Если Позиция > 2 Тогда
                ИдентификаторМеханизма = Сред(Сообщение.Текст, 2, Позиция - 2);
                Если ИдентификаторМеханизма = ДлительныеОперации.СообщениеПрогресса() Тогда
                    ПолученныйТекст = Сред(Сообщение.Текст, Позиция + 1);
                    Результат.Прогресс = ОбщегоНазначения.ЗначениеИзСтрокиXML(ПолученныйТекст);
                    Продолжить;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
        Если ЧитатьСообщения Тогда
            Сообщения.Добавить(Сообщение);
        КонецЕсли;
    КонецЦикла;
    
    Результат.Сообщения = Новый ФиксированныйМассив(Сообщения);
    Возврат Результат;
    
КонецФункции
   Franchiser
 
16 - 07.05.20 - 16:19
Далее:

Сообщения = ПрогрессИСообщения.Сообщения;
    
    Для Каждого Сбщ из Сообщения Цикл
        МассивСообщений.Добавить(Сбщ);
        Сбщ.сообщить();    
    КонецЦикла;
   Nicole
 
17 - 07.05.20 - 16:27
Я вызываю ДополнительныеОперации.ВыполнитьВФоне(). В конце этой функции есть обращение к ПрочитатьПрогрессИСообщения().
ПрогрессИСообщения = ПрочитатьПрогрессИСообщения(Задание.УникальныйИдентификатор, "ПрогрессИСообщения");
Результат.Сообщения = ПрогрессИСообщения.Сообщения;

И Результат.Сообщения всегда пустое.
   fisher
 
18 - 07.05.20 - 16:41
(17) Вот тут где-то собака и порылась. БСП вычитывает сообщения с удалением. И при этом выдает только "свои" сообщения прогресса (которые в фигурных скобках, посылаемые через СообщитьПрогресс).
   fisher
 
19 - 07.05.20 - 16:42
В общем, которые ты посылала не через СообщитьПрогресс() - благополучно прибились.
   Franchiser
 
20 - 07.05.20 - 16:43
Так у тебя только 1 раз выполнится.

А должен быть еще код вида для постоянного опроса и там тоже вызывается эта процедура:
ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжиданияДлительнойОперации);
ПодключитьОбработчикОжидания("ФоновоеПроверитьНаКлиенте", ПараметрыОбработчикаОжиданияДлительнойОперации.ТекущийИнтервал, Истина);
   Franchiser
 
21 - 07.05.20 - 16:46
ПодключитьОбработчикОжидания("ВыполнитьДлительнуюОперациюКлиент",0.1,Истина);
   Franchiser
 
22 - 07.05.20 - 16:49
(17) (18) по этой причине, чтобы не прибивались сообщения в процедуре и т.к. она не экспортная, процедуру нужно скопировать в твою обработку.
   fisher
 
23 - 07.05.20 - 16:49
А в режиме отладки выводится потому что БСП в ДополнительныеОперации.ВыполнитьВФоне() проверяет режим отладки. И если он включен - тупо выполняет задачу в основном потоке (чтоб тебе удобнее отлаживать). Поэтому все сообщения прилетают штатно.
   Nicole
 
24 - 07.05.20 - 17:12
(20) (21) Попробую, спасибо.


Список тем форума
Рекламное место пустует  Рекламное место пустует
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.