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