Передача описания оповещения
ВыполнитьОбработкуОповещения().
Что-то вроде
Если ПроверитьИЗаписатьОбъект() Тогда КонецЕсли;
Идея состоит в том, чтобы вызывать метод проверки, передавая ему нужный callback, в котором уже размещён специфический алгоритм для данной ситуации.
Для начала, опишем наш алгоритм в виде callback-завершения оповещения:
&НаКлиенте
Процедура МояКоманда_Завершение(Результат, ДополнительныеПараметры) Экспорт
Если ОбработатьРезультатЗапись(Результат) Тогда
ОткрытьФорму("Справочник.Номенклатура.Форма", Новый Структура("МойПараметр", Истина));
Иначе
// Не требуется выполнения действий.
КонецЕсли;
КонецПроцедуры
Использоваться он будет из основной команды МояКоманда. Команда содержит описание оповещения, в котором указана ссылка на наш алгоритм, и которое будет передано в качестве параметра нашей универсальной функции проверки записи:
&НаКлиенте
Процедура МояКоманда(Команда)
ОписаниеОповещениеЗапись = Новый ОписаниеОповещения("МояКоманда_Завершение", ЭтотОбъект);
ЗаписатьСПроверкой(ОписаниеОповещениеЗапись);
КонецПроцедуры
Функция задаёт вопрос пользователю, если объект не записан (т.е. его форма имеет флаг модифицированности):
// Проверяет форму на модифицированность. В случае модифицированности
// предлагает перезаписать объект. После чего выполняет обработчик
// из описания ОписаниеВход.
&НаКлиенте
Процедура ЗаписатьСПроверкой(ОписаниеВход)
Если Параметры.Ключ.Пустая() ИЛИ Модифицированность Тогда
ТекстВопроса = НСтр("ru = 'Объект еще не записан. Записать?'");
ПоказатьВопрос(ОписаниеВход, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 30);
Иначе
ВыполнитьОбработкуОповещения(ОписаниеВход, Неопределено);
КонецЕсли;
КонецПроцедуры
Здесь самым интересным является метод ВыполнитьОбработкуОповещения(). Он позволяет вызвать callback-метод, содержащийся в описании оповещения, из произвольного места кода. В нашем случае это требуется, чтобы исполнить алгоритм в случае, когда объект не был модифицирован, и вопрос пользователю задавать не нужно (т.к. дополнительной записи объекта не происходит).
// Выполняет перезапись в зависимости от результата выбора пользователя
// РезультатВход. Возвращает флаг возможности выполнения дальнейших операций.
&НаКлиенте
Функция ОбработатьРезультатЗапись(РезультатВход)
РезультатФункции = Истина;
Если РезультатВход = КодВозвратаДиалога.Да Тогда
Записать();
РезультатФункции = Истина;
ИначеЕсли РезультатВход = КодВозвратаДиалога.Нет Тогда
РезультатФункции = Ложь; // Пользователь отказался от выполнения.
ИначеЕсли РезультатВход = Неопределено Тогда
РезультатФункции = Истина; // Непосредственный вызов. Выполняем далее без перезаписи.
Иначе
ТекстСообщения = НСтр("ru = 'Выбрано неизвестное значение: %ВыбранноеЗначение%. Операция отменена.'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ВыбранноеЗначение%", Строка(РезультатВход));
ОбщегоНазначенияУХ.СообщитьОбОшибке(ТекстСообщения);
РезультатФункции = Ложь; // Т.к. возникла ошибка.
КонецЕсли;
Возврат РезультатФункции;
КонецФункции
Таким образом, мы получаем универсальную функцию ЗаписатьСПроверкой(), которая проверит запись объекта, задаст вопрос пользователю о согласии с записью, а после вызовет исполнение некоего алгоритма.
Проиллюстрирую вышесказанное на схеме:
PS. Спасибо Даниле за идею.










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