|   |   | 
| 
 | Немодальный вопрос в расширении | ☑ | ||
|---|---|---|---|---|
| 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 | 
        Всем спасибо, все получилось. Сделал по первому предложенному варианту с реквизитом формы, но нашел другую процедуру для издевательства над ней     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |