Как разблокировать меню программы и предотвратить перекрытие окон сообщений в 1С 8.3

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

В процессе разработки внешних обработок и кастомных форм в системе 1С:Предприятие 8.3 программисты нередко сталкиваются с ситуацией, когда при открытии новой формы блокируется главное меню программы (пункты «Файл», «Правка», «Сервис» и др.), а также другие открытые окна. Дополнительно возникает сопутствующая проблема: системное окно «Служебные сообщения» оказывается перекрытым новой активной формой, из-за чего пользователь просто не видит важную информацию и предупреждения, выводимые через команду Сообщить.

В этой статье мы подробно разберем причины возникновения обеих проблем и рассмотрим современные, правильные с точки зрения стандартов разработки 1С методы их решения.

Выясняем причину блокировки меню программы: влияние модальности

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

В современных конфигурациях на платформе 1С:Предприятие 8.3 использование классической модальности считается устаревшим подходом (deprecated) и крайне не рекомендуется по следующим причинам:

  1. Веб-клиент и мобильные платформы: Модальные окна физически не поддерживаются веб-браузерами (они распознаются как всплывающие окна и блокируются встроенными системами безопасности ПК) и мобильными операционными системами.
  2. Блокировка интерфейса: Пользователь теряет возможность скопировать данные из другого окна, посмотреть отчет или воспользоваться калькулятором в меню программы, пока открыто модальное окно.
  3. Отказ от модальности в свойствах конфигурации: В большинстве современных решений (например, на базе БСП) в свойствах конфигурации параметр «Режим использования модальности» установлен в значение «Не использовать». При попытке вызвать модальное окно система выдаст критическую ошибку выполнения.

Регулируем доступ к меню: настройка режимов открытия окон

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

Давайте разберем по шагам, как настроить поведение открывающегося окна с помощью системного перечисления РежимОткрытияОкнаФормы. Данное перечисление имеет три основных значения:

  1. Независимый: Форма открывается как абсолютно свободное, независимое окно или в виде новой вкладки на панели разделов. Пользователь сохраняет полный доступ к главному меню 1С, панелям инструментов и любым другим открытым окнам системы.
  2. Блокировать окно владельца: Открываемая форма блокирует исключительно ту форму, из которой она была вызвана (родительское окно). При этом доступ к главному меню программы («Файл», «Правка» и т. д.), а также к другим открытым в данный момент окнам и отчетам полностью сохраняется. Это наиболее сбалансированный и рекомендуемый вариант для большинства задач.
  3. Блокировать весь интерфейс: Это аналог старого модального режима. Окно блокирует работу всей программы, включая главное меню. Использовать данный режим следует только в исключительных случаях, когда дальнейшая работа с системой невозможна без принятия решения в этой форме.

Рассмотрим пример кода, в котором мы открываем вторую форму нашей обработки с блокировкой только окна-владельца, сохраняя доступ к меню программы:


ПараметрыФормы = Новый Структура;
// Передаем параметры, если это необходимо
ПараметрыФормы.Вставить("КлючНазначения", "УникальныйИдентификаторФормы");

// Открываем форму асинхронно с блокировкой только родительского окна
ОткрытьФорму(
    "ВнешняяОбработка.МояВнешняяОбработка.Форма.ВтораяФорма", 
    ПараметрыФормы, 
    ЭтотОбъект, // Владелец формы (текущая форма)
    Истина,     // Уникальность окна
    ,           // Окно (не заполняется)
    ,           // Навигационная ссылка
    ,           // Описание оповещения при закрытии
    РежимОткрытияОкнаФормы.БлокироватьОкноВладельца // Ключевой параметр блокировки
);

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

Решаем проблему перекрытия окон и скрытых сообщений

Вторая проблема, описанная автором темы: когда открыта вторая форма, стандартное окно «Служебные сообщения» может быть перекрыто этой формой, и пользователь вовремя не увидит важный текст, выведенный старым методом Сообщить.

Для гарантированной доставки информации пользователю в управляемом приложении 1С 8.3 разработан объект СообщениеПользователю. В отличие от обычной процедуры Сообщить, данный объект позволяет осуществлять точечную адресацию выводимой информации.

Проанализируем основные преимущества использования объекта СообщениеПользователю:

  1. Привязка к реквизитам формы: Мы можем связать сообщение с конкретным элементом управления (например, полем ввода номера, даты или контрагента). В этом случае сообщение отобразится в виде всплывающего красного облака непосредственно рядом с полем на активной форме. Такое сообщение физически невозможно перекрыть другими окнами.
  2. Адресация на активную форму: С помощью свойства ИдентификаторНазначения мы можем явно указать платформе, на какой именно форме (даже если она открыта поверх остальных) необходимо вывести список сообщений.

Рассмотрим пример практической реализации вывода сообщений с привязкой к реквизиту формы на примере проверки заполнения поля:


// Создаем объект сообщения
Сообщение = Новый СообщениеПользователю;

// Указываем текст сообщения для пользователя
Сообщение.Текст = "Поле 'Склад назначения' должно быть обязательно заполнено!";

// Привязываем сообщение к конкретному реквизиту на форме
Сообщение.Поле = "Объект.СкладНазначения";
Сообщение.ПутьКДанным = "Объект";

// Выводим сообщение на экран
Сообщение.Сообщить();

При выполнении этого кода платформа автоматически найдет на активной форме элемент, связанный с реквизитом Объект.СкладНазначения, подсветит его красной рамкой и выведет текст сообщения прямо под ним, что гарантирует мгновенную реакцию пользователя.

Использование неблокирующих оповещений

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

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

Давайте посмотрим на пример реализации всплывающего оповещения:


ТекстОповещения = "Загружено 150 новых контрагентов.";
СсылкаНаОбъект = Справочники.Контрагенты.ПустаяСсылка(); // Можно передать ссылку для быстрого перехода

ПоказатьОповещениеПользователя(
    "Обработка данных завершена", // Заголовок всплывающего окна
    СсылкаНаОбъект,               // Навигационная ссылка при клике на окно
    ТекстОповещения,              // Текст сообщения
    БиблиотекаКартинок.Информация  // Иконка оповещения
);

Этот способ полностью решает проблему «потерянных» или перекрытых сообщений, делая интерфейс вашей внешней обработки современным, понятным и удобным для конечного пользователя.

← На главную