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

Доп. обработка Вызов серверного метода. Как сообщить пользователю об ошибке?

Доп. обработка Вызов серверного метода. Как сообщить пользователю об ошибке?
Я
   BaZZiL
 
16.09.21 - 12:57
Привет честнОй компании!

Требуется обмен информацией через OData с несколькими базами по нажатию кнопки из журнала документов.
Конфигурация БП 3.0
Реализовал дополнительную обработку "Вызов серверного метода", но неясно как извещать пользователя о возникающих ошибках.

Оборачивать в попытки и вызывать исключения? Или есть какой-нибудь внятный БСПшный механизм?
   hhhh
 
1 - 16.09.21 - 13:00
(0) Сообщить()
   Kassern
 
2 - 16.09.21 - 13:01
(1) я так понимаю ему надо в другой базе сообщить, мол обмен не прошел, но вы держитесь)
   Kassern
 
3 - 16.09.21 - 13:02
(2) в этом случае как вариант:  письмом на корпоративную почту. Можно сервер взаимодействия попробовать прикрутить. Можно файл лога вести. Можно регистр для этого дела завести. В общем тут на ваш цвет и вкус, хоть ВК пишите и слушайте что вам другая база скажет)
   BaZZiL
 
4 - 16.09.21 - 13:08
(2) Не, просто сообщить текущему пользователю.

"Вызов серверного метода" запускается как фоновое задание, и Сообщить() оттуда не сообщает( 

файл лога спасает меня при отладке, но для пользователя это неприемлимо.

Пользователю надо показать окошко с кнопкой или типа того. Что-нибудь самое понятное и незамысловатое.
   ДенисЧ
 
5 - 16.09.21 - 13:13
Пиши в лог, а у клиента крути обработку ожидания, которая читает его.
Или систему взаимодействия покупай.
   Kassern
 
6 - 16.09.21 - 13:13
(4) все что я перечислил и для текущего пользователя сканает.
   Kassern
 
7 - 16.09.21 - 13:13
(4) самое простое это письмо слать
   youalex
 
8 - 16.09.21 - 13:14
ФоновоеЗадание (BackgroundJob)
ПолучитьСообщенияПользователю (GetUserMessages)

Вроде в БСП было что-то такое
   ДенисЧ
 
9 - 16.09.21 - 13:20
Самое простое - открывать форму, а из неё уже стартовать задание и в форме же ловить сообщения.
   BaZZiL
 
10 - 16.09.21 - 14:24
А чтобы и форму не рисовать?
(8)  Покурим...
   Kassern
 
11 - 16.09.21 - 14:42
(10) что то мне подсказывает, что ПолучитьСообщенияПользователю  не взлетит, но могу ошибаться.
   BaZZiL
 
12 - 16.09.21 - 17:20
Что там ни пиши, оно будет выполняться в контексте фонового задания, можно накопить сообщения, но показать их должна БСП, которая запускает фоновое задание.

Попробую вызывать Исключения. Письма слать - не вариант)
   hhhh
 
13 - 16.09.21 - 17:52
(10) форма есть уже "по нажатию кнопки из журнала документов" в (0)
   Garykom
 
14 - 16.09.21 - 18:07
(0) Для начала какому пользователю собираешься сообщать?
   Garykom
 
15 - 16.09.21 - 18:08
(14)+ И что делать если он сволочь такая в базу 1С не заходит?
   Вафель
 
16 - 16.09.21 - 18:10
(11) ошибаешься
   BaZZiL
 
17 - 17.09.21 - 09:46
(14) Сообщение пользователю, который запускает обработку из базы -источника.

База -источник будет стучаться в сторонний сервис, в базу- приемник, собирать ГУИДы, формировать структуру данных и, наконец, постить документ в базу-приемник.

ПолучитьСообщенияПользователю() как я понимаю нужно вызывать как бы "со стороны" по отношению к фоновому заданию. А при "Вызове серверного метода" я буду кхм.. "внутри" фонового задания. Или чо?)
   Kassern
 
18 - 17.09.21 - 09:57
(16) типо так?
ФоновоеЗадание (BackgroundJob)
ПолучитьСообщенияПользователю (GetUserMessages)
Синтаксис:
ПолучитьСообщенияПользователю(<УдалятьПолученные>)
Параметры:
<УдалятьПолученные> (необязательный)
Тип: Булево.
Признак необходимости удаления полученных сообщений.
Истина - удалять.
Значение по умолчанию: Ложь.
Возвращаемое значение:
Тип: ФиксированныйМассив.
Описание:
Получает массив объектов СообщениеПользователю, которые были выведены в процессе работы фонового задания. Получение сообщений может выполняться как в процессе работы задания, так и по его завершении.
   BaZZiL
 
19 - 20.09.21 - 11:35
Добавил в свой серверный метод вызов БСП 

ОбщегоНазначения.СообщитьПользователю("Мяу!");

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

&Вместо("ВыполнитьСерверныйМетодОбработкиЗавершение")

&НаКлиенте
Процедура Интеркампани_ВыполнитьСерверныйМетодОбработкиЗавершение(Задание, ДополнительныеПараметры) Экспорт
    
    Если Задание = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Если Задание.Статус <> "Выполнено" Тогда
        Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
            НСтр("ru = 'Команда ""%1"" не выполнена:'"),
            ВыполняемаяКоманда.Представление);
        Если Открыта() Тогда
            Закрыть();
        КонецЕсли;
        ВызватьИсключение Текст + Символы.ПС + Задание.КраткоеПредставлениеОшибки;
    КонецЕсли;
//============================добавил в расширении    

    СообщенияОбработки = СообщенияОбработкиНаСервере();
    Для Каждого Сообщ Из СообщенияОбработки Цикл
        Сообщить(Сообщ);
    КонецЦикла;    
//============================    

    
    
    // Показ всплывающего оповещения и закрытие этой формы.

    Если ВыполняемаяКоманда.ПоказыватьОповещение Тогда
        ПоказатьОповещениеПользователя(НСтр("ru = 'Команда выполнена'"),, ВыполняемаяКоманда.Представление);
    КонецЕсли;
    Если Открыта() Тогда
        Закрыть();
    КонецЕсли;
    
    // Обновление формы владельца.

    Если ЭтоФормаОбъекта Тогда
        Попытка
            ВладелецФормы.Прочитать();
        Исключение
            // Действие не требуется.

        КонецПопытки;
    КонецЕсли;
    
    // Оповещение других форм.

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


Ничего не выводится.
   youalex
 
20 - 20.09.21 - 11:56
Как минимум
не  Сообщить(Сообщ)
а Сообщ.Сообщить()

хотя вряд ли дело в этом
   pechkin
 
21 - 20.09.21 - 11:59
ну для фонового нужно вызывать
Фоновое.ПолучитьСообщенияПользователю()
   BaZZiL
 
22 - 20.09.21 - 12:10
(20) (21) Да, и то и другое.

Пришлось в форме "дополнителные отчеты и обработки" еще одну процедурку допилить:

&Вместо("ВыполнитьСерверныйМетодОбработки")
&НаКлиенте
Процедура Интеркампани_ВыполнитьСерверныйМетодОбработки()
    
    Задание = ЗапуститьФоновоеЗадание(ВыполняемаяКоманда, УникальныйИдентификатор);
    
    НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
    НастройкиОжидания.ВыводитьОкноОжидания = Ложь;
//Добавил эту строчку===============

    НастройкиОжидания.ВыводитьСообщения = Истина;
//==================================        

    Обработчик = Новый ОписаниеОповещения("ВыполнитьСерверныйМетодОбработкиЗавершение", ЭтотОбъект);
    ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания);
    
КонецПроцедуры

После этого в 
&Вместо("ВыполнитьСерверныйМетодОбработкиЗавершение")
&НаКлиенте
Процедура Интеркампани_ВыполнитьСерверныйМетодОбработкиЗавершение(Задание, ДополнительныеПараметры) Экспорт
    
    Если Задание = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Если Задание.Статус <> "Выполнено" Тогда
        Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
            НСтр("ru = 'Команда ""%1"" не выполнена:'"),
            ВыполняемаяКоманда.Представление);
        Если Открыта() Тогда
            Закрыть();
        КонецЕсли;
        ВызватьИсключение Текст + Символы.ПС + Задание.КраткоеПредставлениеОшибки;
    КонецЕсли;

//================Появились сообщения в структуре "Задания" (видно в отладчике)

    СообщенияОбработки = Задание.Сообщения;
    Для Каждого Сообщ Из СообщенияОбработки Цикл
        Сообщить(Сообщ);// Ничего не сообщает. 

//ПоказатьПредупреждение(,Сообщ.Текст);//Это работает

//ПоказатьОповещениеПользователя(НСтр("ru = 'Команда выполнена'"),, Сообщ.Текст)// И это работает , но перекрывается следующим оповещением.

    КонецЦикла;    
//============================    


    
    
    // Показ всплывающего оповещения и закрытие этой формы.


    Если ВыполняемаяКоманда.ПоказыватьОповещение Тогда
        ПоказатьОповещениеПользователя(НСтр("ru = 'Команда выполнена'"),, ВыполняемаяКоманда.Представление);
    КонецЕсли;
    Если Открыта() Тогда
        Закрыть();
    КонецЕсли;
    
    // Обновление формы владельца.


    Если ЭтоФормаОбъекта Тогда
        Попытка
            ВладелецФормы.Прочитать();
        Исключение
            // Действие не требуется.


        КонецПопытки;
    КонецЕсли;
    
    // Оповещение других форм.


    РезультатВыполнения = ПолучитьИзВременногоХранилища(Задание.АдресРезультата);
    ОповеститьФормы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(РезультатВыполнения, "ОповеститьФормы");
    Если ОповеститьФормы <> Неопределено Тогда
        СтандартныеПодсистемыКлиент.ОповеститьФормыОбИзменении(ОповеститьФормы);
    КонецЕсли;
    
КонецПроцедуры
   pechkin
 
23 - 20.09.21 - 12:13
Вот тут все сообщения выводятся как надо
https://infostart.ru/public/943888/
   BaZZiL
 
24 - 20.09.21 - 12:24
(23) Жлобмани не хватает скачать(
   BaZZiL
 
25 - 20.09.21 - 13:01
Всё получилось.
Если Задание.Сообщения.Количество()>0 Тогда
    Для Каждого Сообщ Из Задание.Сообщения Цикл
    Сообщ.ИдентификаторНазначения = ВладелецФормы.УникальныйИдентификатор;    //Владелец формы в данном случае - Форма списка документа "Реализация".

    Сообщ.Сообщить();
    КонецЦикла;    
КонецЕсли;
   BaZZiL
 
26 - 21.09.21 - 14:20
Не получилось.

Из нескольких сообщений иногда показывается только последнее.
   МимохожийОднако
 
27 - 21.09.21 - 14:24
(26) Собери все сообщения в один текст и один раз сообщи
   BaZZiL
 
28 - 21.09.21 - 15:21
(27) Свежее решение! )

В БСП есть общая форма "Длительная операция" для показа сообщений и индикации прогресса, которая выводит сообщения на общую форму "ДополнительныеОтчетыИОбработки", которая при завершении Вызова серверного метода тут же закрывается.

Процедура ВыполнитьСерверныйМетодОбработки()
    
    Задание = ЗапуститьФоновоеЗадание(ВыполняемаяКоманда, УникальныйИдентификатор);
    
    НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
//    НастройкиОжидания.ВыводитьОкноОжидания = Ложь; 

    НастройкиОжидания.ВыводитьОкноОжидания = Истина;// Будет показана общая форма "ДлительнаяОперация"


    НастройкиОжидания.ВыводитьСообщения = Истина;

    Обработчик = Новый ОписаниеОповещения("ВыполнитьСерверныйМетодОбработкиЗавершение", ЭтотОбъект);
    ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания);
    
КонецПроцедуры


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.