D2 стразование

Вызов преобразован не полностью. Присвоение cсылочного параметра: Отказ

02 Mar
Published by Nicholas

 

Не буду объяснять для чего нужно отказываться от модальности при разработке приложений на 1С, раскажу лишь какие сложности могут возникнуть при преобразовании нерекомендуемых синхронных вызовов в асинхронные.

Допустим, что у нас имеется рабочая процедура, в которой открывается модальное окно Вопрос.

 

&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)

    Если
Модифицированность Тогда
        Если
Вопрос("Данные были изменены. Закрыть форму без сохранения?", РежимДиалогаВопрос.ДаНет) <> КодВозвратаДиалога.Да Тогда
           
Отказ = Истина;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

 

Сделаем преобразование: Рефакторинг - Нерекомендуемые синхронные вызовы - Преобразовать вызов. 

 

Рефакторинг - Нерекомендуемые синхронные вызовы - Преобразовать вызов

 

После преобразования нерекомендуемого синхронного вызова получаем ошибку: "Вызов преобразован не полностью. Присвоение cсылочного параметра: Отказ".

 

&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)

    Если
Модифицированность Тогда
       
ПоказатьВопрос(Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтаФорма), "Данные были изменены. Закрыть форму без сохранения?", РежимДиалогаВопрос.ДаНет);
        ВызватьИсключение
"Вызов преобразован не полностью";//Присвоение cсылочного параметра: Отказ
   
КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытиемЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

    Если
РезультатВопроса <> КодВозвратаДиалога.Да Тогда
       
Отказ = Истина;
    КонецЕсли;

КонецПроцедуры

 

И действительно присвоение "Отказ = Истина" происходит уже после того, как отработал обработчик ПередЗакрытием. А параметр Отказ нужно установить непосредственно в обработчике.

Предлагаю следующий скособ решения данной задачи. 

Изначально установим Отказ = Истина и зададим пользователю вопрос. Если пользователь согласится, то вызовем обработчик еще раз, но в этот раз не будем задавать вопрос (об этом нам скажет переменна ЗакрытьБезВопроса).

 

&НаКлиенте
Перем ЗакрытьБезВопроса;

&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытиемЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

    Если
РезультатВопроса = КодВозвратаДиалога.Да Тогда
       
ЗакрытьБезВопроса = Истина;
       
Закрыть();
    КонецЕсли;

КонецПроцедуры

ЗакрытьБезВопроса = Ложь;

Тэги 

1С 8.3

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Строки и абзацы переносятся автоматически.
CAPTCHA
Вы человек или автоматическая спам-рассылка?
Target Image