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