Проблемы с сайтом на 1С-Битрикс на новом хостинге

Дмитрий Корнев
18 октября 2013

Если после переезда на новый хостинг у вас перестали работать некоторые функции сайта на 1С-Битрикс, то эта публикация для вас. В моем случае не работали впадающие меню, не работали функции самотестирования сайта и т.д. Браузер Google Chrome при попытке разобраться в причине неработающих выпадающих меню в консоли выдавал ошибку:

 Uncaught SyntaxError: Unexpected token )

Не буду ходить вокруг до около. Причина оказалась в том, что на хостинге (в моем случае на VDS) был установлен последний релиз PHP 5.4.x, из-за чего не работали функции htmlspecialchars() и htmlentities(). Точнее сказать, не работали они в том виде, в каком их использует 1С-Битрикс в своем коде.

Как известно 1С-Битрикс очень привязан к кодировке windows-1251 (cp1251). В то время, как весь цивилизованный мир давно перешел на utf-8, данный движок до сих пор предлагает по умолчанию создавать сайты именно в windows-1251. Вариант использования utf-8 есть, но это, что называется, «на свой страх и риск». Ну еще бы, «по-человечески» адаптировать код движка под utf-8 разработчики долгое время не хотели. Не знаю, сделано ли это сейчас. Не слежу за новостями.

Еще совсем недавно, чтобы подружить сайт на 1С-Битрикс с кодировкой utf-8 в руководстве официально давалась рекомендация включить на хостинге для PHP «костыль», вроде mbstring.func_overload = 2.

Функции htmlspecialchars() и htmlentities() имеют ряд входящих параметров, третий по счету задает кодировку. Его обычно не указывают. Зачем, если и так все работает? Видимо так и рассуждали разработчики 1С-Битрикс. Но вот незадача, начиная с версии PHP 5.4 по умолчанию для функций используется кодировка utf-8.

Если сайт использует windows-1251 и для данных функций это не сообщается, то на выходе получается пустота. Отсюда и проблемы. Для выпадающих меню в админке 1С-Битрикс просто не дописывались важные параметры в JavaScript:

<a href="javascript:void(0);" hidefocus="true" onclick="this.blur();tbl_fileman_admin_menu.ShowMenu(this, );return false;" title="Действия" class="action context-button icon"><img src="/bitrix/themes/.default/images/arr_down.gif" class="arrow" alt=""></a>

Что делать? Лучше всего не использовать 1С-Битрикс. Я серьезно! Полно других хороших движков, развивающихся в ногу со временем, тот же Drupal. Если так поступить не получится, то можете воспользоваться хостингом или сервером, где установлен PHP версии ниже 5.4. Лично меня такой вариант не устраивает, другие сайты успешно работают с новым PHP, с чего я ради какого-то «битрикса» должен менять настройки на сервере?

Через php.ini или еще каким-нибудь способом глобально поменять кодировку по умолчанию тоже нельзя. Да и опять же, это могло бы затронуть другие сайты, что мне нафиг не надо.

Какие еще варианты? Можно попробовать обновится на более новую версию движка 1C-Битрикс, может быть там уже реализована совместимость с последними релизами PHP. Обращаю внимание, что это лишь предположение. Я не проверял! Дело в том, что текущий сайт, с которым были разбирательства, использует «1С-Битрикс Управление сайтом 11.5.6», сейчас доступна версия 12.5, которая сильно отличается, соответственно переход затруднителен. На мой взгляд, если уж заморачиваться с такими глобальными изменениями на сайте, то лучше перейти с 1С-Битрикс на другой движок.

Админка 1С-Битрикс

Что в итоге сделал я? Чтобы в админке 1С-Битрикс работали выпадающие менюшки пришлось залезть в код движка и изменить одну строчку кода. Остальное править не стал, т.к. работе сайта и его наполнению это не мешает. Хотя, может я еще столкнусь с проблемами.

Итак, чтобы работали выпадающие менюшки открываем файл /bitrix/modules/main/interface/admin_lib.php.

В нем ищем строчку:

$sMenuItems = htmlspecialchars(CAdminPopup::PhpToJavaScript($this->aActions));

и меняем на:

$sMenuItems = htmlspecialchars(CAdminPopup::PhpToJavaScript($this->aActions), null, "windows-1251");

UPD

Только этим дело не ограничилось. Уже в процессе работы с сайтом периодически возникали проблемы с наполнением. То там, то здесь, что-то не работало. Решились проблемы тем же образом. Обычно править надо тот файл, который открыт (смотрите ссылку при наполнении сайта), изредка приходится лезть в другие, подключенные выше файлы. Подключенных обычно много, поэтому сразу совет, проще искать нужный файл по названию функции.

Например, если открывается пустой редактор анонса и полного текста, то кроме bitrix/modules/iblock/admin/iblock_element_edit.php придется пофиксить bitrix/modules/fileman/fileman.php.

6 комментариев

Di
А вы возьмите друпал который вышел года два назад (как раз 11.5 битрикс) и заставьте его работать на php 5.4 без ошибок.
Так работает и так! Тогда уже у меня были сайты на Drupal 7.x, они и сейчас работают на том же сервере. Кстати, релиз Битрикс 11.5.6 вышел после релиза PHP 5.4!
Ол
Спасибо, заметочка очень помогла с диагнозом проблемы на сайте. Все статьи на вашем сайте читаю с удовольствием.
ma
Здравствуйте. Напишите, пожалуйста, что именно нужно изменить в файлах: bitrix/modules/iblock/admin/iblock_element_edit.php и bitrix/modules/fileman/fileman.php. для корректного отображения редактора анонса и полного текста. Спасибо
Прямо поиском ищем в этих файлах все используемые htmlspecialchars и дописываем в скобках в конец параметры: , null, "windows-1251", как в статье и написано. Я тупо все менял, не разбираясь, какой именно кусок кода вызывает ошибку. Хуже от такого подхода не будет!
ma
Большое спасибо. Буду пробовать.