При работе с электронным документооборотом через 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-битных версиях платформы этот функционал может продолжать работать корректно, что часто сбивает разработчиков с толку при тестировании кода на локальной машине и сервере.
Если обновление платформы в данный момент невозможно, самым эффективным способом будет изменение логики формирования 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-представления объекта ДвоичныеДанные.
Поскольку проблема признана официальным багом 1С (например, ошибка №00155091), системным решением будет изменение версии используемой платформы. Посмотрим, какие варианты существуют:
При смене платформы на сервере не забудьте проверить настройки разрядности. Как показывает практика, переход на 32-битный клиент (если это применимо для ваших задач) также может снять проблему, но это является лишь временным «костылем».
В редких случаях, когда ошибка 413 возникает не из-за бага 1С, а из-за реальных ограничений вашей локальной сети или прокси-сервера, следует проверить настройки веб-серверов.
Если ваше соединение проходит через локальный IIS (например, при использовании интеграционных шин), выполните следующие действия:
Для серверов на базе 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). Это самое быстрое и безопасное решение, не требующее переустановки ПО на всех серверах и рабочих станциях.