Как исправить ошибку HTTP 413 при получении токена Диадок в 1С

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

При работе с электронным документооборотом через API Диадок пользователи платформы 1С:Предприятие 8.3.22 (и некоторых смежных релизов) часто сталкиваются с неожиданной ошибкой: 413 Request Entity Too Large. Ситуация выглядит парадоксально: передаваемый файл сертификата имеет небольшой размер (несколько килобайт), но сервер (обычно Nginx на стороне Контура) отклоняет запрос, сообщая о превышении допустимого объема данных. Проанализируем причины этой проблемы и разберем по шагам, как её устранить.

Выясним причину возникновения ошибки

Давайте разберем техническую подоплеку. Ошибка 413 в данном контексте не всегда означает, что ваш файл действительно слишком велик. В случае с версиями платформы 8.3.22.1709, 8.3.22.1923 и выше (особенно в 64-битной версии клиента или сервера), проблема кроется во внутреннем баге платформы 1С.

При использовании метода HTTPЗапрос.УстановитьТелоИзДвоичныхДанных() платформа может некорректно вычислять заголовок Content-Length или добавлять в конец потока данных лишние «мусорные» байты. Веб-сервер Nginx, который стоит на защите шлюзов Диадока, видит несоответствие заявленной длины контента фактической или воспринимает некорректно сформированный пакет как попытку передачи недопустимого объема данных и мгновенно обрывает соединение с кодом 413. Для анализа отправляемых заголовков и содержимого пакета можно использовать инструмент перехвата и анализа HTTP-запросов.

Интересно, что на 32-битных версиях платформы этот функционал может продолжать работать корректно, что часто сбивает разработчиков с толку при тестировании кода на локальной машине и сервере.

Решение №1: Программный обход через преобразование в Base64

Если обновление платформы в данный момент невозможно, самым эффективным способом будет изменение логики формирования HTTP-запроса. Метод /Authenticate API Диадока универсален: он может принимать данные сертификата как в «сыром» двоичном виде, так и в виде строки формата Base64. Для тестирования взаимодействия с API и проверки параметров запроса пригодится консоль HTTP-запросов для управляемых форм.

Рассмотрим, как изменить стандартный код авторизации. Вместо прямой передачи двоичных данных, мы преобразуем их в строку. Это заставит платформу использовать другой внутренний механизм формирования тела запроса (текстовый), который в проблемных версиях 1С работает стабильно.

Проанализируем пример кода для функции авторизации:


// Подготовка параметров запроса
ЗаголовокHTTP = Новый Соответствие;
ЗаголовокHTTP.Вставить("Authorization", СтрШаблон("DiadocAuth ddauth_api_client_id=%1", КлючРазработчика));
ЗаголовокHTTP.Вставить("Accept", "application/json");

HTTPСоединение = Новый HTTPСоединение("diadoc-api.kontur.ru", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
HTTPЗапрос = Новый HTTPЗапрос("/Authenticate", ЗаголовокHTTP);

// СТАРЫЙ ВАРИАНТ (вызывал ошибку 413):
// HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеСертификата);

// НОВЫЙ ВАРИАНТ (рабочий):
// Преобразуем двоичные данные сертификата в Base64-строку
СодержимоеФайла = XMLСтрока(ДвоичныеДанныеСертификата); 

// Устанавливаем тело из строки с явным указанием кодировки
HTTPЗапрос.УстановитьТелоИзСтроки(СодержимоеФайла, "windows-1251", ИспользованиеByteOrderMark.НеИспользовать);

Результат = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

Важный нюанс: при использовании УстановитьТелоИзСтроки мы гарантируем, что платформа корректно сформирует текстовый поток, который будет однозначно интерпретирован сервером Диадока. Использование функции XMLСтрока() является быстрым способом получения Base64-представления объекта ДвоичныеДанные.

Решение №2: Обновление или откат версии платформы

Поскольку проблема признана официальным багом 1С (например, ошибка №00155091), системным решением будет изменение версии используемой платформы. Посмотрим, какие варианты существуют:

  1. Обновление на исправленный релиз: Ошибка была устранена в более поздних сборках. Если вы используете ветку 8.3.22, рекомендуется обновиться до версии 8.3.22.2106 или выше. В ветке 8.3.23 исправления внесены в актуальные релизы 2023 года. Для упрощения технического обслуживания систем можно автоматизировать архивирование, обновление и тестирование баз 1С в тихом режиме.
  2. Откат на стабильную версию: Если ваша конфигурация позволяет, можно временно вернуться на версию 8.3.20.2184, где механизм работы с двоичными данными в HTTP-запросах работает без нареканий.

При смене платформы на сервере не забудьте проверить настройки разрядности. Как показывает практика, переход на 32-битный клиент (если это применимо для ваших задач) также может снять проблему, но это является лишь временным «костылем».

Решение №3: Настройка инфраструктуры (IIS/Nginx)

В редких случаях, когда ошибка 413 возникает не из-за бага 1С, а из-за реальных ограничений вашей локальной сети или прокси-сервера, следует проверить настройки веб-серверов.

Если ваше соединение проходит через локальный IIS (например, при использовании интеграционных шин), выполните следующие действия:

  1. Откройте диспетчер служб IIS.
  2. Перейдите в раздел «Фильтрация запросов» (Request Filtering).
  3. Выберите «Изменить параметры функции» (Edit Feature Settings).
  4. Увеличьте значение в поле «Максимально допустимая длина содержимого (байт)» (Maximum allowed content length).

Для серверов на базе Nginx проверьте параметр client_max_body_size в конфигурационном файле nginx.conf. Однако помните: если ошибка исходит от серверов kontur.ru, изменить их настройки вы не сможете, и единственным выходом останутся первые два способа (изменение кода или платформы).

Дополнительные рекомендации

При отладке подобных ошибок мы рекомендуем всегда проверять заголовки запроса. Попробуйте явно указать Content-Type, если передаете двоичные данные вручную:

HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/octet-stream");

Это помогает веб-серверам лучше понимать структуру передаваемого контента. Также стоит помнить, что начиная с версии 8.3.22, 1С обновила библиотеки OpenSSL, что сделало требования к сертификатам и защищенным соединениям более строгими. Убедитесь, что ваш сертификат корректен и не поврежден при чтении с диска в объект ДвоичныеДанные.

Подводя итог: если вы столкнулись с ошибкой 413 на платформе 8.3.22, начните с замены способа передачи тела запроса на XMLСтроку (Base64). Это самое быстрое и безопасное решение, не требующее переустановки ПО на всех серверах и рабочих станциях.

← На главную