При разработке конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача: сделать так, чтобы при входе пользователя в систему перед ним сразу открывалась определенная форма (например, «Рабочее место менеджера» или «Панель мониторинга»), и открывалась она не в отдельном модальном или независимом окне, а именно в основной рабочей области, замещая собой стандартную начальную страницу. Рассмотрим подробнее, как это реализовать, проанализируем различные подходы и разберем типичные ошибки.
Это наиболее правильный и «нативный» способ с точки зрения архитектуры платформы. Если нам нужно, чтобы форма была доступна пользователю всегда при старте, нам не обязательно писать код в обработчиках ожидания или модулях приложения. Мы можем воспользоваться встроенным конструктором интерфейса.
Разберем по шагам, как это сделать:
Этот метод хорош тем, что платформа сама оптимизирует отрисовку интерфейса, и форма гарантированно впишется в рабочую область без лишних рамок и заголовков.
Иногда требуется более гибкая логика. Например, решение о том, какую форму открыть, принимается на основе сложных условий, которые нельзя описать простым набором ролей. В этом случае мы используем обработчик ПриНачалеРаботыСистемы.
Проанализируем ситуацию: пользователь из сообщения №4 жаловался, что форма открывается в отдельном окне. Это происходит потому, что по умолчанию метод ОткрытьФорму создает новое окно, если не указаны специфические параметры владельца или режима открытия.
Рассмотрим пример кода, который позволяет обойти это ограничение, используя обращение к активному окну системы:
Процедура ПриНачалеРаботыСистемы()
// Проверим наличие прав или иное условие
Если РольДоступна("ПолныеПрава") Тогда
Попытка
// Чтобы форма открылась именно в рабочей области,
// в качестве владельца можно попробовать передать основное окно.
// Однако в новых версиях платформы лучше управлять параметрами открытия.
ПараметрыФормы = Новый Структура;
// Здесь можно заполнить параметры, если форма их ожидает
// Вариант с явным указанием окна (из сообщения №16)
МассивОкон = ПолучитьОкна();
Если МассивОкон.Количество() > 0 Тогда
ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаУпр", ПараметрыФормы, , , МассивОкон[0]);
Иначе
ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаУпр", ПараметрыФормы);
КонецЕсли;
Исключение
// Обработка ошибки, если форма не найдена или нет прав
ЗаписьЖурналаРегистрации("ОткрытиеФормыПриСтарте", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Нужно учитывать, что в интерфейсе «Такси» использование ПолучитьОкна()[0] может вести себя нестабильно, так как в момент выполнения ПриНачалеРаботыСистемы главное окно может быть еще не до конца инициализировано. В таких случаях рекомендуется использовать небольшую задержку через ПодключитьОбработчикОжидания.
В сообщении №19 возник вопрос: как открыть внешнюю обработку, если стандартные методы Справочники и ВнешниеОбработки недоступны напрямую на клиенте в процедуре ПриНачалеРаботыСистемы? Выясним причину: это клиентский контекст, и обращение к серверным данным напрямую запрещено.
Для реализации этой задачи нам потребуется создать серверный общий модуль (например, СерверныеФункцииПриложения) с флагом «Вызов сервера». Разберем алгоритм по шагам:
Шаг 1. Серверная функция для получения адреса обработки:
Функция ПолучитьАдресВнешнейОбработки(ИмяОбработки) Экспорт
ОбъектСправочника = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ИмяОбработки);
Если ОбъектСправочника.Пустая() Тогда
Возврат Неопределено;
КонецЕсли;
// Помещаем двоичные данные во временное хранилище
Адрес = ПоместитьВоВременноеХранилище(ОбъектСправочника.ХранилищеОбработки.Получить());
Возврат Адрес;
КонецФункции
Шаг 2. Клиентский код в модуле управляемого приложения:
Процедура ПриНачалеРаботыСистемы()
АдресХранилища = СерверныеФункцииПриложения.ПолучитьАдресВнешнейОбработки("МояВнешняяОбработка");
Если АдресХранилища <> Неопределено Тогда
// Подключаем внешнюю обработку
ИмяОбработки = ВнешниеОбработки.Подключить(АдресХранилища, , Ложь);
// Теперь открываем её форму
ПолноеИмяФормы = "ВнешняяОбработка." + ИмяОбработки + ".Форма.Форма";
ОткрытьФорму(ПолноеИмяФормы);
КонецЕсли;
КонецПроцедуры
Если ваша конфигурация использует Библиотеку стандартных подсистем (БСП), крайне не рекомендуется вносить изменения напрямую в модуль управляемого приложения. Проанализируем правильный подход:
ИнтеграцияПодсистемБСПКлиент или аналогичный (в зависимости от версии БСП), где определены процедуры-события.ПослеЗаполненияПараметровРаботыСистемы. В этот момент интерфейс уже готов к взаимодействию, и ОткрытьФорму отработает корректно.После для процедуры ПриНачалеРаботыСистемы. Это позволит сохранить основную конфигурацию на поддержке и обеспечит чистоту кода.Резюмируя вышесказанное: для статического отображения формы лучше всего подходит настройка «Рабочей области начальной страницы» в конфигураторе. Для динамического открытия — программный вызов ОткрытьФорму, но с обязательным учетом контекста (клиент/сервер) и использованием механизмов БСП для обеспечения стабильности интерфейса «Такси».