Почему сервис проверки контрагентов ФНС возвращает ошибку 403 Forbidden и как это исправить в 1С?

Программист 1С v7.7 Налоговый учет
← На главную

Многие разработчики и системные администраторы, поддерживающие интеграции с государственными сервисами в 1С (особенно на платформе 7.7 и старых версиях 8.x), столкнулись с внезапным прекращением работы обмена данными. Если ваша проверка контрагентов (НДС) из 1С 7.7 и 8.х начала выдавать ошибку 403 Forbidden, это означает, что сервис проверки НДС (npchk.nalog.ru), ранее работавший стабильно, перестал принимать запросы без специфических идентификаторов клиента. Также проблемы могут наблюдаться и в других задачах, например, когда требуется заполнение контрагентов по ИНН данными ФНС в старых конфигурациях.

В этой статье мы подробно разберем причины такого поведения, проанализируем необходимые изменения в коде 1С и обсудим сопутствующие проблемы с шифрованием на устаревших операционных системах.

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

Давайте взглянем на типичный код, который использовался для обращения к сервису ФНС годами. Обычно в 1С 7.7 или 8.x используется COM-объект MSXML2.XMLHTTP или WinHttp.WinHttpRequest.

Пример кода, который перестал работать:


xmlHTTP = CreateObject("MSXML2.XMLHTTP");
xmlHTTP.open("POST", "http://npchk.nalog.ru/FNSNDSCAWS_2", 0);
xmlHTTP.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHTTP.setRequestHeader("SOAPAction", "NdsRequest2"); 
xmlHTTP.send(ТекстЗапроса);  
// В ответ получаем статус 403

Причина кроется в настройках безопасности на стороне серверов ФНС. Для защиты от автоматического сбора данных (парсинга), DDoS-атак и нежелательных ботов, администраторы государственных ресурсов внедряют WAF (Web Application Firewall). Чтобы запрос не блокировался, необходимо передавать актуальный User-Agent и заголовки для HTTP-запросов. Это критично для любых инструментов мониторинга.

Суть проблемы: Объект MSXML2.XMLHTTP при отправке запроса может либо вообще не передавать заголовок User-Agent, либо передавать технический заголовок, который занесен в "черные списки" на сервере. Инструменты вроде Postman или браузеры автоматически подставляют свой идентификатор, поэтому сервер считает их доверенными.

Решение проблемы: добавление заголовка User-Agent

Чтобы наш запрос из 1С выглядел для сервера ФНС "доверенным", нам необходимо явно представиться. Это делается путем добавления стандартного HTTP-заголовка. Как выяснилось на практике, серверы ФНС лояльно относятся к агентам, идентифицирующим себя как платформа 1С или популярный браузер.

Давайте доработаем наш код, добавив необходимую строку:


xmlHTTP = CreateObject("MSXML2.XMLHTTP");
xmlHTTP.open("POST", "http://npchk.nalog.ru/FNSNDSCAWS_2", 0);

// Обязательные технические заголовки
xmlHTTP.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHTTP.setRequestHeader("SOAPAction", "NdsRequest2"); 

// РЕШЕНИЕ: Добавляем User-Agent
xmlHTTP.setRequestHeader("User-Agent", "1C+Enterprise/8.3");

xmlHTTP.send(ТекстЗапроса);

Строка 1C+Enterprise/8.3 является своего рода "золотым стандартом" для интеграций в среде 1С. Использование этого заголовка даст серверу понять, что запрос идет от учетной системы. Аналогичный подход используется и когда реализуется автоматическое заполнение реквизитов контрагента по ИНН в современных конфигурациях вроде УТ 11.5 или БП 3.0.

Проблемы с HTTPS и компонентой msxml3.dll

Часто после исправления ошибки 403 пользователи сталкиваются с другой проблемой, особенно при попытке переключиться на защищенный протокол https://. Ошибка может звучать как: msxml3.dll: Ошибка загрузки указанного ресурса.

Эта проблема обычно связана с тем, что старые операционные системы не поддерживают современные протоколы шифрования. В таких случаях требуется настройка TLS 1.2 в Windows Server 2008 R2 и Windows 7 для работы 1С с госсервисами, так как сервисы ФНС отключили поддержку устаревших протоколов SSL 3.0, TLS 1.0 и TLS 1.1 из-за их уязвимости.

Как настроить TLS 1.2 на Windows Server 2008 R2?

Если вы работаете на этой ОС, вам необходимо выполнить два условия:

  1. Установить все обновления Windows Update, добавляющие поддержку TLS 1.2.
  2. Внести изменения в реестр, чтобы разрешить использование TLS 1.2 для 32-битных приложений.

Выбор правильного объекта: ServerXMLHTTP

При разработке серверных обменов или регламентных заданий, мы настоятельно рекомендуем использовать объект MSXML2.ServerXMLHTTP вместо обычного MSXML2.XMLHTTP. Понимание разницы MSXML2.ServerXMLHTTP vs XMLHTTP крайне важно: серверная версия компоненты работает более стабильно, не зависит от настроек прокси в Internet Explorer и корректно обрабатывает таймауты в фоновых заданиях. Это особенно важно, когда выполняется групповая выгрузка и загрузка файлов из 1С в XML для ЭДО по актуальным приказам ФНС.

Пример использования более надежного объекта:


// Используем серверную версию компоненты
Попытка
    xmlHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0");
Исключение
    xmlHTTP = CreateObject("MSXML2.ServerXMLHTTP");
КонецПопытки;

xmlHTTP.open("POST", "https://npchk.nalog.ru/FNSNDSCAWS_2", 0);
xmlHTTP.setTimeouts(5000, 5000, 15000, 15000);

xmlHTTP.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHTTP.setRequestHeader("User-Agent", "1C+Enterprise/8.3");

xmlHTTP.send(ТекстЗапроса);

Альтернативное решение для старых платформ: использование cURL

Если вы вынуждены поддерживать 1С 7.7 на очень старой операционной системе, где невозможно включить TLS 1.2 на системном уровне, единственным рабочим выходом остается использование cURL. Существуют проверенные варианты отправки API запросов через cURL, которые работают на старых Windows и позволяют обходить ограничения устаревших библиотек msxml3.dll при работе с HTTPS и TLS 1.2.

Алгоритм действий в этом случае включает сохранение тела запроса в файл и запуск cURL через командную строку с флагом -H "User-Agent: 1C+Enterprise/8.3". Это позволяет обеспечить стабильную работу даже в условиях жестких требований безопасности современных государственных ИТ-систем.

Резюме

Для восстановления работоспособности обмена с сервисом ФНС выполните следующие шаги:

  1. В первую очередь добавьте заголовок User-Agent: 1C+Enterprise/8.3 в ваш HTTP-запрос. Это решит ошибку 403.
  2. Если используется HTTPS, убедитесь, что ваша ОС поддерживает протокол TLS 1.2.
  3. Проверьте наличие корневых сертификатов Минцифры и Национального УЦ в хранилище сертификатов Windows.
  4. Для серверных вызовов отдавайте предпочтение объекту MSXML2.ServerXMLHTTP.
← На главную