В современной практике системного администрирования и автоматизации бизнес-процессов часто возникает необходимость тесной интеграции 1С с инструментами операционной системы. Одной из наиболее частых задач является взаимодействие с Active Directory (AD). PowerShell предоставляет мощнейший инструментарий для этого, но перед разработчиком 1С встает вопрос: как правильно вызвать скрипт, передать в него параметры и корректно получить результат? В этой статье мы подробно разберем все способы реализации этой задачи, от простых команд до продвинутых методов работы с потоками данных.
Самый простой и рекомендуемый платформой 1С способ — это использование встроенной функции ЗапуститьПриложение. Она позволяет выполнить внешнюю программу, передать ей аргументы и, что немаловажно, дождаться завершения её работы. Проанализируем синтаксис этой команды:
Команда = "powershell -ExecutionPolicy Bypass -File ""C:\Scripts\GetADUsers.ps1""";
ЗапуститьПриложение(Команда, , Истина, КодВозврата);
Разберем важные параметры, которые мы использовали в примере:
Bypass позволяет временно игнорировать эти ограничения только для текущего сеанса запуска, не меняя глобальные настройки безопасности сервера.Если вам требуется более тонкая настройка окна выполнения или вы работаете в специфическом окружении, можно воспользоваться объектом WScript.Shell. Рассмотрим, как это реализовать в коде 1С:
Шелл = Новый COMОбъект("WScript.Shell");
ТекстСкрипта = "powershell -Command ""& {Get-ADUser -Filter * | Export-Csv 'C:\Temp\users.csv'}""";
// 0 - скрыть окно, Истина - ждать завершения
Шелл.Run(ТекстСкрипта, 0, Истина);
В данном случае мы используем метод Run. Обратите внимание на первый параметр в строке команды — powershell -Command. Если вы просто передадите путь к файлу .ps1 без указания оболочки, система может открыть его в текстовом редакторе вместо выполнения.
Часто разработчики выгружают данные из PowerShell в CSV-файл, а затем читают его в 1С. Но существует более изящный способ — чтение потока вывода (StdOut) напрямую. Для этого используется метод Exec объекта WScript.Shell.
Выясним, как прочитать результат работы скрипта прямо в переменную:
Шелл = Новый COMОбъект("WScript.Shell");
Процесс = Шелл.Exec("powershell -ExecutionPolicy Bypass -Command ""Get-ADUser -Identity 'Ivanov' | Select-Object -ExpandProperty DisplayName""");
Результат = "";
Пока НЕ Процесс.StdOut.AtEndOfStream Цикл
Результат = Результат + Процесс.StdOut.ReadLine();
КонецЦикла;
Сообщить("ФИО пользователя из AD: " + Результат);
Этот метод избавляет нас от необходимости создавать, контролировать права доступа и удалять временные файлы на диске сервера.
Проанализируем ситуацию, с которой часто сталкиваются администраторы: сервер 1С работает как 32-битное приложение, а модули Active Directory установлены в 64-битной системе. Если запустить просто powershell.exe из 32-битной 1С, вы попадете в 32-битную среду PowerShell (x86), где модуль ActiveDirectory может быть недоступен.
Чтобы гарантированно вызвать 64-битный PowerShell из 32-битной 1С, используйте специальный путь SysNative:
C:\Windows\SysNative\WindowsPowerShell\v1.0\powershell.exe
Если вам нужно передать из PowerShell в 1С не одну строку, а сложную структуру (например, список пользователей с телефонами и почтой), лучше всего использовать формат JSON. Посмотрим на пример кода в PowerShell:
$users = Get-ADUser -Filter 'Enabled -eq $true' -Properties EmailAddress | Select-Object Name, EmailAddress
$users | ConvertTo-Json -Compress
В 1С мы принимаем эту строку (через файл или StdOut) и мгновенно превращаем её в массив структур:
// Предположим, переменная СтрокаJSON получена из PS
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
ДанныеИзAD = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
При выгрузке данных из AD (имена, должности на русском языке) вы можете столкнуться с проблемой «кракозябр». PowerShell 5.1 по умолчанию часто использует кодировку UTF-16 или системную ANSI. Для корректной работы с 1С рекомендуем принудительно устанавливать кодировку UTF-8 в самом скрипте при выводе данных:
$OutputEncoding = [System.Text.Encoding]::UTF8;
// Либо при экспорте в файл
Export-Csv -Path "C:\data.csv" -Encoding UTF8 -NoTypeInformation
Рассмотрим ситуацию, когда запуск PowerShell по каким-то причинам невозможен (ограничения политик безопасности). Мы можем обратиться к Active Directory напрямую из 1С, используя COM-объекты провайдера ADsDSOObject. Это позволяет выполнять SQL-подобные запросы к базе данных пользователей.
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Provider = "ADsDSOObject";
Соединение.Open("Active Directory Provider");
Запрос = "SELECT displayName, mail FROM 'LDAP://DC=domain,DC=local' WHERE objectClass='user'";
Рекордсет = Соединение.Execute(Запрос);
Пока НЕ Рекордсет.EOF Цикл
Сообщить(Рекордсет.Fields("displayName").Value);
Рекордсет.MoveNext();
КонецЦикла;
Мы проанализировали основные методы взаимодействия 1С и PowerShell. Для простых разовых задач идеально подходит ЗапуститьПриложение с параметром ожидания. Для сложных интеграций, требующих получения больших объемов данных без создания файлов, лучше использовать WScript.Shell с захватом потока StdOut и передачей данных в формате JSON. Не забывайте про политику выполнения Bypass и специфику работы в 32-битных окружениях — это сэкономит вам часы отладки.