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

Как обработать Отказ, который произошел на сервере при записи документа, на клиенте?

Как обработать Отказ, который произошел на сервере при записи документа, на клиенте?
Я
   ssalikoff
 
16.08.21 - 11:09
Событие ПередЗаписью на клиенте возникает ДО отказа, а до события ПослеЗаписи дело не доходит. С сервера на клиент никак данные отправить нельзя.
Можно на сервере где-нибудь записать и потом попытаться с клиента сервер опросить. Но когда это делать? Я ведь на клиенте даже не знаю о том, что попытка записи уже завершена.
Что можно сделать? Посоветуйте что-нибудь
   asady
 
1 - 16.08.21 - 11:37
(0) для этого используй серверные события формы
ПриЗаписиНаСервере
   ssalikoff
 
2 - 16.08.21 - 12:00
(1) Не пойдёт.  ПриЗаписиНаСервере в модуле формы вызывается после записи объекта в базу данных, но до окончания транзакции записи. А поскольку произошел отказ, то и записи никакой не произошло, и событие не возникнет.
   ssalikoff
 
3 - 16.08.21 - 12:04
Конкретно в моём случае Отказ происходит в модуле объекта ПередЗаписью
   Галахад
 
4 - 16.08.21 - 12:10
Есть еще и ПередЗаписьюНаСервере
   серый КТУЛХУ
 
5 - 16.08.21 - 12:13
сервер с контекстом формы? там можно какой-нить реквизит изменить и программно вызвать закрытие? а в призакритии на клиенте поймать событие и распознать ситуацию?
(навеяно семерошным "ложным закрытием")))
   ssalikoff
 
6 - 16.08.21 - 12:13
(4) Есть, я знаю. Но я ведь написал выше, что отказ происходит в модуле объекта ПередЗаписью, а он отрабатывает позже ПередЗаписьюНаСервере формы
   ssalikoff
 
7 - 16.08.21 - 12:14
(5) Ещё раз скажу, что отказ в модуле объекта. В нём нет доступа к форме
   Дык ё
 
8 - 16.08.21 - 12:21
отказ приводит к исключению. наверно, можно извратиться с событием ОбработкаОтображенияОшибки в модуле приложения
   ssalikoff
 
9 - 16.08.21 - 12:52
(8) Попробовал ваше предложение. Действительно происходит вызов обработика события ОбработкаОтображенияОшибки  в модуле приложения. Однако в нём я не могу проверить, что это "моё", нужное мне исключение. В нём в качестве параметра заполняется ИнформацияОбОшибке, но в ней просто текст типа "не удалось провести Реализация товаров и услуг!" и нет точного указания источник ошибки.
Но всё же, это лучше, чем ничего.
   Kassern
 
10 - 16.08.21 - 13:03
(9) надо как нить идентификатор формы передать, тогда по нему будете понимать, что это ваше нужное исключение
   H A D G E H O G s
 
11 - 16.08.21 - 13:12
(10) ВызватьИсключение "#Суперисключение";


И его ловить в ОбработкаОтображенияОшибки()
   ssalikoff
 
12 - 16.08.21 - 13:39
(11) Попробовал ваш вариант. ВызватьИсключение генерирует окошко с ошибкой, которое нахрен не нужно, и, самое главное, не вызвает обработчик ОбработкаОтображенияОшибки()
   Вафель
 
13 - 16.08.21 - 13:39
Сообщить и
ПолучитьСообщения
   Вафель
 
14 - 16.08.21 - 13:40
Но при отказе далее никуда не идет.
Нужна своя кнопка с записью в попытке
   ssalikoff
 
15 - 16.08.21 - 13:52
(11) Был неправ. ОбработкаОтображенияОшибки() срабатывает. Но остался вопрос: можно ли вызвать исключение без показа окошка пользователю?
   H A D G E H O G s
 
16 - 16.08.21 - 14:19
(15) в обработкеотображения есть флаг СтандартнаяОбработка. Попробуйте его.
   Мультук
 
17 - 16.08.21 - 14:27
(0)

Вопрос. А зачем все это на клиенте? Какова цель?

Пользователь пытается сохранить документ.
Получает отказ и сообщение <Реквизит такой-то не заполнен>
Пользователь исправляет ошибку - документ записывается.

Вы хотите программно получить текст этого сообщения и ... сделать что ?
   ssalikoff
 
18 - 16.08.21 - 15:53
(17) Вот зачем: клиент записывает документ. Он не записывается, потому что возникли некоторые проблемы. При возврате на клиент я предлагаю ему решить проблему одим из способов. Человек просто нажимает на кнопочку, и в систему вносятся исправления (одним из предложенных способов). Смысл в том, что это должно быть интерактивно. Не автоматом при проведении на сервере, а под управлением и с санкции пользователя.
   ssalikoff
 
