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