Как обработать деактивацию управляемой формы в 1С и предотвратить потерю данных?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейса в платформе 1С:Предприятие на управляемых формах часто возникает задача: если пользователь изменил данные в одном окне (например, в форме заказа) и пытается переключиться на другую открытую форму (документ или справочник), необходимо предупредить его о наличии несохраненных изменений и предложить сохранить данные.

Рассмотрим ограничения платформы 1С и проанализируем доступные архитектурные способы решения этой задачи.

Ограничения платформы: почему нет события деактивации?

Проанализируем работу платформы 1С:Предприятие с управляемыми окнами. В управляемом интерфейсе отсутствует встроенное событие потери фокуса или деактивации формы (события вида ПриДеактивации или ПриПотереФокуса не предусмотрены).

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

Поэтому перехватить простой клик мышью по вкладке другой формы нативно нельзя. Однако мы можем обойти это ограничение несколькими проверенными способами.

Способ 1. Использование режима блокировки окна владельца

Если подчиненная форма (например, «Заказ») открывается из основной формы («Документ» или «Направления»), наиболее простым и надежным решением является изменение режима открытия окна подчиненной формы.

Разберем по шагам, как это настроить:

  1. При вызове формы заказа укажем параметр режима открытия окна РежимОткрытияОкнаФормы.БлокироватьОкноВладельца.
  2. В этом режиме пользователь физически не сможет кликнуть по форме-владельцу и перейти на нее, пока окно заказа открыто.
  3. Для сохранения или отмены изменений пользователь будет вынужден закрыть форму заказа. При закрытии автоматически сработает стандартный механизм проверки свойства Модифицированность или событие ПередЗакрытием, где можно задать вопрос о сохранении.

Пример кода открытия формы с блокировкой окна владельца:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", СсылкаНаЗаказ);

ПараметрыОткрытия = Новый Структура;
РежимОткрытия = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;

ОткрытьФорму("Документ.ЗаказПокупателя.Форма.ФормаДокумента", ПараметрыФормы, ВладелецФормы, Истина, , , , РежимОткрытия);

Способ 2. Объединение интерфейса в одну форму с использованием страниц

Если бизнес-процесс предполагает постоянное переключение между тремя сущностями (Документ, Заказ, Направления), удобнее отказаться от трех независимых окон и объединить их в одну управляемую форму.

Рассмотрим подробнее реализацию этого подхода:

  1. Разместим на форме элемент типа Страницы (панель вкладок).
  2. На каждую страницу вынесем данные соответствующего раздела (Документ, Заказ, Направления).
  3. Для элемента «Страницы» назначим обработчик события ПриСменеСтраницы.
  4. В обработчике проверим свойство Модифицированность или признак изменения реквизитов текущей вкладки. Если данные были изменены, выведем вопрос пользователю. При необходимости переход на другую страницу можно заблокировать, установив параметр Отказ = Истина.

Пример кода обработчика смены страницы:


&НаКлиенте
Процедура СтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
    Если Модифицированность Тогда
        // Задаем вопрос пользователю перед переходом
        // В случае отказа от перехода или отмены действия:
        // Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Способ 3. Переход через команды и событие ПриПовторномОткрытии

Если переключение между формами выполняется не через стандартную панель вкладок 1С, а с помощью кнопок на форме, мы можем полностью проконтролировать процесс перехода.

  1. В обработчике нажатия кнопки перехода сначала проверяем свойство формы Модифицированность.
  2. Если форму изменяли, вызываем диалог с вопросом «Данные изменены. Сохранить?».
  3. После решения вопроса с данными вызываем процедуру ОткрытьФорму() для перехода к нужному документу.
  4. Если целевая форма уже открыта, платформа активизирует её и вызовет в ней событие ПриПовторномОткрытии, где также можно обновить отображаемые данные.

Важные технические нюансы

Выясним несколько деталей, которые помогут избежать ошибок при проверке изменений:

← На главную