При интеграции 1С:Управление торговлей 11.4 с сайтом на платформе 1С-Битрикс пользователи часто сталкиваются с неприятным эффектом: в названиях товаров на сайте внезапно появляются символы амперсанда & или конструкции вида ". Это не только портит внешний вид каталога, но и негативно сказывается на SEO-продвижении и поиске товаров. Рассмотрим подробно, почему это происходит и как мы можем решить данную проблему.
Прежде чем приступать к правкам в коде или настройкам сервера, нам необходимо локализовать проблему. Важно понять, на каком этапе «портится» строка: в самой базе 1С, при формировании файла выгрузки или уже при приеме данных на стороне сайта. Проанализируем ситуацию с помощью стандартного механизма выгрузки в файл.
Для этого выполним следующие шаги:
import.xml и откроем его через текстовый редактор (лучше всего использовать Notepad++ или специализированные XML-редакторы).Проанализируем содержимое узла Наименование. Если в файле мы видим чистый текст без лишних символов, значит, проблема кроется в обработчиках на стороне Битрикса. Если же в XML уже присутствует & вместо обычного &, значит, ошибка происходит на стороне 1С при формировании пакета данных.
Разберем наиболее частую техническую причину появления лишних амперсандов. В формате XML некоторые символы являются зарезервированными. Например, кавычка " должна заменяться на ", а сам символ амперсанда & — на &.
Ситуация «двойного экранирования» возникает, когда стандартная функция 1С ЗаписатьXML или встроенные механизмы модуля обмена преобразуют спецсимвол в сущность, а затем какой-то дополнительный обработчик (в 1С или на сайте) воспринимает символ & в уже созданной сущности как новый объект для экранирования. В итоге " превращается в ", и на сайте пользователь видит технический код вместо кавычки.
Рассмотрим пример того, как это выглядит в коде:
// Некорректная обработка, приводящая к двойному экранированию
НаименованиеДляСайта = XMLСтрока(Номенклатура.Наименование);
// Если в наименовании была кавычка, XMLСтрока уже сделает ее "
// Если далее вызвать повторную очистку спецсимволов, получим ошибку.
Часто данные в 1С попадают путем копирования из спецификаций поставщиков (Excel, PDF или веб-страницы). При этом в строку могут закрасться невидимые символы, такие как «неразрывный пробел» (ASCII 160). Рассмотрим ситуацию: при формировании XML-файла выгрузки парсер может интерпретировать такие символы некорректно. В некоторых версиях PHP на стороне сайта эти символы принудительно преобразуются в , что в интерфейсе может выглядеть как появление амперсанда в неожиданных местах.
Для борьбы с этим в 1С рекомендуется программно очищать наименование перед выгрузкой. Посмотрим на пример функции очистки:
Функция ОчиститьНаименованиеДляСайта(Знач ИсходныйТекст) Экспорт
// Убираем неразрывные пробелы
ЧистыйТекст = СтрЗаменить(ИсходныйТекст, Символ(160), " ");
// Убираем возможные технические символы с кодами меньше 32
Для НомерСимвола = 1 По 31 Цикл
ЧистыйТекст = СтрЗаменить(ЧистыйТекст, Символ(НомерСимвола), "");
КонецЦикла;
Возврат СокрЛП(ЧистыйТекст);
КонецФункции
Как было замечено в ходе обсуждения проблемы, амперсанды часто появляются именно при полной выгрузке, в то время как обмен изменениями проходит корректно. Выясним причину этого феномена. При полной выгрузке объем передаваемого XML-файла может достигать сотен мегабайт (особенно если у вас более 65 000 наименований).
При обработке таких тяжелых файлов на стороне сервера может происходить следующее:
utf8, а не в utf8mb4, сложные типографские символы могут «обрезаться», оставляя после себя технический символ амперсанда.В качестве временного решения можно использовать методику «повторной пометки». Если после полной выгрузки вы заметили ошибки, попробуйте пометить всю номенклатуру к выгрузке еще раз, но запустите обмен в режиме «Только изменения». В этом случае пакеты данных будут меньше, и механизмы обработки отработают более стабильно.
Проанализируем настройки серверного окружения. Одной из классических причин искажения спецсимволов в Битрикс является параметр PHP mbstring.func_overload. Хотя в современных версиях Битрикс рекомендуется устанавливать значение 0, на многих старых проектах до сих пор используется значение 2.
Когда эта настройка включена, функции работы со строками (например, strlen, substr) начинают работать с многобайтными символами иначе. Это приводит к тому, что при парсинге XML-файла от 1С позиции символов рассчитываются неверно, и закрывающие теги или сущности (те самые ") могут обрезаться, превращаясь в одинокие амперсанды.
Подведем итоги и сформируем план действий для устранения проблемы:
" на одинарную кавычку ' или «елочки».UPDATE, который записывает название товара. Если в запросе данные уже с амперсандами — ищите проблему в PHP-скриптах обмена.Соблюдение этих шагов позволит вам добиться стабильного обмена и чистоты данных в вашем интернет-магазине.