После перехода 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;

и выполняется повторный запуск.

После завершения необходимо:

  1. Очистить весь кеш Битрикс.

  2. Проверить отображение свойств.

  3. Удалить сервисный скрипт с сервера.

Важный нюанс

Перед запуском необходимо убедиться, что параметр:

mbstring.func_overload

отключён.

Если он включён, функции работы со строками начинают считать символы вместо байтов, что приводит к неправильному пересчёту длины сериализованных данных.

Результат

После исправления данных:

  • свойства типа «HTML/Текст» снова начали корректно отображаться;

  • массив ~VALUE['TEXT'] стал заполняться штатно;

  • изменения в шаблонах компонентов не потребовались;

  • весь контент каталога восстановился автоматически.

Вывод

При переводе старых проектов 1С-Битрикс с Windows-1251 на UTF-8 необходимо проверять свойства инфоблоков типа «HTML/Текст». Если после конвертации вместо текста отображаются сериализованные строки вида:

a:2:{s:4:"TEXT";...}

причина чаще всего связана с повреждением длины строк внутри сериализованных данных. В таком случае требуется не доработка шаблонов, а исправление данных в базе с пересчётом сериализации под UTF-8.