Часто в процессе разработки прикладных решений на платформе 1С возникает необходимость запускать внешние исполняемые файлы (.exe, скрипты, bat-файлы) с повышенными привилегиями. Стандартная команда КомандаСистемы вызывает диалоговое окно для ввода пароля, что является неудобным для автоматизированных процессов. Давайте разберем, как решить эту задачу и как сопоставить пользователя Windows с учетной записью 1С.
Наиболее эффективным и простым способом выполнения команды с правами администратора без необходимости ввода пароля вручную является использование PowerShell. Платформа 1С позволяет передать команду в системную оболочку, которая выполнит повышение прав через механизм Verb Runas.
Для запуска программы используем следующий подход:
Команда = "powershell Start-Process Notepad.exe -ArgumentList ""d:\1.txt"" -Verb Runas";
КомандаСистемы(Команда);
Разберем параметры команды подробнее:
Start-Process — командлет PowerShell для запуска процессов.-ArgumentList — здесь мы указываем аргументы, которые нужно передать вызываемому приложению. Если аргументов несколько, их можно передать одной строкой через пробел или массив.-Verb Runas — ключевой аргумент, который принудительно запрашивает повышение прав до уровня администратора.Если вам нужно запустить приложение с параметрами (например, для терминального клиента), используйте тильду или корректное экранирование кавычек в строке аргументов.
Если задача требует регулярного выполнения скриптов с правами системы (например, выгрузка базы .dt), надежнее всего использовать планировщик задач Windows. В 1С мы можем лишь инициировать запуск уже настроенного задания.
Рассмотрим порядок действий:
SYSTEM.schtasks /run /tn "ИмяВашегоЗадания".Это полностью исключает проблему с вводом пароля, так как права уже делегированы заданию на уровне ОС.
Вопрос идентификации текущего пользователя Windows внутри сеанса 1С является частой архитектурной задачей. Стандартной прямой привязки между ними нет, если не используется авторизация средствами ОС. Рассмотрим способы решения:
Чтобы узнать, кто работает в системе, можно воспользоваться простым вызовом PowerShell внутри 1С:
// Получение имени пользователя через WMI/PowerShell
ОбъектWMI = ПолучитьCOMОбъект("winmgmts:");
Запрос = "SELECT * FROM Win32_Process WHERE ProcessId = " + ПолучитьIDТекущегоПроцесса();
// Или проще:
Команда = "powershell [System.Security.Principal.WindowsIdentity]::GetCurrent().Name";
Поскольку один пользователь ОС может заходить в базу под разными именами (например, в терминале), самым надежным способом является создание Регистра Сведений «СоответствиеПользователейОС». Разберем алгоритм его наполнения:
ПриНачалеРаботыСистемы получайте имя текущего пользователя Windows.ИмяПользователяОС.Этот подход позволяет избежать обращений к сложным и «тяжелым» объектам, таким как ЖурналРегистрации или СоединенияИнформационнойБазы, что положительно сказывается на производительности всей системы.
Мы выяснили, что для повышения прав лучше всего подходит использование PowerShell с параметром -Verb Runas для разовых задач или schtasks для регламентных действий. Для ведения учета связки пользователей рекомендуем использовать Регистр сведений, так как это единственный архитектурно верный путь, позволяющий хранить бизнес-логику привязки сотрудников к их системным именам.