Имя: Пароль:
1C
1С v8
Как в УФ перед записью вызвать вопрос?
, ,
0 Хосе
 
10.08.15
11:30
Т.е. нужно перед записью проверить соответствие реквизитов определенной схеме и задать вопрос. Если пользователь подтвердит, то записать, если не подтвердит - то прервать запись.

Как это сделать в новой парадигме модальности? Блокировать интерфейс не получится, имхо.
1 butterbean
 
10.08.15
11:33
ПоказатьВопрос()
2 Fragster
 
гуру
10.08.15
11:42
(1) тут возникает косяк со стандартной кнопкой "записать и закрыть"
3 Хосе
 
10.08.15
11:44
(1) (2) Но как модально обработать? Т.е. я делаю возврат из ПередЗаписью и блокирую интерфейс.
Потом, когда я словлю результат вопроса, куда мне передать управление?
4 Новиков
 
10.08.15
11:57
Делаешь свою переменную в форме. В обр. ПередЗакрытием (как пример) проверяешь ее на неопределено. Если да, тогда можешь проверить модифицированность или что-то еще, почему ты поймешь, что нужно что-то спросить. Понял и если да, то Отказ = Истина, и уходишь в свое оповещение, где делаешь свои дела, и в конце процедуры оповещения свою переменную устанавливаешь во что-то (что тебе надо) и принудительно закрываешь форму через Закрыть(), что спровоцирует еще один вызов перед закрытием, ты уже на неопределено не выйдешь, вопрос не спросишь и уйдешь стандартно.
5 Хосе
 
10.08.15
12:10
(4) а если пользователь нажмет не закрыть, а записать? есть же событие ПередЗаписью, на это заточенное как раз.
6 Хосе
 
10.08.15
12:11
или нужно в обработчике вызывать заново метод Записать, но уже не дергать свое событие, если ответ получен?
7 Новиков
 
10.08.15
12:12
(5) я привел в скобках "(как пример)". Используй обработчик тот, который больше подходит. В моем примере, как спросить что-то перед закрытием.
8 Хосе
 
10.08.15
12:13
(7) немного не понятно. Я хочу словить событие перед записью, т.е. оно может быть связано и с закрытием формы и с нажатием записать, точка входа в него одна - ПередЗаписью.
9 UFO
 
10.08.15
12:13
Есть обработчик формы у клиента передзапись, там выдаешь вопрос модальный, если нет то отказ в истину и всё
10 UFO
 
10.08.15
12:13
роцедура ПередЗаписью(Отказ, ПараметрыЗаписи)
11 Новиков
 
10.08.15
12:15
=) Я тебе рекомендую, если навскидку сразу не понятно, где нужно что проверять, точками проставить - и проследить последовательность вызова тех или иных обработчиков событий в форме. Или в библии есть наглядный пример. В (9) кажется то, что тебе нужно, если я все сейчас правильно понял.
12 Хосе
 
10.08.15
12:23
(9) нельзя модальный.
(11) не знаю, не знаю. пока не могу понять логику. Как в этом случае использовать немодальный ПоказатьВопрос.
13 UFO
 
10.08.15
12:25
Вопрос не может быть не модальным! Потому как вопрос подразумевает реакцию пользователя, а не его игнорирование
14 UFO
 
10.08.15
12:26
Если он не модальный, то он автоматом становится не вопросом, а просто сообщением
15 UFO
 
10.08.15
12:27
ПРограмма должна как то реагировать на ответ пользователя, и как она будет реагировать, если ответа нет?
16 UFO
 
10.08.15
12:28
Так записывать или нет?
17 UFO
 
10.08.15
12:28
Так что мозги не себе не другим не парь а ставь модальный вопрос и всё
18 ЧеловекДуши
 
10.08.15
12:30
(3) Странный вопрос, куда передать :)

1. Ты находишь ошибки
2. Задаешь вопрос, и пользователь принимает решение.
3. Если пользователь не принял решение, или у тебя жестко "Только без ошибок". То пишешь Отказ = Истина в процедуре "ПередЗаписью", которая должна размещаться  в форме записываемого "Объета".
4. ... а сам как думаешь, что дальше?...
19 UFO
 
10.08.15
12:32
(18) Не.. можно конечно принять человека на работу, который будет определять, записывать это или нет... :) Тогда никаких модальных вопросов, а ему очередь данных, где надо принять решение: записать или нет
20 Stepa86
 
10.08.15
12:35
&НаКлиенте
Перем ОтветПередЗакрытием;


&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
       Если ОтветПередЗакрытием <> Истина Тогда
             Отказ = Истина;
             Оповещение = Новый ОписаниеОповещения(
                    "ПередЗакрытиемЗавершение",
                    ЭтотОбъект);
              ПоказатьВопрос(Оповещение, “Закрыть?”, РежимДиалогаВопрос.ДаНет);
       КонецЕсли
КонецПроцедуры


&НаКлиенте
Процедура ПередЗакрытиемЗавершение(Результат, Параметры) Экспорт
       Если Результат = КодВозвратаДиалога.Да Тогда
             ОтветПередЗакрытием = Истина;
             Закрыть();
       КонецЕсли;  
КонецПроцедуры


http://its.1c.ru/db/metod8dev/content/5272/hdoc
21 Новиков
 
10.08.15
12:35
(12) у тебя кажется представление о модальности/немодальности слегка замылилось. Ты сначала просто посмотри, как работают для пользователя немодальные вызовы.
22 UFO
 
