В статье "Режим агента конфигуратора" технологического блога 1С приводится пример управления конфигуратором с помощью языка python.
import paramiko
host = '127.0.0.1'
user = 'login'
secret = 'password'
port = 1543
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, port=port, username=user, password=secret)
stdin, stdout, stderr = client.exec_command('common connect-ib')
data = stdout.read() + stderr.read()
// Тут подразумевается код команд конфигуратору после подключения к базе
stdin, stdout, stderr = client.exec_command('common disconnect-ib')
data = stdout.read() + stderr.read()
client.close()
Оригинал кода можно посмотреть по ссылке выше. Я попробовал воспроизвести этот код. Проблема возникла в том, что метод exec_command() после выполнения одной команды закрывает сессию. Поэтому таким способом нельзя выполнить две команды последовательно в рамках одного подключения, созданного методом client.connect(hostname=host, username=user, password=secret, port=port). Следовательно, после подключения к базе командой 'common connect-ib' любую другую команду для базы уже выполнить нельзя, используя exec_command().
Я пошел другим путем. Запуск конфигуратора в режиме агента из командной строки с помощью subprocess.Popen(). Параметры командной строки есть в Руководстве администратора ИТС.
/F - путь к базе
/AgentMode - режим агента
/AgentSSHHostKeyAuto - ключ для подключения берется из файла host_id в директории 1С
/AgentBaseDir - путь к директории, с которой будет работать конфигуратор для загрузки/выгрузки файлов.
/Visible - режим видимости агента, появляется окно при запуске конфигуратора в этом режиме
import subprocess
import paramiko
import time
p = subprocess.Popen([r'c:\Program Files (x86)\1cv8\8.3.15.1830\bin\1cv8.exe',
r'DESIGNER',
r'/F d:\Test', r'/AgentMode', r'/AgentSSHHostKeyAuto',
r'/AgentBaseDir d:\Test\Agent', r'/Visible'])
time.sleep(5)
host = '127.0.0.1'
user = 'Admin'
secret = '123'
port = 1543
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, port=port, username=user, password=secret)
transport = client.get_transport()
channel = transport.open_session()
channel.invoke_shell()
print(channel.recv(5000).decode('utf-8'))
channel.send('options set --show-prompt=no\n')
time.sleep(3)
print('Нет коммандной строки: ' + channel.recv(5000).decode('utf-8'))
channel.send('common connect-ib\n')
time.sleep(1)
print('Подключение к базе: ' + channel.recv(5000).decode('utf-8'))
channel.send(r'config dump-cfg --file=\1Cv8.cf' + '\n')
while not channel.recv_ready():
i = 0
print('Выгрузка конфигурации: ' + channel.recv(5000).decode('utf-8'))
time.sleep(1)
channel.send('common disconnect-ib\n')
time.sleep(1)
print('Отключение от базы: ' + channel.recv(5000).decode('utf-8'))
channel.send('common shutdown\n')
time.sleep(1)
print('Завершение работы: ' + channel.recv(5000).decode('utf-8'))
channel.close()
client.close()
print("конец программы")
Я использовал получение интерактивной сессии оболочки через invoke_shell(). После этого можно отправлять команды конфигуратору через сообщения channel.send('common connect-ib\n'), при этом канал остается открытым и ответ сервера можно получить через channel.recv(). При отправке команд через сообщения обязательно строка команды должна заканчиваться '\n' (переход строки).
'options set --show-prompt=no\n' - отключает приглашение 'designer>' в командной строке
'common connect-ib\n' - подключение к информационной базе
'config dump-cfg --file=\1Cv8.cf' - выгрузка файла конфигурации в заданную директорию
'common disconnect-ib\n' - отключение от информационной базы
'common shutdown\n' - завершение работы конфигуратора