19 - 16.08.21 - 15:57
(17) И в отличии от вашего примера, где не заполнен какой-то реквизит, проблема может быть гораздо более сложной.
Ну вот например: не проводится реализация. Не хватает товара на складе. Но товар есть на других складах. Складов может быть много, строчек в реализации тоже.
Человек пытается провести, не получается, товара не хватает. Система спрашивает: "товар в принципе есть на других складах. Хочешь, я сделаю для тебя перемещения по недостющим товарам?"
   DrShad
 
20 - 16.08.21 - 15:58
(19) тогда ответ в (13)
   ssalikoff
 
21 - 16.08.21 - 16:06
(20) Если я правильно понял, речь сервере взаимодействия. Это надо что-то устанавливать, это стоит денег, короче — сложно
   Kassern
 
22 - 16.08.21 - 16:12
(18) ну так делайте проверку в модуле формы. Тогда без проблем сможете отрабатывать по ошибкам. А в модуле объекта лишь записывайте проводки
   ssalikoff
 
23 - 16.08.21 - 16:14
(22) Я не хочу переписывать типовую конфигурацию. Обычно все проверки в общих модулях
   Kassern
 
24 - 16.08.21 - 16:18
(23) но вы в любом случае ее ковыряете своими решениями. Надо делать так чтобы человек изначально не мог ошибиться, а не от обратного идти.
   Kassern
 
25 - 16.08.21 - 16:19
(24) к примеру контроль остатков можно при подборе товара еще сделать. Автоотметка незаполненного поможет увидеть, какие поля не заполенны. Есть задолженность, которая не дает проводить, так выведите на форму, что по данному договору отгрузка запрещена и т.д. А не так, что юзвер все тыкает и получает массу ошибок.
   Kassern
 
26 - 16.08.21 - 16:20
(25) а вы со своей менюшкой пытаетесь ему помочь)
   H A D G E H O G s
 
27 - 16.08.21 - 16:23
(15)

Функция ПолучитьСтэкОшибок(ТекстОшибки,Информация) Экспорт
    ТекстВозврата=ТекстОшибки;
    ТекстВозвратаРасширенный="";
    ЕстьТекстВозвратаРасширенный=Ложь;
    ТекущаяИнформация=Информация;
    Префикс="";
    Пока Истина Цикл
        ТекстВозвратаРасширенный=ТекстВозвратаРасширенный+Префикс+ТекущаяИнформация.Описание+?(ЗначениеЗаполнено(ТекущаяИнформация.ИмяМодуля), ". Модуль:"+ТекущаяИнформация.ИмяМодуля,"")+?(ЗначениеЗаполнено(ТекущаяИнформация.НомерСтроки), ". Строка:"+ТекущаяИнформация.НомерСтроки,"");
        ЕстьТекстВозвратаРасширенный=Истина;
        Если ТекущаяИнформация.Причина=Неопределено Тогда
            Прервать;
        КонецЕсли;
        ТекущаяИнформация=ТекущаяИнформация.Причина;
        Префикс=Символы.ПС;
    КонецЦикла;
    
    Возврат ?(ЕстьТекстВозвратаРасширенный,ТекстВозвратаРасширенный,ТекстВозврата);
КонецФункции


Процедура ОбработкаОтображенияОшибки(ИнформацияОбОшибке, ТребуетсяЗавершениеСеанса, СтандартнаяОбработка)
    ОшибкаРазобранная=ПолучитьСтэкОшибок("",ИнформацияОбОшибке);
    Если СтрНайти(ОшибкаРазобранная,"#Суперисключение")<>0 Тогда

        СтандартнаяОбработка=Ложь;
    КонецЕсли;
КонецПроцедуры
   ssalikoff
 
28 - 16.08.21 - 16:26
(24) Речь не об ошибках. А о помощи пользователю. Опять пример: представьте, вы проводите реализацию. Но одна позиция оказалась недоступной (кто-то зарезервировал). В стандартной ситуации пользователь получит сообщение о нехватке, потом он должен сформировать отчет о доступности нехватающего товара, затем сделать расшифровку отчета по регистратору, чтобы увидеть, в каком она заказе. Очень много действий. Всего лишь для одной строки.
Тогда как пользователь мог бы при ошибке проведения получить окошко, в котором будет написано, что такого-то товара не хватает, потому что Иванов Иван Иванович этот товар зарезервировал. И вопрос: "Хочешь, снимем с резерва?"
Экономится уйма времени
   Kassern
 
29 - 16.08.21 - 16:26
(27) а как это ему поможет поработать с открытой формой документа? Я так понимаю ему надо при проведении, чтобы не тупо ошибка выскочила, а менюшка действий вывелась. К примеру продоишь такой документ, а тебе бац и ошибка, нет на остатках столько то штук. Юзверу менюшка мол есть отрицательные остатки и выбор убрать из заказа, заменить на аналоги и т.д. При нажатии происходит действие на форме документа. Как то так я понял хотелку ТС
   Kassern
 
30 - 16.08.21 - 16:27
(28) вы должны понимать, что он изначально не должен был проводить реализации с отрицательными остатками и 1ска должна была подсказать об этом еще до проведения
 
 
   ssalikoff
 
31 - 16.08.21 - 16:27
(16) Спасибо, это работает. Получилось некрасивое костыльное решение, которое, тем не менее, работает. Получается, с сервера можно передать данные на клиент используя следующую технику: кладём значение во временное хранилище и адрес временного хранилища можно передать в виде строки в параметре процедуры ВызватьИсключение. В обработчике ОбработкаОтображенияОшибки() модуля приложения можно получить это значение. А из обработчика уже можно получить клиентскую форму и делать с ней что угодно.
   Kassern
 
32 - 16.08.21 - 16:28
(31) нда костыль на костыле и костылем добивает) Ну да ладно)
   ssalikoff
 
33 - 16.08.21 - 16:28
(30) Остатки есть. Но на других складах. Что вы предлагаете? Делать отчет по каждой строчке, выяснять какого товара не хватает и делать перемещения? Это можно полдня делать, вместо секунды
   Kassern
 
34 - 16.08.21 - 16:29
(33) еще на момент подбора юзвер должен видеть доступные остатки по складам пул которых ему разрешен.
   ssalikoff
 
35 - 16.08.21 - 16:30
(27) Спасибо за помощь. Я приблизительно так и сделал
   H A D G E H O G s
 
36 - 16.08.21 - 16:31
(31) Ну более-менее нормальный костыль.
   H A D G E H O G s
 
37 - 16.08.21 - 16:31
(34) Это гладко на бумаге только бывает. Нормальная у автора хотелка.
   Kassern
 
38 - 16.08.21 - 16:31
(34) в общем я к тому, что 1ска должна помогать юзверу до ошибки по максимуму. Либо вообще исключить возможность ошибки.
   ssalikoff
 
39 - 16.08.21 - 16:32
(38) Повторю, что речь вообще не об ошибках. А об автоматизации рутины, выполняемой менеджером.
   Kassern
 
40 - 16.08.21 - 16:43
(39) я правильно понял вашу реализацию, вы в модуле объекта документа пихаете какое то значение (пусть будет результат по отрицательным остаткам), далее через модуль приложения получаете этот результат. Открыть нужную форму с выбором не проблема, а как передать результат выбора на форму, которая вызвала проведение документа? А если это будет форма списка? А что делать при групповом перепроведении документов за месяц/квартал?
   ssalikoff
 
41 - 16.08.21 - 16:54
(40) Я сделал так: в обработчике ПередЗаписьюНаСервере модуля формы я записываю идентификатор формы в допсвойства объекта
ТекущийОбъект.ДополнительныеСвойства.ИдентификаторФормы = ЭтаФорма.УникальныйИдентификатор;
И тогда в модуле объекта у меня есть идентификатор формы. Его я могу уже через описанную технику через исключение вернуть обратно. И по нему найти форму, из которой было вызвано проведение.
Естественно, для групповых обработок и тому подобного ДокументОбъект не будет иметь такого ДополнительногоСвойства.
   Kassern
 
42 - 16.08.21 - 16:56
(41) в общем как я и писал в (10) =)
   Злопчинский
 
43 - 16.08.21 - 16:58
(25) "к примеру контроль остатков можно при подборе товара еще сделать."
фу, какая гадость
а если работает одновременно 20 человек и от момента первой подобранной строки до проведения пройдет минут 5-17-10 - весь этот контроль остатокв - в одно место при подборе...
?
   Kassern
 
44 - 16.08.21 - 17:02
(43) ну так типовые работают, подсказывают остатки при подборе
   Kassern
 
45 - 16.08.21 - 17:04
(43) тоже от типовых плюетесь?))
   1CnikPetya
 
46 - 16.08.21 - 17:08
(0) Делай кастомный обработчик записи, работай с Объектом и через его ДопСвойста передавай нужные данные.
   Spyke
 
47 - 16.08.21 - 18:14
(43) одно дело справочно показывать, другое контроль. Контроль в типовых при проведении производится
   ДедМорроз
 
48 - 16.08.21 - 22:33
(47) даже не при проведении,а при завершении проведения,когда движения уже сделаны.

На самом деле,есть метод ЗаписатьВФорме
Как раз для таких случаев,но все кнопки нужно переопределять.
Опять же,проведение можно делать из формы списка документов,что весь механизм портит.


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