Имя: Пароль:
1C
1С v8
Преобразование процедуры с отказом от модальности
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) ))) я мучаюсь.
ну вот с ходу - где посмотреть как должен выглядеть обработчик , который обрабатывает событие после НачатьПомещениеФайла()