Имя: Пароль:
1C
1С v8
Доп. обработка Вызов серверного метода. Как сообщить пользователю об ошибке?
,
0 BaZZiL
 
16.09.21
12:57
Привет честнОй компании!

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

Если Задание.Сообщения.Количество()>0 Тогда
    Для Каждого Сообщ Из Задание.Сообщения Цикл
    Сообщ.ИдентификаторНазначения = ВладелецФормы.УникальныйИдентификатор;    //Владелец формы в данном случае - Форма списка документа "Реализация".
    Сообщ.Сообщить();
    КонецЦикла;    
КонецЕсли;
26 BaZZiL
 
21.09.21
14:20
Не получилось.

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

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

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

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

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