Найти в Дзене
Записки сисадмина

Python. IIS. Работаем с базой 1С

Зачастую, приходится заниматься тем, что ты не любишь всем сердцем. Лично у меня возникает какое-то отторжение от интерфейса 1с. Но нельзя игнорировать то, вокруг чего завязана работа практически всей компании. Я писал, что мне часто приходится работать с Excel файлами, доставать скриптами из них данные и формировать уже готовые управленческие и финансовые отчеты. Но было бы дикостью формировать данные вручную, чтобы потом запускать по ним скрипт. Все должно происходить автоматически. В этой статье я не буду писать о том, как правильно настроить веб сервер IIS, как опубликовать 1с базу на веб сервере. По этой теме уже написано куча статей, например, на инфостарте. Тем более, я не буду писать, как в конфигураторе создавать метод, к которому мы будем обращаться. За исходную точку примем то, что у нас уже настроен веб сервер, опубликована база, и добрые 1с программисты создали нам методы, из которых мы можем получать отчеты. Мы же находимся по другую сторону баррикад, наше дело - получить

Зачастую, приходится заниматься тем, что ты не любишь всем сердцем. Лично у меня возникает какое-то отторжение от интерфейса 1с. Но нельзя игнорировать то, вокруг чего завязана работа практически всей компании.

Я писал, что мне часто приходится работать с Excel файлами, доставать скриптами из них данные и формировать уже готовые управленческие и финансовые отчеты.

Но было бы дикостью формировать данные вручную, чтобы потом запускать по ним скрипт. Все должно происходить автоматически.

В этой статье я не буду писать о том, как правильно настроить веб сервер IIS, как опубликовать 1с базу на веб сервере. По этой теме уже написано куча статей, например, на инфостарте. Тем более, я не буду писать, как в конфигураторе создавать метод, к которому мы будем обращаться.

За исходную точку примем то, что у нас уже настроен веб сервер, опубликована база, и добрые 1с программисты создали нам методы, из которых мы можем получать отчеты.

Мы же находимся по другую сторону баррикад, наше дело - получить то, что сформирует 1с.

Так давайте же начинать.

  • Подготавливаем окружение и устанавливаем библиотеки:
pip install zeep
pip install requests

  • Подготовим файл config.py с параметрами подключения к IIS.
IIS_user = 'логин'
IIS_password = 'пароль'
IIS_url = 'URL до обработчика в конкретной базе'

URL нужно прописывать полностью. Например:
"http://[IP вашего сервера]:[порт, который слушает IIS]/[имя инстанса IIS]/[ws]/[название обработчика].1cws?wsdl"

  • Создадим класс коннектора, который будет принимать параметры из нашего конфига:

При создании объекта Connector, он примет в себя логин, пароль и URL, но соединение пока что не запустит. Не советую в init создавать подключение, так как можете потом получить кучу проблем с таймаутами.

  • Создадим внутри класса метод подключения к IIS:
-2

Разбираемся, почему так:

settings = Settings(strict=False, xml_huge_tree=True)

strict=False. Мы запрещаем библиотеке парсить полученный файл в режиме "strict". В случае, если библиотека посчитает полученный XML файл неправильным, она все равно постарается спарсить его, как только сможет.

xml_huge_tree - параметр, который будет игнорировать размер xml файла, который отдаст вам 1с. Без этого параметра, при получении большого файла, подключение будет падать с таймаутом, не дожидаясь конца файла. xml_huge_tree=True полезно в тех случаях, если вы ожидаете получить большую Excel таблицу.

session.auth = HTTPBasicAuth(self.user, self.password)

Подключение к IIS требует не просто GET/POST запроса, а полноценной HTTP авторизации.

Функция start_connection будет создавать подключение к нашему веб серверу IIS и отдавать объект подключения в случае успеха.

  • Добавим логирование к нашему классу:
-3
  • В функции подключения добавим логирование exception:
-4

В случае, если мы получим ошибку при подключении к нашему IIS, в папке с нашим скриптом создастся файл 1c_error.log и запишет туда полный Traceback ошибки. Например:

2024-07-18 12:30:43,544 ERROR connector_1c Connection Error
Traceback (most recent call last):
File "/home/nightfear/PycharmProjects/basicdecor_bot_new/venv/lib/python3.10/site-packages/urllib3/connection.py", line 196, in _new_conn
sock = connection.create_connection(
File "/home/nightfear/PycharmProjects/basicdecor_bot_new/venv/lib/python3.10/site-packages/urllib3/util/connection.py", line 85, in create_connection
raise err
File "/home/nightfear/PycharmProjects/basicdecor_bot_new/venv/lib/python3.10/site-packages/urllib3/util/connection.py", line 73, in create_connection
sock.connect(sa)
TimeoutError: [Errno 110] Connection timed out

  • Создадим в классе функцию, которая будет обращаться к методу в самой базе 1С:
-5

Важно: метод, к которому мы обращаемся (GetReport в примере), должен называться точно так же, как и метод в конфигурации 1с базы.

При вызове функции get_1c_report, установится соединение с IIS, после чего вызовется метод GetReport. Все данные, полученные от метода, поместятся в переменную xml_result.

Как только функция выполнит свою работу, соединение с IIS должно автоматически закрыться. Так мы не будем плодить кучу пустых соединений, которые нам уже не нужны.

Код из статьи выложил здесь.