10.08.15
12:36
(20) Степа, у него был вопрос, чтобы не сохранять, а ты уже закрытие показываешь
23 alexei366
 
10.08.15
12:44
(22) Ну так пусть сам автор поменяет степин код с "Закрытие" на "Запись" и метод "Закрыть" на "Записать", и все
24 UFO
 
10.08.15
12:47
(23) Вся беда в том что нужно реагирование пользователя на сохраняемые данные, в зависимости от данных и решение принимается сохранять или нет, а в таком диалоге без модальности как быть?
25 UFO
 
10.08.15
12:51
Если проигнорировать, то данные сохранятся с ошибками
26 Fragster
 
гуру
10.08.15
13:07
(24)(25) с точки зрения пользователя - модальный, с точки зрения 1с - не модальный. вообще этот отказ от модальности принес кучу проблем для разработчиков. Та, которую в общем случае не обойти - в (2)
27 Fragster
 
гуру
10.08.15
13:08
а вообще - почитай http://v8.1c.ru/o7/201301nm/
28 UFO
 
10.08.15
14:02
(27) опять ты куралесишь...
Пользователь нажал Записать и закрыть, значит надо прервать процесс записи и спросить у пользователя, как без модальности?
29 UFO
 
10.08.15
14:03
а 27 ничего толкого-го не нашел
30 UFO
 
10.08.15
14:04
Одно дело в процессе ввода инфы спросить без модальности и другое в таких ситуациях, когда изменения отменить будет нельзя
31 UFO
 
10.08.15
14:07
Ещё в 90-х писал на VC++ многопоточные приложения, и прекрасно помню принцип модальности и для чего он нужен. И сейчас он другим не стал. Просто у вас еще подход идет от 7.7
32 DmitrO
 
10.08.15
14:15
(28) :)
Так в том то и дело, что "модально" - это не "прервать", это остановить, спросить, а потом продолжить.

И это не (27) куралесит, а 1С. Для 1Сников же милое дело было спросить что нибудь у пользователя во время транзакции, а потом визжать что 1С тормозная система. Вот 1С отучает мало по малу. :)
33 UFO
 
10.08.15
14:18
(32) Хорошо, чем плох Вопрос?
34 UFO
 
10.08.15
14:19
Что он там прерывает?
35 DmitrO
 
10.08.15
14:21
(33)тем что во время ответа на вопрос, пользователь может уйти поссать, а его там арестуют за не уплату налогов, а у нас транзакция в базе идет, событие ПриЗаписи уже в транзакции срабатывает.
36 UFO
 
10.08.15
14:22
(35) Ну и в 27 тоже выполнение останавливается( ваша транзакция, пока он ссыт)
37 UFO
 
10.08.15
14:22
Тоже налогавая арестует
38 UFO
 
10.08.15
14:23
Просто механизм вывода окна другой, но смысл тот же
39 DmitrO
 
10.08.15
14:24
(36)в (27) именно прервыение, она откатывается, и блокировки снимаются, пока он ходит ничего не заблокировано.
40 UFO
 
10.08.15
14:24
Всё в 27 сделано для веб клиента, чтобы веб клиенты работали и браузеры не висли
41 DmitrO
 
10.08.15
14:24
*прерывание
42 UFO
 
10.08.15
14:25
Ха ха.. какое же это сохранение, если все откатывается и ничего не сохраняется, хе хе
43 UFO
 
10.08.15
14:26
ПередЗаписью это тоже еще не сохранение
Это только подготовка данных к сохранению
44 DmitrO
 
10.08.15
14:26
а я и не говорю что так делать правильно - правильно это спросить все еще до записи.
45 UFO
 
10.08.15
14:28
И никаких блокировок. Ну вылезет вопрос, спросит ( а он ссать ушел), дык по таймауту просто отмена закрытия пройдёт и никаких блокировок
46 DmitrO
 
10.08.15
14:30
(45) таймаут, несколько минут? ну тут мне нечего сказать :)
автору виднее, проблему я обозначил )
47 Хосе
 
11.08.15
14:03
(20) а почему перед закрытием? ведь можно нажать кнопку записать.

(19) (18) в режиме совместимости с немодальностью нельзя использовать модальные замораживания кода.

(23) Нет события ПередЗаписьюЗавершение, нельзя выполнять код ПередЗаписьюНаСервере, пока не получен ответ от пользователя.

пока ответа тут не увидел. Но кажется что нужно передзаписью:
1. Задавать вопрос
2. делать отказ
3. В обработчике вызывать Записать с параметром, который указывает, что контролировать не надо.

Имхо, так.
48 Fragster
 
гуру
11.08.15
15:55
(47) см. (2)
49 Хосе
 
12.08.15
16:04
(48) какой косяк? При нажатии стандарной кнопки тоже будет вызываться ПередЗаписью и если я там откажусь, то запись не пройдет.
50 Fragster
 
гуру
12.08.15
19:31
(49) никак не отличить нажатие на стандартные кнопки "записать и закрыть" и "записать". Соответственно, если в ответ на вопрос таки должна произойти запись, то ты не сможешь определить, нужно ли после нее закрывать форму.
51 hhhh
 
12.08.15
20:08
(50) эта проблеиа в УТ11. Когда делаешь чек ККМ и нажимаешь на крестик закрыть базу, она сначала спрашивает "завершить работу?", отвечаем "ок", потом спрашивает "Есть непробитый чек, отменить чек?", говорим "отменить". И о чудо: программа не закрывается, база остается открытой, приходится второй раз завершать.