5 июля 2019 г.

1С УФ ПоказатьВопрос ПередЗаписью

Встала задача - перед записью документа произвести некоторые проверки и задать вопрос пользователю, в зависимости от ответа - провести документ или нет.

Все бы хорошо, но логика не модальных диалогов приводит нас к тому, что вопрос еще не отвечен, а процедура, вызвавшая ее, уже завершила свою работу.

Есть несколько вариантов решения, один - это замена стандартных команд своими, второй использование дополнительных переменных и повторный вызов процедуры.
В моем случае инициирует все процедура ПередЗаписью() (я делал в расширении, перед):

//Объявляем ряд глобальных переменных в контексте клиента
//Пока переменные не переопределены их значение равно - Неопределено
&НаКлиенте
Перем ОтказатьВПроведении;
&НаКлиенте
Перем глПараметрыЗаписи;



&НаКлиенте
Процедура Расш1_ПередЗаписьюПеред(Отказ, ПараметрыЗаписи)
    Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
        глПараметрыЗаписи=ПараметрыЗаписи;
        Если ОтказатьВПроведении=Неопределено Тогда 
            ДиалогСВопросом();
            Отказ=Истина; // завершаем работу процедуры в самом ее зачатке
        Иначе 
            Отказ=ОтказатьВПроведении;
            ОтказатьВПроведении=Неопределено;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДиалогСВопросом()
    Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса",ЭтотОбъект); 
    ПоказатьВопрос(Оповещение,Строка("Вы уверены что хотите провести отгрузку?"),
                    РежимДиалогаВопрос.ДаНет,0,КодВозвратаДиалога.Да,"Отгрузить товар?");    
КонецПроцедуры
 
&НаКлиенте
Процедура ПослеЗакрытияВопроса(Результат, Параметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        ОтказатьВПроведении=Ложь;
    Иначе
 ОтказатьВПроведении=Истина;
    КонецЕсли; 
    Записать(глПараметрыЗаписи);
КонецПроцедуры



Вся мысль заключается в следующем:
После нажатия кнопки провести проверяется переменная ОтказатьВПроведении, если она равна неопределено, тогда вопрос еще не задавался запускаем выполнение процедур вопроса и ставим отказ в истину, чтобы документ не провелся. В процедуре после вопроса формируются новые значения переменной ОтказатьВПроведении (на этот момент ПередЗаписью уже завершился), и в конце снова запускаем запись с параметрами проведения. Переменная ОтказатьВПроведении уже имеет значение отличное от Неопределено, значит вопрос задавался, выполняем дальше процедуры/функции сообразуясь с ответом пользователя. Незабываем очистить переменную ОтказатьВПроведении.

Комментариев нет:

Отправить комментарий