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