При интеграции систем часто возникает задача связать базу данных 1С с внешними приложениями на языке Python. Одним из наиболее эффективных способов является использование HTTP-сервисов. Однако разработчики часто сталкиваются с тем, что сервис прекрасно работает в браузере, но при попытке программного доступа через библиотеку requests возвращает ошибку 401 Unauthorized или её специфические подтипы (например, 401.5). В этой статье мы подробно разберем, почему это происходит и как правильно настроить связку Python, IIS и 1С.
Ошибка 401 означает, что запрос не прошел проверку подлинности. В контексте работы через веб-сервер IIS (Internet Information Services) проблема часто заключается в «конфликте интересов» между самим сервером IIS и платформой 1С. Рассмотрим ситуацию: когда вы отправляете заголовок Authorization: Basic, сервер IIS перехватывает его и пытается сопоставить логин и пароль с учетными записями операционной системы Windows. Если вы передаете данные пользователя 1С, которых нет в системе Windows, IIS блокирует запрос еще до того, как он попадет в 1С. В результате мы получаем ошибку 401.5 или 401.1.
Проанализируем типичный код на Python, который может вызывать подобные сложности:
import requests
from requests.auth import HTTPBasicAuth
myUrl = 'http://localhost/BaseName/hs/DataExchange'
# Ошибка часто кроется в избыточных или конфликтующих заголовках
res = requests.get(myUrl, headers={'Authorization': 'Basic'}, auth=HTTPBasicAuth('login', 'password'))
print(res.status_code)
Для решения проблемы нам необходимо настроить сквозную передачу данных авторизации от Python-скрипта непосредственно к расширению 1С (ISAPI-модулю), минуя механизмы проверки самого IIS.
Первым делом проанализируем настройки безопасности сайта в консоли управления IIS. Для того чтобы 1С самостоятельно обрабатывала Basic-авторизацию, необходимо сделать следующее:
Важный нюанс: Включив анонимный доступ на уровне IIS, вы не делаете базу открытой для всех. Вы просто разрешаете веб-серверу пропустить запрос дальше. Когда запрос дойдет до модуля 1С, платформа увидит заголовок Authorization и сама потребует логин и пароль пользователя 1С. Если они не будут предоставлены или будут неверны, именно 1С вернет 401, но это уже будет контролируемый процесс.
Для корректной работы расширения 1С крайне важно правильно сконфигурировать пул приложений. Рассмотрим ключевые параметры:
1C:Enterprise 8.3 App Pool).Без управляемого кода (No Managed Code). Это исключит влияние .NET Framework на обработку заголовков, так как 1С работает через неуправляемый ISAPI-модуль.False.Файл default.vrd управляет тем, как именно база данных взаимодействует с веб-сервером. Посмотрим на структуру строки соединения. Если вы хотите использовать авторизацию из Python, убедитесь, что в файле не «зашиты» учетные данные, которые могут конфликтовать с передаваемыми.
Разберем пример секции point в файле default.vrd. Для динамической авторизации она должна быть максимально простой:
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
base="/BaseName"
ib="Srvr="ServerName";Ref="BaseName";">
<httpService name="DataExchange" base="hs" ibs="start"/>
</point>
Если в параметре ib указаны Usr и Pwd, то 1С всегда будет пытаться зайти под ними, игнорируя данные из Python-скрипта, либо выдавая ошибку при несовпадении.
Теперь, когда сервер настроен, выясним, как правильно отправить запрос из Python. Библиотека requests предоставляет удобный интерфейс для Basic-авторизации. Рассмотрим два рабочих способа.
Вариант 1: Использование кортежа auth
Это самый простой и надежный способ. Библиотека сама сформирует правильный заголовок и закодирует его в Base64.
import requests
url = 'http://localhost/BaseName/hs/DataExchange'
login = 'ExchangeUser'
password = 'StrongPassword123'
# Передаем логин и пароль напрямую в метод get
response = requests.get(url, auth=(login, password))
if response.status_code == 200:
print("Успешное подключение!")
print(response.json())
else:
print(f"Ошибка: {response.status_code}")
print(response.text)
Вариант 2: Использование сессии
Если вам нужно сделать несколько запросов подряд, лучше использовать объект Session. Это позволит сохранить параметры авторизации и ускорить работу за счет повторного использования TCP-соединения.
import requests
s = requests.Session()
s.auth = ('ExchangeUser', 'StrongPassword123')
url = 'http://localhost/BaseName/hs/DataExchange'
response = s.get(url)
print(f"Статус: {response.status_code}")
Если ваш логин или пароль в 1С содержит кириллические символы, это может стать причиной ошибки, так как стандарт HTTP предполагает определенную кодировку для заголовков. Рассмотрим, как принудительно закодировать данные в utf-8, если возникают проблемы:
import requests
from requests.auth import HTTPBasicAuth
# Если логин содержит русские буквы
user = 'Администратор'.encode('utf-8')
password = 'Пароль123'.encode('utf-8')
response = requests.get(url, auth=(user, password))
Однако лучшей практикой считается использование для интеграционных целей (HTTP-сервисов) специальных пользователей 1С с именами и паролями на латинице. Это избавляет от множества проблем с кодировками на разных веб-серверах.
Если даже после всех настроек IIS вы получаете 401, проанализируем настройки внутри самой 1С:
Мы рассмотрели комплексный подход к решению проблемы авторизации. Подведем итог: чаще всего ошибка 401 при работе через IIS возникает из-за включенной «Обычной проверки подлинности» в настройках веб-сервера. Перевод IIS в режим «Анонимной проверки» позволяет 1С самостоятельно обрабатывать заголовки Basic Auth. Сочетание правильной настройки IIS, корректных прав в 1С и чистого кода на Python с использованием requests.Session обеспечивает стабильную и быструю интеграцию систем.