Как исправить ошибку кодировки при загрузке заказов из Shop-Script в 1С:УТ 11

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

При интеграции 1С:Управление торговлей 11 с интернет-магазинами на платформе Shop-Script (Webasyst) специалисты часто сталкиваются с ситуацией, когда выгрузка товаров на сайт проходит успешно, но загрузка заказов обратно в 1С обрывается с ошибкой. Основная причина кроется в несоответствии кодировки передаваемого XML-файла и той кодировки, которая указана в его заголовке. В результате вместо данных 1С видит набор непонятных символов («кракозябры»), а парсер XML выдает исключение.

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

Анализ причины возникновения ошибки

Разберем типичную ситуацию: в заголовке XML-файла, который формирует сайт, указано encoding="windows-1251". Однако фактическое содержимое файла передается в кодировке UTF-8 или содержит символы, которые веб-сервер ошибочно интерпретирует при передаче. Рассмотрим основные факторы, приводящие к сбою:

  1. Ложные метаданные: Плагин обмена на стороне Shop-Script может быть настроен на генерацию заголовка CommerceML старого образца (windows-1251), в то время как сама база данных сайта и PHP-скрипты работают в UTF-8.
  2. Проблема BOM (Byte Order Mark): Если файл в формате UTF-8 содержит невидимую метку порядка байтов в самом начале, типовой парсер 1С может не распознать его как валидный XML.
  3. Настройки веб-сервера: Сервер (Apache или Nginx) может принудительно добавлять заголовок charset=utf-8 к HTTP-ответу, что конфликтует с внутренним содержимым XML.

Проанализируем ситуацию: если вы открываете файл в браузере и видите структуру XML, а в обычном блокноте или при чтении в 1С отображается «каша» — это явный признак того, что программа пытается прочитать UTF-8 через кодировку ANSI (windows-1251).

Способ 1. Программная корректировка в 1С

Если нет возможности оперативно изменить логику формирования файла на стороне сайта, мы можем внести правки в код 1С, чтобы принудительно указать верную кодировку при чтении. Это наиболее надежный способ «подружиться» с внешним движком магазина.

Нам необходимо найти место, где система считывает файл заказов. В типовой конфигурации «Управление торговлей 11» за это отвечает общий модуль ОбменССайтом. Рассмотрим по шагам процесс внесения изменений:

  1. Перейдем в конфигуратор и найдем общий модуль ОбменССайтом.
  2. Найдем процедуру (или метод), отвечающую за загрузку заказов. В версиях УТ 11 это обычно ЗагрузитьЗаказыИзФайла или логика внутри менеджера обмена.
  3. В месте, где создается объект ЧтениеXML, необходимо явно указать кодировку, в которой 1С должна интерпретировать байты файла.

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


// В общем модуле ОбменССайтом находим логику инициализации чтения XML
// Вместо стандартного ФайлXML.ОткрытьФайл(ИмяФайла) используем:

ФайлXML = Новый ЧтениеXML;
ПараметрыЧтения = Новый ПараметрыЧтенияXML(,,, ПроверкаСимволовXML.ВыдаватьОшибку);

// Принудительно указываем кодировку "cp-1251", если сайт ошибается в заголовках
// Или "UTF-8", если файл по факту в юникоде, несмотря на заголовок 1251
ФайлXML.ОткрытьФайл(Параметры.ФайлЗагрузки, ПараметрыЧтения, "cp-1251");

Важный нюанс: Если вы видите, что в браузере текст читается, а в 1С нет, попробуйте заменить в коде выше "cp-1251" на "UTF-8". Это заставит 1С игнорировать ложный заголовок в самом XML и читать данные правильно.

Способ 2. Настройка плагина в Shop-Script

Выясним причину на стороне источника данных. В Shop-Script за интеграцию обычно отвечает плагин «1С:Интеграция». Разберем, что можно проверить в админ-панели сайта:

  1. Зайдите в настройки плагина и проверьте версию протокола CommerceML. Если установлена версия 2.05, попробуйте переключиться на 2.07 или выше. Современные версии протокола лучше поддерживают UTF-8.
  2. Проверьте, нет ли опции «Использовать кодировку UTF-8 для имен файлов и содержимого». Если она включена, убедитесь, что на стороне 1С в настройках узла обмена также не стоит ограничений на кодировку.
  3. Если вы используете файловый обмен (через выгрузку файла на диск), убедитесь, что PHP на сервере имеет права на запись файлов в нужной кодировке и не меняет их при сохранении.

Способ 3. Настройка окружения Windows (локаль)

Иногда проблема проявляется только на локальных тестовых серверах (например, при использовании OpenServer или XAMPP на Windows). Это происходит из-за того, что системная локаль «нон-юникод» программ отличается от кодировки файла. Выполним следующие действия для проверки:

Рассмотрим настройки региональных стандартов Windows. В панели управления в разделе «Региональные стандарты» (вкладка «Дополнительно») проверьте параметр «Язык программ, не поддерживающих Юникод». Для корректной работы с кириллицей в старых протоколах обмена там должен быть установлен «Русский (Россия)».

Однако помните, что это лишь вспомогательная мера. Основное решение должно быть реализовано на уровне обработки данных в 1С через объект ЧтениеXML.

Дополнительная отладка через текстовый формат

Если вы не уверены, в какой именно кодировке приходят данные, выполним небольшое исследование. Попробуем прочитать файл не как XML, а как обычный текст в 1С и вывести его в консоль сообщений:


ТекстовыйДокумент = Новый ТекстовыйДокумент;
// Пробуем прочитать файл как UTF-8
ТекстовыйДокумент.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8);
Сообщить(ТекстовыйДокумент.ПолучитьТекст());

// Если видим читаемый текст - значит проблема в том, 
// что 1С пытается парсить его как ANSI из-за заголовка XML.

Проанализировав результат, мы точно поймем, какую кодировку нужно подставить в метод ОткрытьФайл объекта ЧтениеXML.

Резюме

Проблема «кракозябр» при обмене 1С с Shop-Script — это классический конфликт стандартов. Сайт, работающий на PHP/Linux, тяготеет к UTF-8, в то время как старые спецификации CommerceML требуют windows-1251.

Для исправления ситуации мы рекомендуем:

Такой комплексный подход позволит восстановить автоматическую загрузку заказов и избежать ручного ввода данных из интернет-магазина.

← На главную