|
Доп. обработка Вызов серверного метода. Как сообщить пользователю об ошибке? | ☑ | ||
---|---|---|---|---|
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) Свежее решение! )
В БСП есть общая форма "Длительная операция" для показа сообщений и индикации прогресса, которая выводит сообщения на общую форму "ДополнительныеОтчетыИОбработки", которая при завершении Вызова серверного метода тут же закрывается. Процедура ВыполнитьСерверныйМетодОбработки() Задание = ЗапуститьФоновоеЗадание(ВыполняемаяКоманда, УникальныйИдентификатор); НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); // НастройкиОжидания.ВыводитьОкноОжидания = Ложь; НастройкиОжидания.ВыводитьОкноОжидания = Истина; // Будет показана общая форма "ДлительнаяОперация" НастройкиОжидания.ВыводитьСообщения = Истина; Обработчик = Новый ОписаниеОповещения("ВыполнитьСерверныйМетодОбработкиЗавершение", ЭтотОбъект); ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания); КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |