|
Преобразование процедуры с отказом от модальности | ☑ | ||
---|---|---|---|---|
0
web_profiler
16.02.15
✎
18:51
|
Все было хорошо, потихоньку уходил от модальности, но тут столкнулся с кодом от которого чуток подвис наглухо
&НаКлиенте Процедура ПередЗаписью(Отказ) ОчиститьСообщения(); Если ДействияВФорме.Роли = "Редактирование" И ПользовательИнфБазыРоли.Количество() = 0 Тогда Если Вопрос(НСтр("ru = 'Пользователю информационной базы не установлено ни одной роли. Продолжить?'"), РежимДиалогаВопрос.ДаНет, , , НСтр("ru = 'Запись пользователя информационной базы'")) = КодВозвратаДиалога.Нет Тогда Отказ = Истина; КонецЕсли; КонецЕсли; // Обработка записи первого администратора ТекстВопроса = ""; Если ТребуетсяСоздатьПервогоАдминистратора(ТекстВопроса) Тогда Если Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , НСтр("ru = 'Запись пользователя информационной базы'")) = КодВозвратаДиалога.Нет Тогда Отказ = Истина; КонецЕсли; КонецЕсли; КонецПроцедуры Объясняю: в данной процедуре используются две модальные функции "Вопрос", которые и формируют логику процедуры по Отказу. Помогите, плиз, ее переделать с отказом от модальности. Пробывал через асинхронные процедуры - не получилось. |
|||
1
Krabobor
16.02.15
✎
18:54
|
&НаКлиенте
Процедура Процедура1(Команда) ТекстВопроса = "Мой вопрос"; ПоказатьВопрос(Новый ОписаниеОповещения("Процедура1Завершение",ЭтотОбъект),ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да,); КонецПроцедуры &НаКлиенте Процедура Процедура1Завершение(Ответ, ДополнительныеПараметры) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда ТекстВопроса = "Мой вопрос 2"; ПоказатьВопрос(Новый ОписаниеОповещения("Процедура2Завершение",ЭтотОбъект),ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да,); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Процедура2Завершение(Ответ, ДополнительныеПараметры) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда КонецЕсли; КонецПроцедуры |
|||
2
Krabobor
16.02.15
✎
18:55
|
точнее у тебя будет так:
&НаКлиенте Процедура Процедура1Завершение(Ответ, ДополнительныеПараметры) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда КонецЕсли; ТекстВопроса = "Мой вопрос 2"; ПоказатьВопрос(Новый ОписаниеОповещения("Процедура2Завершение",ЭтотОбъект),ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да,); КонецПроцедуры |
|||
3
web_profiler
16.02.15
✎
19:01
|
пробую
|
|||
4
banco
16.02.15
✎
19:08
|
||||
5
web_profiler
16.02.15
✎
19:09
|
а как в процедуру ПередЗаписью вернуть, если что, Отаз = Истина?
|
|||
6
banco
16.02.15
✎
19:10
|
(5) прочитай (4)
|
|||
7
web_profiler
16.02.15
✎
19:11
|
(4) висит в открытой вкладке ГуглХрома как СП в 1С.
Вопрос то в другом, как вернуть Отказ в Процедуру ПередЗаписью? |
|||
8
web_profiler
16.02.15
✎
19:11
|
Да нет там примера с возвратом отказа
|
|||
9
banco
16.02.15
✎
19:13
|
(8) невнимательно читаешь
Вопрос в обработчике формы ПередЗаписью В обработчике события формы ПередЗаписью также может возникнуть потребность задать вопрос. Как и в предыдущем примере. Однако здесь вопрос так просто не решается. Отличие заключается в следующем. В предыдущем примере, оказываясь в обработчике ПередЗакрытием, мы однозначно знали действие, которое должно быть выполнено. Это закрытие формы. Поэтому в обработке оповещения мы смело писали Закрыть(). Но в обработчике ПередЗаписью мы такой однозначной информации не имеем. В этом обработчике мы можем оказаться по двум причинам: если пользователь нажал Записать, или если он нажал Записать и закрыть. То есть дальнейший сценарий действий нам неизвестен. Определить его стандартными способами, находясь внутри этого обработчика, мы не можем. Поэтому тут можно предложить три варианта, но все они, к сожалению, обладают недостатками: Изменить логику прикладного решения так, чтобы не было диалога с пользователем в этом обработчике. Это не всегда возможно; В обработке оповещения с помощью собственной блокирующей формы задавать пользователю развернутый вопрос, предполагающий точное описание дальнейших действий: Отказаться?, Только записать?, Записать и закрыть? Это может выглядеть не очень красиво, ведь пользователь уже нажал "Записать и закрыть", а его опять об этом спрашивают; Не использовать стандартные команды формы Записать, "Записать и закрыть". Вместо них создать собственные команды, в которых и выполнять необходимые алгоритмы. Создание собственных команд потребует дополнительных трудозатрат. |
|||
10
Smallrat
16.02.15
✎
19:20
|
(5) есть идея с костылём, который будет хранить значения ответа, отменять запись и еще раз вызывать процедуру записать(), обрабатывая что ему ответили перед предыдущей записью. Но сейчас не могу накидать схему - меня с компа гонят.
|
|||
11
banco
16.02.15
✎
19:23
|
(10) пример есть в (4). проблема в том что пользователь мог нажать записать и закрыть, а ты вопрос задашь, запишешь и не закроешь.
|
|||
12
Smallrat
16.02.15
✎
19:30
|
(11) да, действительно. тогда как в (9) - нарисовать свои кнопки. Либо как-то выкрутится без вопросов.
|
|||
13
web_profiler
16.02.15
✎
19:30
|
(11) спс буду думать как обойти эту штуку
|
|||
14
web_profiler
16.02.15
✎
19:31
|
если интересно я придумал идею сейчас ее буду генерировать.
потом сюда код скину |
|||
15
PR
16.02.15
✎
19:33
|
||||
16
Smallrat
16.02.15
✎
19:45
|
интересно, всё таки - 1С придумала отказ от модальности, при этом сама нашла грабли с ПередЗаписью(), придумала костыли, как их обходить (нарисуйте свои кнопки это вообще класс) и на этом успокоилась. хотя можно было вкрутить еще один параметр в ПередЗаписью() - чтото типа КакуюНажалКнопкуПользователь с вариантами КакуюНажалКнопкуПользователь.НажалЗаписать и КакуюНажалКнопкуПользователь.НажалЗаписатьИЗакрыть и тогда всё было бы проще.
|
|||
17
PR
16.02.15
✎
19:47
|
(16) Какие свои кнопочки?
Ты просто вообще не рубишь фишку. |
|||
18
Smallrat
16.02.15
✎
19:50
|
(17) дословно из (15)
"Не использовать стандартные команды формы Записать, "Записать и закрыть". Вместо них создать собственные команды, в которых и выполнять необходимые алгоритмы. Создание собственных команд потребует дополнительных трудозатрат." |
|||
19
PR
16.02.15
✎
19:55
|
(18) А, ты вон про что. Спутал с закрытием формы.
Вопрос в событии перед записью — это конечно треш еще тот. |
|||
20
web_profiler
17.02.15
✎
13:06
|
Вообщем выкрутился так:
Создал 2 реквизита формы с типом булево (НельзяЗаписывать, НельзяЗаписывать2), при открытии элемента справочника устанавливаю их в Истина код ниже: &НаКлиенте Процедура ПередЗаписью(Отказ) ОчиститьСообщения(); Если ДействияВФорме.Роли = "Редактирование" И ПользовательИнфБазыРоли.Количество() = 0 Тогда Если (НельзяЗаписывать = Ложь) И (НельзяЗаписывать2 = Ложь)Тогда Отказ = Ложь; Иначе ТекстВопроса = "Пользователю информационной базы не установлено ни одной роли. Продолжить?"; Оповещение = Новый ОписаниеОповещения("ВопросЗакрытияДокумента", ЭтотОбъект, Отказ); ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет); КонецЕсли; КонецЕсли; Если (НельзяЗаписывать = Истина) И (НельзяЗаписывать2 = Истина)Тогда Отказ = Истина; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВопросЗакрытияДокумента(Результат, Параметры) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда НельзяЗаписывать = Ложь; // Обработка записи первого администратора ТекстВопроса = ""; Если ТребуетсяСоздатьПервогоАдминистратора(ТекстВопроса) Тогда ТекстВопроса = "Запись пользователя информационной базы"; Оповещение2 = Новый ОписаниеОповещения("ВопросЗаписиДокумента", ЭтотОбъект); ПоказатьВопрос(Оповещение2, ТекстВопроса, РежимДиалогаВопрос.ДаНет); Иначе НельзяЗаписывать = Ложь; НельзяЗаписывать2 = Ложь; ПарЗап = Новый Структура; ПарЗап.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение); Записать(ПарЗап); ТекстВопроса = "Закрыть"; Оповещение3 = Новый ОписаниеОповещения("ВопросЗакрытияФормы", ЭтотОбъект); ПоказатьВопрос(Оповещение3, ТекстВопроса, РежимДиалогаВопрос.ДаНет); КонецЕсли; Иначе //Отказ = Истина; Возврат; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВопросЗаписиДокумента(Результат2, Параметры2) Экспорт Если Результат2 = КодВозвратаДиалога.Да Тогда НельзяЗаписывать2 = Ложь; ПарЗап = Новый Структура; ПарЗап.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение); Записать(ПарЗап); ТекстВопроса = "Закрыть форму создания пользователя?"; Оповещение3 = Новый ОписаниеОповещения("ВопросЗакрытияФормы", ЭтотОбъект); ПоказатьВопрос(Оповещение3, ТекстВопроса, РежимДиалогаВопрос.ДаНет); Иначе НельзяЗаписывать = Истина; НельзяЗаписывать2 = Истина; Возврат; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВопросЗакрытияФормы(Результат3, Параметры3) Экспорт Если Результат3 = КодВозвратаДиалога.Да Тогда Закрыть(); КонецЕсли; КонецПроцедуры Обход кнопок Записать и ЗаписатьИЗакрыть реализовал с помощью еще одного вопроса пользователю, ну типа закрываем форму или нет? |
|||
21
Smallrat
17.02.15
✎
13:11
|
Кстати, раз зашёл разговор - кто нить подскажет где в СП описаны как писать процедуру-обработчик, которая вызывается оповещением? Какие там надо писать параметры, а то каждый раз я лезу в типовую конфу за примерами.
|
|||
22
web_profiler
17.02.15
✎
13:18
|
Это не та проблема по которой стоит мучаться. Выше - это была проблема
|
|||
23
Smallrat
17.02.15
✎
13:21
|
(22) ))) я мучаюсь.
ну вот с ходу - где посмотреть как должен выглядеть обработчик , который обрабатывает событие после НачатьПомещениеФайла() |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |