Многие разработчики и системные администраторы, поддерживающие интеграции с государственными сервисами в 1С (особенно на платформе 7.7 и старых версиях 8.x), столкнулись с внезапным прекращением работы обмена данными. Если ваша проверка контрагентов (НДС) из 1С 7.7 и 8.х начала выдавать ошибку 403 Forbidden, это означает, что сервис проверки НДС (npchk.nalog.ru), ранее работавший стабильно, перестал принимать запросы без специфических идентификаторов клиента. Также проблемы могут наблюдаться и в других задачах, например, когда требуется заполнение контрагентов по ИНН данными ФНС в старых конфигурациях.
В этой статье мы подробно разберем причины такого поведения, проанализируем необходимые изменения в коде 1С и обсудим сопутствующие проблемы с шифрованием на устаревших операционных системах.
Давайте взглянем на типичный код, который использовался для обращения к сервису ФНС годами. Обычно в 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 или браузеры автоматически подставляют свой идентификатор, поэтому сервер считает их доверенными.
Чтобы наш запрос из 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.
Часто после исправления ошибки 403 пользователи сталкиваются с другой проблемой, особенно при попытке переключиться на защищенный протокол https://. Ошибка может звучать как: msxml3.dll: Ошибка загрузки указанного ресурса.
Эта проблема обычно связана с тем, что старые операционные системы не поддерживают современные протоколы шифрования. В таких случаях требуется настройка TLS 1.2 в Windows Server 2008 R2 и Windows 7 для работы 1С с госсервисами, так как сервисы ФНС отключили поддержку устаревших протоколов SSL 3.0, TLS 1.0 и TLS 1.1 из-за их уязвимости.
Если вы работаете на этой ОС, вам необходимо выполнить два условия:
При разработке серверных обменов или регламентных заданий, мы настоятельно рекомендуем использовать объект 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(ТекстЗапроса);
Если вы вынуждены поддерживать 1С 7.7 на очень старой операционной системе, где невозможно включить TLS 1.2 на системном уровне, единственным рабочим выходом остается использование cURL. Существуют проверенные варианты отправки API запросов через cURL, которые работают на старых Windows и позволяют обходить ограничения устаревших библиотек msxml3.dll при работе с HTTPS и TLS 1.2.
Алгоритм действий в этом случае включает сохранение тела запроса в файл и запуск cURL через командную строку с флагом -H "User-Agent: 1C+Enterprise/8.3". Это позволяет обеспечить стабильную работу даже в условиях жестких требований безопасности современных государственных ИТ-систем.
Для восстановления работоспособности обмена с сервисом ФНС выполните следующие шаги:
User-Agent: 1C+Enterprise/8.3 в ваш HTTP-запрос. Это решит ошибку 403.MSXML2.ServerXMLHTTP.