Имя: Пароль:
1C
1С v8
Немодальный вопрос в расширении
,
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
(0)
https://infostart.ru/1c/articles/372973/
По образу и подобию сделай
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
Всем спасибо, все получилось. Сделал по первому предложенному варианту с реквизитом формы, но нашел другую процедуру для издевательства над ней