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