Как выполнить скрипт или команду при запуске 1С в зависимости от роли пользователя?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке и сопровождении конфигураций часто возникает задача автоматического выполнения определенных действий при входе пользователя в программу. Например, требуется свернуть панель разделов, применить индивидуальные настройки рабочего стола, инициализировать внешнее оборудование или запустить вспомогательный скрипт. При этом действие должно отрабатывать не у всех подряд, а только у пользователей с определенной ролью (например, МенеджерПоПродажам или Кладовщик).

Разберем подробно, как правильно реализовать подобное поведение в 1С:Предприятии 8.3, почему часто возникают ошибки с контекстом выполнения («клиент-сервер») и какие штатные альтернативы существуют вместо прямой эмуляции нажатия клавиш через Windows Script Host.

Анализ проблемы: контекст выполнения и проверка доступности ролей

Рассмотрим типовые ошибки, с которыми сталкиваются разработчики при попытке запустить клиентский скрипт при старте:

  1. Попытка вызова клиентского COM-объекта на сервере. Объект WScript.Shell и метод SendKeys работают исключительно в операционной системе клиентского рабочего места. Если вызвать создание этого объекта в общем модуле с признаком Вызов сервера или на стороне сервера приложений, код либо выдаст ошибку отсутствия COM-объекта, либо отработает в изолированном фоновом сеансе службы сервера без какого-либо графического интерфейса.
  2. Лишние серверные вызовы. Функция проверки роли РольДоступна() является встроенной функцией языка 1С и доступна как на сервере, так и на тонком клиенте. Создавать отдельную серверную функцию исключительно ради проверки роли нет необходимости.
  3. Тайминги инициализации интерфейса. При вызове события ПриНачалеРаботыСистемы главное окно программы еще может находиться в процессе построения и не иметь активного фокуса ввода. Из-за этого отправленные нажатия клавиш SendKeys могут уходить «в никуда».

Способ 1. Использование расширения конфигурации и обработчика ожидания (с использованием скрипта)

Если для решения задачи требуется выполнить именно эмуляцию горячих клавиш (например, свернуть панель разделов сочетанием клавиш), наиболее грамотным подходом будет подключение логики через расширение конфигурации. Это позволяет сохранить типовую конфигурацию на полной поддержке.

Разберем по шагам реализацию через расширение:

  1. Создаем новое расширение конфигурации.
  2. Добавляем в расширение модуль управляемого приложения и перехватываем событие ПриНачалеРаботыСистемы с помощью аннотации &После.
  3. Проверяем роль пользователя прямо в клиентском контексте.
  4. Запускаем эмуляцию с минимальной задержкой через однократный обработчик ожидания, чтобы окно интерфейса успело полностью отрисоваться и получить фокус.

Посмотрим на пример реализации в модуле управляемого приложения расширения:


&После("ПриНачалеРаботыСистемы")
Процедура Расш1_ПриНачалеРаботыСистемы()
    
    // Проверяем доступность роли непосредственно на клиенте
    Если РольДоступна("МенеджерПоПродажам") Тогда
        // Подключаем однократный обработчик ожидания на 0.2 секунды
        ПодключитьОбработчикОжидания("Расш1_СвернутьПанельРазделов", 0.2, Истина);
    КонецЕсли;
    
КонецПроцедуры

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

Способ 2. Штатное программное управление панелями интерфейса 1С

Использование эмуляции нажатия клавиш через WScript.Shell имеет существенные недостатки: решение привязано к ОС Windows, не работает в веб-клиенте и может давать сбои в зависимости от текущей раскладки клавиатуры. Платформа 1С:Предприятие 8.3 предоставляет встроенные механизмы управления интерфейсом.

Проанализируем программную настройку интерфейса клиентского приложения. Мы можем переопределить состав панелей для пользователя на лету при старте системы:


&После("ПриНачалеРаботыСистемы")
Процедура Расш1_НастроитьПанелиПриНачалеРаботы()
    
    Если РольДоступна("МенеджерПоПродажам") Тогда
        
        НастройкиИнтерфейса = ПолучитьНастройкиИнтерфейсаКлиентскогоПриложения();
        СоставПанелей = НастройкиИнтерфейса.ПолучитьСостав();
        
        // Очищаем область, где расположена панель разделов (например, левая или верхняя)
        // Либо переопределяем состав отображаемых панелей
        СоставПанелей.Лево.Очистить();
        
        НастройкиИнтерфейса.УстановитьСостав(СоставПанелей);
        УстановитьНастройкиИнтерфейсаКлиентскогоПриложения(НастройкиИнтерфейса);
        
        // Применяем изменения в текущем сеансе
        ОбновитьИнтерфейс();
        
    КонецЕсли;
    
КонецПроцедуры

Способ 3. Административная настройка и копирование настроек интерфейса

Если задача заключается исключительно во внешнем виде программы для конкретных пользователей, разберем решение без написания программного кода, используя типовой функционал Библиотеки Стандартных Подсистем (БСП):

  1. Администратор входит в систему и открывает Главное меню → Настройки → Настройка панелей.
  2. Панель разделов перетаскивается в область скрытых панелей или компонуется удобным образом.
  3. Далее администратор открывает раздел Администрирование → Настройки пользователей и прав → Персональные настройки пользователей → Копирование настроек.
  4. Выбирается исходный пользователь (с настроенным интерфейсом), отмечается пункт Командный интерфейс и панели, а в качестве получателей указываются все пользователи с ролью «Менеджер» или соответствующая группа доступа.

Такой подход гарантирует стабильность отображения без необходимости вмешательства в программный код и использования системных скриптов.

← На главную