|
Как обработать Отказ, который произошел на сервере при записи документа, на клиенте? | ☑ | ||
---|---|---|---|---|
0
ssalikoff
16.08.21
✎
11:09
|
Событие ПередЗаписью на клиенте возникает ДО отказа, а до события ПослеЗаписи дело не доходит. С сервера на клиент никак данные отправить нельзя.
Можно на сервере где-нибудь записать и потом попытаться с клиента сервер опросить. Но когда это делать? Я ведь на клиенте даже не знаю о том, что попытка записи уже завершена. Что можно сделать? Посоветуйте что-нибудь |
|||
1
asady
16.08.21
✎
11:37
|
(0) для этого используй серверные события формы
ПриЗаписиНаСервере |
|||
2
ssalikoff
16.08.21
✎
12:00
|
(1) Не пойдёт. ПриЗаписиНаСервере в модуле формы вызывается после записи объекта в базу данных, но до окончания транзакции записи. А поскольку произошел отказ, то и записи никакой не произошло, и событие не возникнет.
|
|||
3
ssalikoff
16.08.21
✎
12:04
|
Конкретно в моём случае Отказ происходит в модуле объекта ПередЗаписью
|
|||
4
Галахад
гуру
16.08.21
✎
12:10
|
Есть еще и ПередЗаписьюНаСервере
|
|||
5
серый КТУЛХУ
16.08.21
✎
12:13
|
сервер с контекстом формы? там можно какой-нить реквизит изменить и программно вызвать закрытие? а в призакритии на клиенте поймать событие и распознать ситуацию?
(навеяно семерошным "ложным закрытием"))) |
|||
6
ssalikoff
16.08.21
✎
12:13
|
(4) Есть, я знаю. Но я ведь написал выше, что отказ происходит в модуле объекта ПередЗаписью, а он отрабатывает позже ПередЗаписьюНаСервере формы
|
|||
7
ssalikoff
16.08.21
✎
12:14
|
(5) Ещё раз скажу, что отказ в модуле объекта. В нём нет доступа к форме
|
|||
8
Дык ё
16.08.21
✎
12:21
|
отказ приводит к исключению. наверно, можно извратиться с событием ОбработкаОтображенияОшибки в модуле приложения
|
|||
9
ssalikoff
16.08.21
✎
12:52
|
(8) Попробовал ваше предложение. Действительно происходит вызов обработика события ОбработкаОтображенияОшибки в модуле приложения. Однако в нём я не могу проверить, что это "моё", нужное мне исключение. В нём в качестве параметра заполняется ИнформацияОбОшибке, но в ней просто текст типа "не удалось провести Реализация товаров и услуг!" и нет точного указания источник ошибки.
Но всё же, это лучше, чем ничего. |
|||
10
Kassern
16.08.21
✎
13:03
|
(9) надо как нить идентификатор формы передать, тогда по нему будете понимать, что это ваше нужное исключение
|
|||
11
H A D G E H O G s
16.08.21
✎
13:12
|
(10) ВызватьИсключение "#Суперисключение";
И его ловить в ОбработкаОтображенияОшибки() |
|||
12
ssalikoff
16.08.21
✎
13:39
|
(11) Попробовал ваш вариант. ВызватьИсключение генерирует окошко с ошибкой, которое нахрен не нужно, и, самое главное, не вызвает обработчик ОбработкаОтображенияОшибки()
|
|||
13
Вафель
16.08.21
✎
13:39
|
Сообщить и
ПолучитьСообщения |
|||
14
Вафель
16.08.21
✎
13:40
|
Но при отказе далее никуда не идет.
Нужна своя кнопка с записью в попытке |
|||
15
ssalikoff
16.08.21
✎
13:52
|
(11) Был неправ. ОбработкаОтображенияОшибки() срабатывает. Но остался вопрос: можно ли вызвать исключение без показа окошка пользователю?
|
|||
16
H A D G E H O G s
16.08.21
✎
14:19
|
(15) в обработкеотображения есть флаг СтандартнаяОбработка. Попробуйте его.
|
|||
17
Мультук
гуру
16.08.21
✎
14:27
|
(0)
Вопрос. А зачем все это на клиенте? Какова цель? Пользователь пытается сохранить документ. Получает отказ и сообщение <Реквизит такой-то не заполнен> Пользователь исправляет ошибку - документ записывается. Вы хотите программно получить текст этого сообщения и ... сделать что ? |
|||
18
ssalikoff
16.08.21
✎
15:53
|
(17) Вот зачем: клиент записывает документ. Он не записывается, потому что возникли некоторые проблемы. При возврате на клиент я предлагаю ему решить проблему одим из способов. Человек просто нажимает на кнопочку, и в систему вносятся исправления (одним из предложенных способов). Смысл в том, что это должно быть интерактивно. Не автоматом при проведении на сервере, а под управлением и с санкции пользователя.
|
|||
19
ssalikoff
16.08.21
✎
15:57
|
(17) И в отличии от вашего примера, где не заполнен какой-то реквизит, проблема может быть гораздо более сложной.
Ну вот например: не проводится реализация. Не хватает товара на складе. Но товар есть на других складах. Складов может быть много, строчек в реализации тоже. Человек пытается провести, не получается, товара не хватает. Система спрашивает: "товар в принципе есть на других складах. Хочешь, я сделаю для тебя перемещения по недостющим товарам?" |
|||
20
DrShad
16.08.21
✎
15:58
|
(19) тогда ответ в (13)
|
|||
21
ssalikoff
16.08.21
✎
16:06
|
(20) Если я правильно понял, речь сервере взаимодействия. Это надо что-то устанавливать, это стоит денег, короче — сложно
|
|||
22
Kassern
16.08.21
✎
16:12
|
(18) ну так делайте проверку в модуле формы. Тогда без проблем сможете отрабатывать по ошибкам. А в модуле объекта лишь записывайте проводки
|
|||
23
ssalikoff
16.08.21
✎
16:14
|
(22) Я не хочу переписывать типовую конфигурацию. Обычно все проверки в общих модулях
|
|||
24
Kassern
16.08.21
✎
16:18
|
(23) но вы в любом случае ее ковыряете своими решениями. Надо делать так чтобы человек изначально не мог ошибиться, а не от обратного идти.
|
|||
25
Kassern
16.08.21
✎
16:19
|
(24) к примеру контроль остатков можно при подборе товара еще сделать. Автоотметка незаполненного поможет увидеть, какие поля не заполенны. Есть задолженность, которая не дает проводить, так выведите на форму, что по данному договору отгрузка запрещена и т.д. А не так, что юзвер все тыкает и получает массу ошибок.
|
|||
26
Kassern
16.08.21
✎
16:20
|
(25) а вы со своей менюшкой пытаетесь ему помочь)
|
|||
27
H A D G E H O G s
16.08.21
✎
16:23
|
(15)
Функция ПолучитьСтэкОшибок(ТекстОшибки,Информация) Экспорт ТекстВозврата=ТекстОшибки; ТекстВозвратаРасширенный=""; ЕстьТекстВозвратаРасширенный=Ложь; ТекущаяИнформация=Информация; Префикс=""; Пока Истина Цикл ТекстВозвратаРасширенный=ТекстВозвратаРасширенный+Префикс+ТекущаяИнформация.Описание+?(ЗначениеЗаполнено(ТекущаяИнформация.ИмяМодуля), ". Модуль:"+ТекущаяИнформация.ИмяМодуля,"")+?(ЗначениеЗаполнено(ТекущаяИнформация.НомерСтроки), ". Строка:"+ТекущаяИнформация.НомерСтроки,""); ЕстьТекстВозвратаРасширенный=Истина; Если ТекущаяИнформация.Причина=Неопределено Тогда Прервать; КонецЕсли; ТекущаяИнформация=ТекущаяИнформация.Причина; Префикс=Символы.ПС; КонецЦикла; Возврат ?(ЕстьТекстВозвратаРасширенный,ТекстВозвратаРасширенный,ТекстВозврата); КонецФункции Процедура ОбработкаОтображенияОшибки(ИнформацияОбОшибке, ТребуетсяЗавершениеСеанса, СтандартнаяОбработка) ОшибкаРазобранная=ПолучитьСтэкОшибок("",ИнформацияОбОшибке); Если СтрНайти(ОшибкаРазобранная,"#Суперисключение")<>0 Тогда СтандартнаяОбработка=Ложь; КонецЕсли; КонецПроцедуры |
|||
28
ssalikoff
16.08.21
✎
16:26
|
(24) Речь не об ошибках. А о помощи пользователю. Опять пример: представьте, вы проводите реализацию. Но одна позиция оказалась недоступной (кто-то зарезервировал). В стандартной ситуации пользователь получит сообщение о нехватке, потом он должен сформировать отчет о доступности нехватающего товара, затем сделать расшифровку отчета по регистратору, чтобы увидеть, в каком она заказе. Очень много действий. Всего лишь для одной строки.
Тогда как пользователь мог бы при ошибке проведения получить окошко, в котором будет написано, что такого-то товара не хватает, потому что Иванов Иван Иванович этот товар зарезервировал. И вопрос: "Хочешь, снимем с резерва?" Экономится уйма времени |
|||
29
Kassern
16.08.21
✎
16:26
|
(27) а как это ему поможет поработать с открытой формой документа? Я так понимаю ему надо при проведении, чтобы не тупо ошибка выскочила, а менюшка действий вывелась. К примеру продоишь такой документ, а тебе бац и ошибка, нет на остатках столько то штук. Юзверу менюшка мол есть отрицательные остатки и выбор убрать из заказа, заменить на аналоги и т.д. При нажатии происходит действие на форме документа. Как то так я понял хотелку ТС
|
|||
30
Kassern
16.08.21
✎
16:27
|
(28) вы должны понимать, что он изначально не должен был проводить реализации с отрицательными остатками и 1ска должна была подсказать об этом еще до проведения
|
|||
31
ssalikoff
16.08.21
✎
16:27
|
(16) Спасибо, это работает. Получилось некрасивое костыльное решение, которое, тем не менее, работает. Получается, с сервера можно передать данные на клиент используя следующую технику: кладём значение во временное хранилище и адрес временного хранилища можно передать в виде строки в параметре процедуры ВызватьИсключение. В обработчике ОбработкаОтображенияОшибки() модуля приложения можно получить это значение. А из обработчика уже можно получить клиентскую форму и делать с ней что угодно.
|
|||
32
Kassern
16.08.21
✎
16:28
|
(31) нда костыль на костыле и костылем добивает) Ну да ладно)
|
|||
33
ssalikoff
16.08.21
✎
16:28
|
(30) Остатки есть. Но на других складах. Что вы предлагаете? Делать отчет по каждой строчке, выяснять какого товара не хватает и делать перемещения? Это можно полдня делать, вместо секунды
|
|||
34
Kassern
16.08.21
✎
16:29
|
(33) еще на момент подбора юзвер должен видеть доступные остатки по складам пул которых ему разрешен.
|
|||
35
ssalikoff
16.08.21
✎
16:30
|
(27) Спасибо за помощь. Я приблизительно так и сделал
|
|||
36
H A D G E H O G s
16.08.21
✎
16:31
|
(31) Ну более-менее нормальный костыль.
|
|||
37
H A D G E H O G s
16.08.21
✎
16:31
|
(34) Это гладко на бумаге только бывает. Нормальная у автора хотелка.
|
|||
38
Kassern
16.08.21
✎
16:31
|
(34) в общем я к тому, что 1ска должна помогать юзверу до ошибки по максимуму. Либо вообще исключить возможность ошибки.
|
|||
39
ssalikoff
16.08.21
✎
16:32
|
(38) Повторю, что речь вообще не об ошибках. А об автоматизации рутины, выполняемой менеджером.
|
|||
40
Kassern
16.08.21
✎
16:43
|
(39) я правильно понял вашу реализацию, вы в модуле объекта документа пихаете какое то значение (пусть будет результат по отрицательным остаткам), далее через модуль приложения получаете этот результат. Открыть нужную форму с выбором не проблема, а как передать результат выбора на форму, которая вызвала проведение документа? А если это будет форма списка? А что делать при групповом перепроведении документов за месяц/квартал?
|
|||
41
ssalikoff
16.08.21
✎
16:54
|
(40) Я сделал так: в обработчике ПередЗаписьюНаСервере модуля формы я записываю идентификатор формы в допсвойства объекта
ТекущийОбъект.ДополнительныеСвойства.ИдентификаторФормы = ЭтаФорма.УникальныйИдентификатор; И тогда в модуле объекта у меня есть идентификатор формы. Его я могу уже через описанную технику через исключение вернуть обратно. И по нему найти форму, из которой было вызвано проведение. Естественно, для групповых обработок и тому подобного ДокументОбъект не будет иметь такого ДополнительногоСвойства. |
|||
42
Kassern
16.08.21
✎
16:56
|
(41) в общем как я и писал в (10) =)
|
|||
43
Злопчинский
16.08.21
✎
16:58
|
(25) "к примеру контроль остатков можно при подборе товара еще сделать."
фу, какая гадость а если работает одновременно 20 человек и от момента первой подобранной строки до проведения пройдет минут 5-17-10 - весь этот контроль остатокв - в одно место при подборе... ? |
|||
44
Kassern
16.08.21
✎
17:02
|
(43) ну так типовые работают, подсказывают остатки при подборе
|
|||
45
Kassern
16.08.21
✎
17:04
|
(43) тоже от типовых плюетесь?))
|
|||
46
1CnikPetya
16.08.21
✎
17:08
|
(0) Делай кастомный обработчик записи, работай с Объектом и через его ДопСвойста передавай нужные данные.
|
|||
47
Spyke
16.08.21
✎
18:14
|
(43) одно дело справочно показывать, другое контроль. Контроль в типовых при проведении производится
|
|||
48
ДедМорроз
16.08.21
✎
22:33
|
(47) даже не при проведении,а при завершении проведения,когда движения уже сделаны.
На самом деле,есть метод ЗаписатьВФорме Как раз для таких случаев,но все кнопки нужно переопределять. Опять же,проведение можно делать из формы списка документов,что весь механизм портит. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |