После перехода 1С-Битрикс на UTF-8 HTML-свойства инфоблока стали выводиться в виде сериализованной строки
После перехода 1С-Битрикс на UTF-8 HTML-свойства инфоблока стали выводиться в виде сериализованной строки
При переводе старого сайта на 1С-Битрикс с кодировки Windows-1251 на UTF-8 мы столкнулись с неожиданной проблемой. После успешной конвертации часть свойств инфоблока типа «HTML/Текст» перестала корректно отображаться в шаблонах компонентов.
Вместо текста выводилась сериализованная строка:
a:2:{s:4:"TEXT";s:379:"Новый Google TV LED 4K серии W70...";s:4:"TYPE";s:4:"HTML";}При этом проблема возникла после выполнения конвертации по официальной инструкции 1С-Битрикс.
Как проявлялась проблема
В шаблоне компонента bitrix:catalog.element вывод свойства выглядел примерно так:
<?=$arResult["PROPERTIES"]["DESCRIPTION"]["VALUE"]?>Вместо ожидаемого HTML-текста отображалась сериализованная структура массива.
Попытки использовать:
unserialize($value);не помогали — функция возвращала ошибку или false.
Причина
Свойства типа «HTML/Текст» в Битриксе хранятся в сериализованном виде.
При работе сайта в Windows-1251 длина строки внутри сериализованного массива рассчитывается в байтах кодировки Windows-1251.
После перевода базы данных в UTF-8 количество байтов для русских символов увеличивается, а сохранённые значения длины внутри сериализованных данных остаются прежними.
Например:
s:379:"Текст свойства";После конвертации фактическая длина строки уже отличается от указанной в сериализации.
Из-за этого PHP не может корректно выполнить unserialize() и Битрикс начинает выводить исходную сериализованную строку.
Решение
Для исправления проблемы был подготовлен специальный скрипт, который:
находит повреждённые сериализованные значения;
пересчитывает длину строк после конвертации в UTF-8;
проверяет успешность десериализации;
исправляет только битые записи;
не затрагивает корректные данные.
На проекте свойства каталога хранились в общей таблице:
b_iblock_element_propertyдля инфоблока:
ID = 6Поэтому обработка выполнялась только для этого инфоблока.
Скрипт работает в два этапа:
Шаг 1. Проверка
Запуск в режиме:
$DRY_RUN = true;В этом режиме изменения в базу не записываются, а выводится только отчёт:
FIX ...
FAIL ...Шаг 2. Исправление
После проверки режим меняется на:
$DRY_RUN = false;и выполняется повторный запуск.
После завершения необходимо:
Очистить весь кеш Битрикс.
Проверить отображение свойств.
Удалить сервисный скрипт с сервера.
Важный нюанс
Перед запуском необходимо убедиться, что параметр:
mbstring.func_overloadотключён.
Если он включён, функции работы со строками начинают считать символы вместо байтов, что приводит к неправильному пересчёту длины сериализованных данных.
Результат
После исправления данных:
свойства типа «HTML/Текст» снова начали корректно отображаться;
массив
~VALUE['TEXT']стал заполняться штатно;изменения в шаблонах компонентов не потребовались;
весь контент каталога восстановился автоматически.
Вывод
При переводе старых проектов 1С-Битрикс с Windows-1251 на UTF-8 необходимо проверять свойства инфоблоков типа «HTML/Текст». Если после конвертации вместо текста отображаются сериализованные строки вида:
a:2:{s:4:"TEXT";...}причина чаще всего связана с повреждением длины строк внутри сериализованных данных. В таком случае требуется не доработка шаблонов, а исправление данных в базе с пересчётом сериализации под UTF-8.