При разработке и сопровождении конфигураций часто возникает задача автоматического выполнения определенных действий при входе пользователя в программу. Например, требуется свернуть панель разделов, применить индивидуальные настройки рабочего стола, инициализировать внешнее оборудование или запустить вспомогательный скрипт. При этом действие должно отрабатывать не у всех подряд, а только у пользователей с определенной ролью (например, МенеджерПоПродажам или Кладовщик).
Разберем подробно, как правильно реализовать подобное поведение в 1С:Предприятии 8.3, почему часто возникают ошибки с контекстом выполнения («клиент-сервер») и какие штатные альтернативы существуют вместо прямой эмуляции нажатия клавиш через Windows Script Host.
Рассмотрим типовые ошибки, с которыми сталкиваются разработчики при попытке запустить клиентский скрипт при старте:
WScript.Shell и метод SendKeys работают исключительно в операционной системе клиентского рабочего места. Если вызвать создание этого объекта в общем модуле с признаком Вызов сервера или на стороне сервера приложений, код либо выдаст ошибку отсутствия COM-объекта, либо отработает в изолированном фоновом сеансе службы сервера без какого-либо графического интерфейса.РольДоступна() является встроенной функцией языка 1С и доступна как на сервере, так и на тонком клиенте. Создавать отдельную серверную функцию исключительно ради проверки роли нет необходимости.ПриНачалеРаботыСистемы главное окно программы еще может находиться в процессе построения и не иметь активного фокуса ввода. Из-за этого отправленные нажатия клавиш SendKeys могут уходить «в никуда».Если для решения задачи требуется выполнить именно эмуляцию горячих клавиш (например, свернуть панель разделов сочетанием клавиш), наиболее грамотным подходом будет подключение логики через расширение конфигурации. Это позволяет сохранить типовую конфигурацию на полной поддержке.
Разберем по шагам реализацию через расширение:
ПриНачалеРаботыСистемы с помощью аннотации &После.Посмотрим на пример реализации в модуле управляемого приложения расширения:
&После("ПриНачалеРаботыСистемы")
Процедура Расш1_ПриНачалеРаботыСистемы()
// Проверяем доступность роли непосредственно на клиенте
Если РольДоступна("МенеджерПоПродажам") Тогда
// Подключаем однократный обработчик ожидания на 0.2 секунды
ПодключитьОбработчикОжидания("Расш1_СвернутьПанельРазделов", 0.2, Истина);
КонецЕсли;
КонецПроцедуры
Процедура Расш1_СвернутьПанельРазделов() Экспорт
#Если Клиент И Не ВебКлиент Тогда
Попытка
WshShell = Новый COMОбъект("WScript.Shell");
// В синтаксисе WScript.Shell тильда экранируется фигурными скобками
WshShell.SendKeys("^+{~}");
Исключение
// Перехват исключения на случай работы в среде без поддержки Windows Script Host
ЗаписьЖурналаРегистрации("СворачиваниеПанели", УровеньЖурналаРегистрации.Предупреждение,,, ОписаниеОшибки());
КонецПопытки;
#КонецЕсли
КонецПроцедуры
Использование эмуляции нажатия клавиш через WScript.Shell имеет существенные недостатки: решение привязано к ОС Windows, не работает в веб-клиенте и может давать сбои в зависимости от текущей раскладки клавиатуры. Платформа 1С:Предприятие 8.3 предоставляет встроенные механизмы управления интерфейсом.
Проанализируем программную настройку интерфейса клиентского приложения. Мы можем переопределить состав панелей для пользователя на лету при старте системы:
&После("ПриНачалеРаботыСистемы")
Процедура Расш1_НастроитьПанелиПриНачалеРаботы()
Если РольДоступна("МенеджерПоПродажам") Тогда
НастройкиИнтерфейса = ПолучитьНастройкиИнтерфейсаКлиентскогоПриложения();
СоставПанелей = НастройкиИнтерфейса.ПолучитьСостав();
// Очищаем область, где расположена панель разделов (например, левая или верхняя)
// Либо переопределяем состав отображаемых панелей
СоставПанелей.Лево.Очистить();
НастройкиИнтерфейса.УстановитьСостав(СоставПанелей);
УстановитьНастройкиИнтерфейсаКлиентскогоПриложения(НастройкиИнтерфейса);
// Применяем изменения в текущем сеансе
ОбновитьИнтерфейс();
КонецЕсли;
КонецПроцедуры
Если задача заключается исключительно во внешнем виде программы для конкретных пользователей, разберем решение без написания программного кода, используя типовой функционал Библиотеки Стандартных Подсистем (БСП):
Такой подход гарантирует стабильность отображения без необходимости вмешательства в программный код и использования системных скриптов.