Как исправить ошибку «Неправильное имя кодировки 'ml'» при интеграции 1С с Битрикс?

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

При настройке регулярного обмена данными между конфигурацией 1С:Управление торговлей и интернет-магазином на базе 1С-Битрикс специалисты часто сталкиваются со специфическими техническими сбоями. Одним из наиболее частых и запутанных является сбой, сопровождающийся сообщением: Ошибка при вызове конструктора (ЧтениеТекста): Неправильное имя кодировки 'ml'. Данная ошибка полностью блокирует выгрузку товаров, обновление цен и получение заказов с сайта.

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

Выясняем техническую причину ошибки

Для того чтобы понять природу возникновения ошибки, давайте обратимся к исходному коду модуля обмена. Проблема локализована в общем модуле ОбщийМодуль.Б_ОбменССайтомСервер.Модуль (или аналогичном модуле интеграции в вашей версии конфигурации), а именно в функции, отвечающей за получение данных с веб-сервера.

Рассмотрим фрагмент кода, в котором происходит сбой:


HTTPОтвет = Соединение.Получить(СокрЛП(ПараметрыЗапроса), ИмяФайлаОтвета, СокрЛП(Заголовки));
ContentType = HTTPОтвет.Заголовки.Получить("Content-Type");
лКодировка = Прав(ContentType, СтрДлина(ContentType) - (Найти(ContentType, "charset=")+7));
...
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаОтвета, лКодировка);

Давайте проанализируем эту ситуацию по шагам:

  1. Когда 1С отправляет запрос к сайту, она ожидает получить XML-документ или JSON-ответ. При успешном сценарии веб-сервер возвращает заголовок Content-Type со значением, содержащим кодировку, например: text/html; charset=utf-8 или application/xml; charset=windows-1251.
  2. Программа пытается извлечь название кодировки из полученного заголовка. Для этого она ищет подстроку "charset=" с помощью функции Найти(). В корректном заголовке эта подстрока присутствует, и код успешно вырезает наименование кодировки (например, utf-8).
  3. Однако, если веб-сервер по какой-то причине возвращает заголовок Content-Type без указания кодировки (например, просто text/html), функция Найти(ContentType, "charset=") возвращает значение 0.
  4. В результате математического расчета длины строки получается следующая формула: лКодировка = Прав("text/html", 9 - (0 + 7)), что эквивалентно получению двух крайних правых символов строки text/html. Так переменная лКодировка принимает абсурдное значение "ml".
  5. На следующем этапе платформа 1С пытается инициализировать объект ЧтениеТекста, используя несуществующую кодировку "ml", что неизбежно приводит к аварийному завершению работы обмена с ошибкой.

Почему веб-сервер возвращает ответ без указания charset?

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

  1. Перенаправления и редиректы (HTTP 301 / 302). Если в настройках узла обмена в 1С указан адрес с протоколом http://, а на самом сайте настроено принудительное перенаправление на защищенное соединение https://, то при попытке обмена сервер возвращает промежуточную страницу редиректа. Заголовки такой технической страницы часто не содержат указания кодировки.
  2. Блокировки системами безопасности (WAF, Cloudflare, DDoS-Guard). Системы защиты хостинга могут расценить частые и объемные пакетные запросы от вашей базы 1С как DDoS-атаку или подозрительную активность роботов. В этом случае сервер возвращает страницу-заглушку (с ошибками 403 Forbidden, 429 Too Many Requests или требованием пройти капчу) в формате HTML, у которой отсутствует параметр charset в HTTP-заголовках.
  3. Критические ошибки на стороне сайта (HTTP 500 Internal Server Error). Если в процессе генерации XML-файла обмена на стороне Битрикса происходит сбой в PHP-скриптах (например, из-за нехватки оперативной памяти memory_limit или превышения времени выполнения скрипта max_execution_time), сервер отдает стандартную страницу ошибки 500 без указания кодировки в заголовке.

Способ 1. Самое быстрое решение — переход на HTTPS

Если вы недавно перенесли базу 1С на другой компьютер (например, непосредственно на рабочее место с кассовым оборудованием) или на сайте были изменены настройки безопасности, в первую очередь проверьте адрес подключения.

Выполните следующие действия:

  1. Откройте настройки интеграции с сайтом в вашей конфигурации 1С.
  2. Обратите внимание на поле Адрес сайта (URL скрипта обмена).
  3. Если там указан протокол http://, измените его на https://.
  4. Сохраните изменения и запустите тестовую выгрузку.

Этот простой шаг позволяет исключить возникновение редиректов 301/302, благодаря чему 1С сразу обращается к скрипту обмена напрямую и получает корректный XML-ответ с указанием кодировки.

Способ 2. Доработка кода в 1С (устранение уязвимости к ошибкам)

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

Проанализируем безопасный вариант кода, который заменяет проблемную строку:


ПозКодировки = Найти(ContentType, "charset=");
Если ПозКодировки > 0 Тогда
    // Если подстрока найдена, корректно вырезаем наименование кодировки
    лКодировка = Сред(ContentType, ПозКодировки + 8);
Иначе
    // Если кодировка не указана, назначаем стандартную кодировку по умолчанию
    лКодировка = "utf-8";
КонецЕсли;

При использовании этого алгоритма, если сервер вернет ошибку или редирект без указания charset, переменная лКодировка примет значение "utf-8". Платформа 1С успешно прочитает текст ответа (даже если это страница с ошибкой) и выведет в лог обмена понятный текст ошибки сервера (например, "Доступ ограничен" или "Ошибка 500"), что существенно облегчит дальнейшую диагностику системному администратору.

Способ 3. Тонкая настройка веб-сервера и PHP

Если предыдущие шаги не решили проблему, необходимо убедиться, что сам веб-сервер принудительно отдает корректную кодировку для PHP-скриптов интеграции. Рассмотрим два варианта решения на стороне сервера:

Вариант А. Добавление заголовка в PHP-скрипт

Вы можете принудительно внедрить отправку кодировки в файл обмена на стороне Битрикса. Для этого откройте файл /bitrix/admin/1c_exchange.php (или файл инициализации dbconn.php) и добавьте в самое начало следующую строку кода:

header("Content-Type: text/html; charset=utf-8");

Это гарантирует, что при любом обращении к скрипту веб-сервер будет транслировать правильный заголовок, предотвращая сбои алгоритмов парсинга 1С.

Вариант Б. Добавление IP-адреса 1С в белый список защиты

Если обмен блокируется защитными экранами хостинга, необходимо обратиться к вашему провайдеру или самостоятельно в панели управления хостингом добавить статический IP-адрес компьютера, на котором установлена 1С, в белый список (White List) для систем безопасности WAF и правил фильтрации трафика.

Применив описанные методы, вы сможете полностью восстановить работоспособность интеграции между 1С:Управление торговлей и 1С-Битрикс, а также сделать процесс обмена более устойчивым к внешним сетевым изменениям.

← На главную