При настройке регулярного обмена данными между конфигурацией 1С:Управление торговлей и интернет-магазином на базе 1С-Битрикс специалисты часто сталкиваются со специфическими техническими сбоями. Одним из наиболее частых и запутанных является сбой, сопровождающийся сообщением: Ошибка при вызове конструктора (ЧтениеТекста): Неправильное имя кодировки 'ml'. Данная ошибка полностью блокирует выгрузку товаров, обновление цен и получение заказов с сайта.
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем внутренние механизмы работы платформы 1С при обработке HTTP-ответов, а также рассмотрим пошаговые инструкции по устранению данной проблемы как на стороне 1С, так и на стороне веб-сервера.
Для того чтобы понять природу возникновения ошибки, давайте обратимся к исходному коду модуля обмена. Проблема локализована в общем модуле ОбщийМодуль.Б_ОбменССайтомСервер.Модуль (или аналогичном модуле интеграции в вашей версии конфигурации), а именно в функции, отвечающей за получение данных с веб-сервера.
Рассмотрим фрагмент кода, в котором происходит сбой:
HTTPОтвет = Соединение.Получить(СокрЛП(ПараметрыЗапроса), ИмяФайлаОтвета, СокрЛП(Заголовки));
ContentType = HTTPОтвет.Заголовки.Получить("Content-Type");
лКодировка = Прав(ContentType, СтрДлина(ContentType) - (Найти(ContentType, "charset=")+7));
...
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаОтвета, лКодировка);
Давайте проанализируем эту ситуацию по шагам:
Content-Type со значением, содержащим кодировку, например: text/html; charset=utf-8 или application/xml; charset=windows-1251."charset=" с помощью функции Найти(). В корректном заголовке эта подстрока присутствует, и код успешно вырезает наименование кодировки (например, utf-8).Content-Type без указания кодировки (например, просто text/html), функция Найти(ContentType, "charset=") возвращает значение 0.лКодировка = Прав("text/html", 9 - (0 + 7)), что эквивалентно получению двух крайних правых символов строки text/html. Так переменная лКодировка принимает абсурдное значение "ml".ЧтениеТекста, используя несуществующую кодировку "ml", что неизбежно приводит к аварийному завершению работы обмена с ошибкой.Понимание того, почему сайт отдает заголовок без кодировки, позволяет быстро устранить первопричину проблемы. Выделим основные ситуации, приводящие к такому поведению веб-сервера:
http://, а на самом сайте настроено принудительное перенаправление на защищенное соединение https://, то при попытке обмена сервер возвращает промежуточную страницу редиректа. Заголовки такой технической страницы часто не содержат указания кодировки.charset в HTTP-заголовках.memory_limit или превышения времени выполнения скрипта max_execution_time), сервер отдает стандартную страницу ошибки 500 без указания кодировки в заголовке.Если вы недавно перенесли базу 1С на другой компьютер (например, непосредственно на рабочее место с кассовым оборудованием) или на сайте были изменены настройки безопасности, в первую очередь проверьте адрес подключения.
Выполните следующие действия:
http://, измените его на https://.Этот простой шаг позволяет исключить возникновение редиректов 301/302, благодаря чему 1С сразу обращается к скрипту обмена напрямую и получает корректный XML-ответ с указанием кодировки.
Для того чтобы система 1С вела себя стабильно и не падала с критической ошибкой даже при получении некорректных ответов от сервера, рекомендуется внести изменения в код модуля обмена. Это можно сделать напрямую в конфигурации (если она снята с поддержки) или с помощью механизма расширений.
Проанализируем безопасный вариант кода, который заменяет проблемную строку:
ПозКодировки = Найти(ContentType, "charset=");
Если ПозКодировки > 0 Тогда
// Если подстрока найдена, корректно вырезаем наименование кодировки
лКодировка = Сред(ContentType, ПозКодировки + 8);
Иначе
// Если кодировка не указана, назначаем стандартную кодировку по умолчанию
лКодировка = "utf-8";
КонецЕсли;
При использовании этого алгоритма, если сервер вернет ошибку или редирект без указания charset, переменная лКодировка примет значение "utf-8". Платформа 1С успешно прочитает текст ответа (даже если это страница с ошибкой) и выведет в лог обмена понятный текст ошибки сервера (например, "Доступ ограничен" или "Ошибка 500"), что существенно облегчит дальнейшую диагностику системному администратору.
Если предыдущие шаги не решили проблему, необходимо убедиться, что сам веб-сервер принудительно отдает корректную кодировку для 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С-Битрикс, а также сделать процесс обмена более устойчивым к внешним сетевым изменениям.