Переход на PHP 8: что ломается в 1С-Битрикс и как это чинить
Переход на новую версию PHP — работа не на пять минут, но и не катастрофа: почти все поломки типовые и лечатся одинаково. Главное — правильный порядок. Сначала обновить продукт на старой версии PHP, потом переключать версию, а не наоборот.
С 1 февраля 2026 года минимальная поддерживаемая версия — PHP 8.2, рекомендуемая — 8.3 и выше. Пока на сервере версия ниже, обновления продукта не установятся: кнопка есть, а обновления не приходят.
Порядок перехода
- Сделайте резервную копию файлов и базы и убедитесь, что она разворачивается. Без этого дальше не идите.
- Поднимите копию сайта на тестовом домене — переходить будете на ней, а не на бою.
- На старой версии PHP обновите ядро и модули до актуальных: в административной части, раздел обновления платформы.
- Обновите решения из Маркетплейса — у сторонних модулей свои обновления, и именно они чаще всего ломаются на PHP 8.
- На копии переключите PHP на 8.3 и пройдите по сценариям: главная, каталог, корзина, оформление заказа, личный кабинет, административная часть, обмен с 1С.
- Соберите список ошибок, почините, повторите проверку.
- Повторите переключение на бою в наименее посещаемое время и держите наготове откат версии PHP.
Что ломается чаще всего
Четыре группы, по убыванию частоты.
Нестатические методы, вызванные статически
PHP 8 перестал прощать вызов обычного метода как статического. В журнале это выглядит так:
Error: Non-static method CModuleClass::methodName() cannot be called statically
Лечится объявлением метода как public static в том модуле, где он описан. Если это сторонний модуль, правку должен выпустить его разработчик: собственная правка исчезнет при первом же обновлении.
Передача null туда, где ждут строку
С PHP 8.1 передача null в параметр встроенной функции, не объявленный как допускающий null, выдаёт уведомление об устаревании, а в типизированных параметрах — сразу фатальную ошибку. На сайте с историей такие вызовы находятся сотнями: поля без значений, необязательные параметры компонентов, старые шаблоны.
Старый синтаксис
PHP 8.0 убрал обращение к символу строки через фигурные скобки ($string{0}) и функцию each(). Это встречается в шаблонах и компонентах, которые писали до 2015 года и с тех пор не трогали.
Прямая запись в $GLOBALS
PHP 8.1 запретил изменять массив $GLOBALS целиком. В главном модуле это исправлено начиная с версии 22.100.0 — то есть лечится обновлением, если оно установлено до смены версии PHP.
Частые ошибки после перехода: что вы увидите
Собрали сообщения, которые встречаются чаще всего, и что за ними стоит. Тексты приведены так, как они выглядят в журнале, — по ним удобно искать.
| Сообщение | Что это |
|---|---|
Warning: Undefined variable $APPLICATION и следом Call to a member function SetTitle() on null | В файле не объявлена глобальная переменная. Раньше PHP это прощал, теперь обращение к ней даёт фатальную ошибку. Правится добавлением объявления глобальной переменной в начале файла |
Call to undefined function each() | Функция удалена в PHP 8.0. Встречается в старых шаблонах и в сторонних модулях; на портале вылезает в самых неожиданных местах вроде завершения задачи |
[TypeError] Unsupported operand types: string / int | Арифметика со строкой, которую PHP раньше молча приводил к числу |
count(): Argument #1 ($value) must be of type Countable|array, bool given | В count() передали результат функции, которая вернула false вместо массива |
Non-static method ... cannot be called statically | Обычный метод вызван как статический; разбор в отдельной инструкции |
$GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax | Старая версия главного модуля, лечится обновлением продукта |
Ошибка описания модуля в системе обновлений | Сторонний модуль со старым синтаксисом конструктора: правится в файле установки модуля его разработчиком |
Ошибки, которые видны не сразу
Отдельная категория — поломки, которые не роняют сайт и потому обнаруживаются через недели.
- Пропали цены в каталоге. Товары на месте, в карточке цена есть, а на витрине пусто. Типичный след несовместимости в модуле каталога или в своём шаблоне, где цена приходит не того типа.
- Задания cron падают, сайт работает. У консольного PHP своя версия: сайт переключили, а задания остались на старой. Сообщение вида
PHP Parse error: syntax error, unexpected '::'означает ровно это — старый интерпретатор не понимает синтаксис свежего ядра. - Перестала уходить почта или выгрузки. Та же причина: процессы по расписанию работают под другим интерпретатором.
- Сторонний модуль тихо не работает. Ошибка пишется в журнал, но пользователю не показывается.
Поэтому после переключения проверяют не только сайт, но и всё, что работает по расписанию: обмен с 1С, почтовую очередь, выгрузки, резервное копирование.
Как собрать список ошибок, а не ловить их по одной
На копии сайта включите отладочный режим: в файле /bitrix/.settings.php параметр debug поставьте в true. Тогда ошибки будут показываться на экране, а не прятаться в белую страницу. Параллельно смотрите журнал ошибок веб-сервера: часть сообщений туда попадает даже при выключенной отладке.
Отладочный режим включается только на копии. На боевом сайте он показывает посетителям пути к файлам и куски кода — это подарок тому, кто ищет, как сайт сломать.
Кто что чинит
- Ошибки в модулях вендора (
main,iblock,saleи других) — лечатся обновлением продукта, обращаться в поддержку вендора. - Ошибки в модулях Маркетплейса — обновлением решения, дальше к разработчику модуля.
- Ошибки в своих шаблонах и компонентах — чинит тот, кто их писал, или подрядчик.
Если сайт делали давно и исходного подрядчика нет, переход превращается в небольшой проект: нужно пройти по всем шаблонам и своим компонентам. Мы такие переходы делаем — техническая поддержка сайта.
Частые вопросы
Можно ли сразу перейти с PHP 7.4 на 8.3?
Можно, но сначала нужно обновить само ядро и модули на старой версии PHP. Обновления выпускаются с расчётом на поддерживаемые версии PHP: если сначала переключить версию, а потом обновляться, обновление может не установиться — и чинить придётся обе проблемы сразу.
Что будет, если остаться на PHP 8.1?
Сайт продолжит работать, но обновления продукта ставиться не будут: вендор ограничил поддержку версий ниже 8.2 с 1 февраля 2026 года. Это значит ни исправлений безопасности, ни нового функционала — а именно через известные уязвимости сайты и взламывают.
Сайт упал сразу после переключения версии. Что делать первым делом?
Вернуть прежнюю версию PHP — сайт поднимется. Дальше разбираться спокойно: включить вывод ошибок на копии сайта, собрать список несовместимостей, починить их и только потом переключаться снова. Переключение версии PHP обратимо, в отличие от обновления базы.
Как понять, какие модули не готовы к PHP 8?
Включите на копии сайта вывод ошибок и пройдите по основным сценариям: главная, каталог, корзина, оформление заказа, административная часть. Ошибки с путями вида /bitrix/modules/вендор.модуль/ — это сторонние решения, их чинит разработчик модуля. Ошибки в /bitrix/modules/main/ и других модулях вендора лечатся обновлением.
После обновления PHP пропали цены в каталоге, хотя в карточке они есть.
Похоже на несовместимость в модуле каталога или в своём шаблоне, где цена приходит не того типа. Сначала обновите продукт до актуальной версии: такие вещи вендор чинит. Если не помогло, включите вывод ошибок на копии и смотрите, что падает при выводе цены.
Сайт работает, а задания cron падают с ошибкой синтаксиса.
У консольного PHP своя версия: сайт переключили, а задания остались на старой. Сообщение про неожиданный «::» означает, что старый интерпретатор не понимает синтаксис свежего ядра. Поправьте путь к интерпретатору в заданиях.