Бесплатный экспресс-аудит сайта Безопасность, SEO, AI-поиск и 152-ФЗ — отчёт с баллами за минуту Проверить сайт
Обсудить проект

Переход на PHP 8: что ломается в 1С-Битрикс и как это чинить

Переход на новую версию PHP — работа не на пять минут, но и не катастрофа: почти все поломки типовые и лечатся одинаково. Главное — правильный порядок. Сначала обновить продукт на старой версии PHP, потом переключать версию, а не наоборот.

С 1 февраля 2026 года минимальная поддерживаемая версия — PHP 8.2, рекомендуемая — 8.3 и выше. Пока на сервере версия ниже, обновления продукта не установятся: кнопка есть, а обновления не приходят.

Порядок перехода

  1. Сделайте резервную копию файлов и базы и убедитесь, что она разворачивается. Без этого дальше не идите.
  2. Поднимите копию сайта на тестовом домене — переходить будете на ней, а не на бою.
  3. На старой версии PHP обновите ядро и модули до актуальных: в административной части, раздел обновления платформы.
  4. Обновите решения из Маркетплейса — у сторонних модулей свои обновления, и именно они чаще всего ломаются на PHP 8.
  5. На копии переключите PHP на 8.3 и пройдите по сценариям: главная, каталог, корзина, оформление заказа, личный кабинет, административная часть, обмен с 1С.
  6. Соберите список ошибок, почините, повторите проверку.
  7. Повторите переключение на бою в наименее посещаемое время и держите наготове откат версии 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 своя версия: сайт переключили, а задания остались на старой. Сообщение про неожиданный «::» означает, что старый интерпретатор не понимает синтаксис свежего ядра. Поправьте путь к интерпретатору в заданиях.