Передача описания оповещения

notify
Режим отказа от модальности в 1С, помимо очевидных преимуществ в виде поддержки веб-клиента, нередко усложняет тривиальные ранее действия. Одной из таких задач является проверка записи (и вопрос пользователю только в случае отрицательного результата проверки) — с последующим выполнением действием над объектом. Рассмотрим её решение через такой механизм, как передача описания оповещения в метод и использование конструкции ВыполнитьОбработкуОповещения().
Итак, у нас есть некий объект конфигурации (например, справочник). Выполнять действия над ним в форме стоит только тогда, когда есть уверенность, что объект записан в базу. Если же это не так — мы спросим пользователя, согласен ли он записать объект, а после продолжим исполнение. Важно, что в случае успешной проверки, работа не должна прерываться.

DoWrite
Второй предпосылкой является множественность подобных обработчиков, и хотелось бы саму проверку «завернуть» в булеву функцию.

Что-то вроде

Идея состоит в том, чтобы вызывать метод проверки, передавая ему нужный callback, в котором уже размещён специфический алгоритм для данной ситуации.

Для начала, опишем наш алгоритм в виде callback-завершения оповещения:

Использоваться он будет из основной команды МояКоманда. Команда содержит описание оповещения, в котором указана ссылка на наш алгоритм, и которое будет передано в качестве параметра нашей универсальной функции проверки записи:

Функция задаёт вопрос пользователю, если объект не записан (т.е. его форма имеет флаг модифицированности):

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

Остаётся лишь решить, что делать с самим объектом в зависимости от ответа пользователя:

Таким образом, мы получаем универсальную функцию ЗаписатьСПроверкой(), которая проверит запись объекта, задаст вопрос пользователю о согласии с записью, а после вызовет исполнение некоего алгоритма.

Проиллюстрирую вышесказанное на схеме:

PS. Спасибо Даниле за идею.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *