Как устранить ошибку 401 при подключении к HTTP-сервису 1С из Python через IIS

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции систем часто возникает задача связать базу данных 1С с внешними приложениями на языке Python. Одним из наиболее эффективных способов является использование HTTP-сервисов. Однако разработчики часто сталкиваются с тем, что сервис прекрасно работает в браузере, но при попытке программного доступа через библиотеку requests возвращает ошибку 401 Unauthorized или её специфические подтипы (например, 401.5). В этой статье мы подробно разберем, почему это происходит и как правильно настроить связку Python, IIS и 1С.

Анализ проблемы: почему возникает ошибка 401

Ошибка 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.

Шаг 1: Настройка веб-сервера IIS

Первым делом проанализируем настройки безопасности сайта в консоли управления IIS. Для того чтобы 1С самостоятельно обрабатывала Basic-авторизацию, необходимо сделать следующее:

  1. Откройте Диспетчер служб IIS и выберите вашу публикацию 1С.
  2. Перейдите в раздел «Проверка подлинности» (Authentication).
  3. Включите только «Анонимную проверку подлинности» (Anonymous Authentication).
  4. Все остальные виды (Обычная, Дайджест, Windows) должны быть отключены.

Важный нюанс: Включив анонимный доступ на уровне IIS, вы не делаете базу открытой для всех. Вы просто разрешаете веб-серверу пропустить запрос дальше. Когда запрос дойдет до модуля 1С, платформа увидит заголовок Authorization и сама потребует логин и пароль пользователя 1С. Если они не будут предоставлены или будут неверны, именно 1С вернет 401, но это уже будет контролируемый процесс.

Шаг 2: Настройка пула приложений

Для корректной работы расширения 1С крайне важно правильно сконфигурировать пул приложений. Рассмотрим ключевые параметры:

  1. Выберите пул, на котором работает ваша публикация (обычно это 1C:Enterprise 8.3 App Pool).
  2. Зайдите в «Дополнительные параметры».
  3. Установите значение параметра «Режим управляемого кода» в Без управляемого кода (No Managed Code). Это исключит влияние .NET Framework на обработку заголовков, так как 1С работает через неуправляемый ISAPI-модуль.
  4. Убедитесь, что разрядность пула соответствует разрядности установленной платформы 1С. Если у вас 64-битная 1С, параметр «Разрешены 32-разрядные приложения» должен быть False.

Шаг 3: Настройка файла публикации default.vrd

Файл default.vrd управляет тем, как именно база данных взаимодействует с веб-сервером. Посмотрим на структуру строки соединения. Если вы хотите использовать авторизацию из Python, убедитесь, что в файле не «зашиты» учетные данные, которые могут конфликтовать с передаваемыми.

Разберем пример секции point в файле default.vrd. Для динамической авторизации она должна быть максимально простой:


<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
        base="/BaseName"
        ib="Srvr=&quot;ServerName&quot;;Ref=&quot;BaseName&quot;;">
    <httpService name="DataExchange" base="hs" ibs="start"/>
</point>

Если в параметре ib указаны Usr и Pwd, то 1С всегда будет пытаться зайти под ними, игнорируя данные из Python-скрипта, либо выдавая ошибку при несовпадении.

Шаг 4: Написание корректного кода на 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С с именами и паролями на латинице. Это избавляет от множества проблем с кодировками на разных веб-серверах.

Проверка прав доступа в 1С

Если даже после всех настроек IIS вы получаете 401, проанализируем настройки внутри самой 1С:

Заключение

Мы рассмотрели комплексный подход к решению проблемы авторизации. Подведем итог: чаще всего ошибка 401 при работе через IIS возникает из-за включенной «Обычной проверки подлинности» в настройках веб-сервера. Перевод IIS в режим «Анонимной проверки» позволяет 1С самостоятельно обрабатывать заголовки Basic Auth. Сочетание правильной настройки IIS, корректных прав в 1С и чистого кода на Python с использованием requests.Session обеспечивает стабильную и быструю интеграцию систем.

← На главную