Почему при выгрузке из 1С на сайт Bitrix в наименовании товаров появляются лишние амперсанды и спецсимволы?

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

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

Выясняем причину: диагностика через XML-файл

Прежде чем приступать к правкам в коде или настройкам сервера, нам необходимо локализовать проблему. Важно понять, на каком этапе «портится» строка: в самой базе 1С, при формировании файла выгрузки или уже при приеме данных на стороне сайта. Проанализируем ситуацию с помощью стандартного механизма выгрузки в файл.

Для этого выполним следующие шаги:

  1. Перейдем в настройки узла обмена с сайтом в 1С.
  2. Временно переключим режим обмена с «Выгрузка на сайт» на «Выгрузка в каталог на диске».
  3. Добавим в отбор одну или несколько проблемных позиций номенклатуры, чтобы не выгружать весь массив данных.
  4. Запустим процесс выгрузки.
  5. Найдем в результирующем каталоге файл import.xml и откроем его через текстовый редактор (лучше всего использовать Notepad++ или специализированные XML-редакторы).

Проанализируем содержимое узла Наименование. Если в файле мы видим чистый текст без лишних символов, значит, проблема кроется в обработчиках на стороне Битрикса. Если же в XML уже присутствует & вместо обычного &, значит, ошибка происходит на стороне 1С при формировании пакета данных.

Проблема двойного экранирования (Double Escaping)

Разберем наиболее частую техническую причину появления лишних амперсандов. В формате XML некоторые символы являются зарезервированными. Например, кавычка " должна заменяться на ", а сам символ амперсанда & — на &.

Ситуация «двойного экранирования» возникает, когда стандартная функция 1С ЗаписатьXML или встроенные механизмы модуля обмена преобразуют спецсимвол в сущность, а затем какой-то дополнительный обработчик (в 1С или на сайте) воспринимает символ & в уже созданной сущности как новый объект для экранирования. В итоге " превращается в ", и на сайте пользователь видит технический код вместо кавычки.

Рассмотрим пример того, как это выглядит в коде:


// Некорректная обработка, приводящая к двойному экранированию
НаименованиеДляСайта = XMLСтрока(Номенклатура.Наименование); 
// Если в наименовании была кавычка, XMLСтрока уже сделает ее "
// Если далее вызвать повторную очистку спецсимволов, получим ошибку.

Влияние скрытых символов и «неразрывных пробелов»

Часто данные в 1С попадают путем копирования из спецификаций поставщиков (Excel, PDF или веб-страницы). При этом в строку могут закрасться невидимые символы, такие как «неразрывный пробел» (ASCII 160). Рассмотрим ситуацию: при формировании XML-файла выгрузки парсер может интерпретировать такие символы некорректно. В некоторых версиях PHP на стороне сайта эти символы принудительно преобразуются в  , что в интерфейсе может выглядеть как появление амперсанда в неожиданных местах.

Для борьбы с этим в 1С рекомендуется программно очищать наименование перед выгрузкой. Посмотрим на пример функции очистки:


Функция ОчиститьНаименованиеДляСайта(Знач ИсходныйТекст) Экспорт
    // Убираем неразрывные пробелы
    ЧистыйТекст = СтрЗаменить(ИсходныйТекст, Символ(160), " ");
    // Убираем возможные технические символы с кодами меньше 32
    Для НомерСимвола = 1 По 31 Цикл
        ЧистыйТекст = СтрЗаменить(ЧистыйТекст, Символ(НомерСимвола), "");
    КонецЦикла;
    Возврат СокрЛП(ЧистыйТекст);
КонецФункции

Специфика полной выгрузки данных

Как было замечено в ходе обсуждения проблемы, амперсанды часто появляются именно при полной выгрузке, в то время как обмен изменениями проходит корректно. Выясним причину этого феномена. При полной выгрузке объем передаваемого XML-файла может достигать сотен мегабайт (особенно если у вас более 65 000 наименований).

При обработке таких тяжелых файлов на стороне сервера может происходить следующее:

  1. Превышение лимитов памяти: Скрипт PHP начинает некорректно обрабатывать строковые буферы.
  2. Конфликт кодировок: Если база данных сайта работает в utf8, а не в utf8mb4, сложные типографские символы могут «обрезаться», оставляя после себя технический символ амперсанда.
  3. Таймауты: Если процесс обработки XML прерывается по таймауту, транзакция в БД может зафиксировать «битые» строки.

В качестве временного решения можно использовать методику «повторной пометки». Если после полной выгрузки вы заметили ошибки, попробуйте пометить всю номенклатуру к выгрузке еще раз, но запустите обмен в режиме «Только изменения». В этом случае пакеты данных будут меньше, и механизмы обработки отработают более стабильно.

Настройка mbstring на стороне сервера

Проанализируем настройки серверного окружения. Одной из классических причин искажения спецсимволов в Битрикс является параметр PHP mbstring.func_overload. Хотя в современных версиях Битрикс рекомендуется устанавливать значение 0, на многих старых проектах до сих пор используется значение 2.

Когда эта настройка включена, функции работы со строками (например, strlen, substr) начинают работать с многобайтными символами иначе. Это приводит к тому, что при парсинге XML-файла от 1С позиции символов рассчитываются неверно, и закрывающие теги или сущности (те самые ") могут обрезаться, превращаясь в одинокие амперсанды.

Рекомендации по устранению проблемы

Подведем итоги и сформируем план действий для устранения проблемы:

Соблюдение этих шагов позволит вам добиться стабильного обмена и чистоты данных в вашем интернет-магазине.

← На главную