|
Немодальный вопрос в расширении | ☑ | ||
---|---|---|---|---|
0
AAA
11.08.22
✎
07:14
|
Всем доброго дня!
Коллеги, не могу никак сообразить. Есть процедура в форме документа и возникла потребность выполнять ее не безусловно, а с ответом на вопрос. При модальном вопросе проблем нет. Переношу процедуру в расширение с аннотацией &После , в ней задаю вопрос и при положительном ответе на вопрос пишу ПродолжитьВызов. А как сделать тоже самое, но с немодальным вопросом ? |
|||
1
Mihasya
11.08.22
✎
07:34
|
&Вместо
|
|||
2
AAA
11.08.22
✎
07:43
|
пардон. я &вместо и сделал. опечатался. Поэтому потом и ПродолжитьВЫзов. Но это с модальным вопросом
Всю процедуру не хотелось бы замещать. Ее функционал полностью устраивает |
|||
3
Mihasya
11.08.22
✎
08:33
|
В конфе:
&НаКлиенте Процедура Заполнить(Команда) ... ... ... КонецПроцедуры В расширении: &НаКлиенте Процедура Расширение_ЗаполнитьВместо(Команда) ДополнительнвеПараметры = Новый Структура; ДополнительнвеПараметры.Вставить("Команда", Команда); Оповещение = Новый ОписаниеОповещения("ЗаполнитьПослеВопроса", ЭтаФорма, ДополнительнвеПараметры); ПоказатьВопрос(Оповещение, "Да или Нет?", РежимДиалогаВопрос.ДаНет); КонецПроцедуры &НаКлиенте Процедура ЗаполнитьПослеВопроса(Результат, ДополнительнвеПараметры) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда Заполнить(ДополнительнвеПараметры.Команда); КонецЕсли; КонецПроцедуры |
|||
4
AAA
11.08.22
✎
08:47
|
(3)Разве здесь не произойдет зацикливания, Процедура "Заполнить" будет вызываться после "Да", затем опять вопрос и тд ?
Вся проблема то именно в этом, как продолжить выполнение переопределяемой процедуры. Или я туплю ? |
|||
5
Mihasya
11.08.22
✎
09:07
|
Видимо платформа это как-то отслеживает... не зацикливается ))
|
|||
6
VoditelKobyly
11.08.22
✎
09:29
|
Какая платформа? Может можно использовать асинхронные функции?
|
|||
7
Mihasya
11.08.22
✎
09:32
|
(4) ну на крайняк можно добавить реквизит на форме расширения, что-то вроде ЭтоЦикличныйВызов, тип булево
&НаКлиенте Процедура Расширение_ЗаполнитьВместо(Команда) Если ЭтаФорма.ЭтоЦикличныйВызов Тогда ЭтаФорма.ЭтоЦикличныйВызов = Ложь; ПродолжитьВызов(Команда); Возврат; КонецЕсли; ДополнительнвеПараметры = Новый Структура; ДополнительнвеПараметры.Вставить("Команда", Команда); Оповещение = Новый ОписаниеОповещения("ЗаполнитьПослеВопроса", ЭтаФорма, ДополнительнвеПараметры); ПоказатьВопрос(Оповещение, "Да или Нет?", РежимДиалогаВопрос.ДаНет); КонецПроцедуры &НаКлиенте Процедура ЗаполнитьПослеВопроса(Результат, ДополнительнвеПараметры) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда ЭтаФорма.ЭтоЦикличныйВызов = Истина; Заполнить(ДополнительнвеПараметры.Команда); КонецЕсли; КонецПроцедуры |
|||
8
VoditelKobyly
11.08.22
✎
09:43
|
Код из формы и код из расширения выполняется в разных контекстах, поэтому зацикливания не будет
|
|||
9
AAA
11.08.22
✎
10:34
|
(7)-эта идея понятна, так гарантированно будет работать, но попробую решить без реквизита
(8)-не понял про контексты. Мы из расщирения снова вызываем исходную процедуру форму и по какой причине не произойдет перехват и вновь вызовется процедура из расширения формы, а значит и снова вопрос и тд.? |
|||
10
AAA
11.08.22
✎
10:51
|
я думаю, что надо в ОписаниеОповещения пихать доппараметры с параметрами процедуры и своим флагом, и тогда в процедуре обработки вопроса вызывать нужную процедуру из расширения с флагом, который предотвратит вызов вопроса
|
|||
11
VoditelKobyly
11.08.22
✎
11:05
|
(9) Беру свои слова в зад.
Попробовал. Ругается Процедура или функция с указанным именем уже определена. |
|||
12
Смотрящий
11.08.22
✎
11:50
|
||||
13
AAA
12.08.22
✎
06:46
|
(12)Спасибо, посмотрю. Проблема похожая, но другая. Я сделал, как советовали коллеги, с реквизитом формы ЭтоЦикличныйВызов
Это все чудесно работает, но засада оказалась в другом. Видимо я выбрал не ту процедуру, в которую надо вставлять вопрос, так как программа выполняет код, который расположен после этой процедуры, не дожидаясь ответа на вопрос. Надо думать, сложно получается с этим немодальным вопросом. В отличии от ПередЗаписью у меня нет никаких параметров типа Отказ Процедура Какаято() .... МояПроцедура(); ДругаяПроцелура(); КонецПроцедуры Процедура МояПроцедура() тут немодальный вопрос КонецПроцедуры Процедура ДругаяПроцедура() тут как раз код, который зависит от результата выполнения МояПроцедура и он выполняется по цепочке, которая должна бы быть при ответе на вопрос "Нет" КонецПроцедуры Как то так, наверное несколько сумбурно, но думаю что примерно понятно )) |
|||
14
AAA
12.08.22
✎
10:15
|
Похоже, что это нерешаемая задача ) Нашел другую функцию, но она возвращает результат, вне зависимости от ПоказатьВопрос )
Придется видимо разрешать модальный вопрос. Тогда все просто и понятно. Либо еще тщательнее искать место куда воткнуть ПоказатьВопрос |
|||
15
AAA
12.08.22
✎
10:40
|
Методологически делал неправильно, не в то место подтыкался с переопределением . Думаю все получится
|
|||
16
Смотрящий
12.08.22
✎
11:28
|
Процедура Какаято()
.... Если НЕ ВопросЗадан Тогда МояПроцедура(); Иначе Если ВопросЗаданРезультат=Да Тогда ДругаяПроцелура(); ВопросЗадан = Ложь; ВопросЗаданРезультат = Неопределено; КонецЕсли; КонецЕсли; .... КонецПроцедуры Процедура МояПроцедура() Оповещение = <Как оно там оформляется> "МояПроцедураПродолжение" ПоказатьВопрос(); ВопросЗадан = Истина; КонецПроцедуры Процедура МояПроцедураПродолжение() ВопросЗаданРезультат = Да; Какаято(); КонецПроцедуры |
|||
17
AAA
13.08.22
✎
11:55
|
Всем спасибо, все получилось. Сделал по первому предложенному варианту с реквизитом формы, но нашел другую процедуру для издевательства над ней
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |