Цифровой элемент

Сайт использует файлы cookie для удобства работы, аналитики и рекламы. Нажимая «Принять» или продолжая пользоваться d-element.ru, вы соглашаетесь с нашей Политикой конфиденциальности и обработкой персональных данных (включая файлы cookie).

15 минут на чтение
22058
Отправь статью на почту?

Обновление сайта на 1C-Битрикс на PHP 8.x: пошаговая инструкция

Вначале года компания 1С-Битрикс выпустила обновления для всех модулей и штатных компонентов, чтобы они могли работать с PHP 8. Пару месяцев назад они начали активно подталкивать разработчиков сторонних решений к обновлению кода своих продуктов. И сейчас это уже практически обязательная мера, вплоть для устранения решения, если оно не поддерживает версию PHP 8. А с августа 2023 года получать обновления платформы 1С-Битрикс не на PHP 8 уже невозможно.

Многие владельцы сайтов на CMS Bitrix уже столкнулись с появлением красной строки в административной панели, призывающей к обновлению.

Строка объявления о необходимости перехода на PHP 8.png

Седьмая версия PHP объявлена устаревшей и не поддерживается. Что это значит?

  1. Для неё не выпускают исправления функциональных ошибок.
  2. Для неё не выпускают решения для исправления ошибок безопасности.
  3. А не обновленные модули платформы подвержены уязвимостям, о которых мы писали в нашей статье ранее «Атака на сайты на 1С-Битрикс»

Получается, что переходить на PHP 8 – обязательно. Но если просто в панели управления хостингом изменить настройки и выбрать актуальную 8-ую версию, то сайт скорее всего сломается. В новой версии PHP изменились требования к написанию кода. То, что было допустимо в версии 7.4, теперь вызывает ошибки и приводит к сбоям работы сайта. Это означает, что весь код на вашем сайте должен соответствовать новым стандартам. Особенно это касается сторонних компонентов, шаблонов и модулей, установленных из Маркетплейса Bitrix. Вот здесь заключается настоящая проблема.

Мы предлагаем два подхода к обновлению – стандартный, рекомендуемый и нестандартный, к которому в некоторых случаях приходится прибегать.

Пошаговая инструкция для обновления сайта на PHP 8 – стандартный подход

При переходе сайтов, использующих 1C-Битрикс, на PHP 8.x, необходимо учесть ряд особенностей. В данной статье будет представлена пошаговая инструкция, которая поможет вам успешно выполнить этот процесс.

Шаг 1: Подготовка

Перед началом перехода на PHP 8.x, убедитесь, что ваша версия 1C-Битрикс обновлена до последней доступной версии. Для этого вам нужна активная поддержка на вашей лицензии. Если она закончилась, продлите ее, купив ее за 25% от стоимости лицензии. Редакцию вашей лицензии можно проверить в разделе /bitrix/admin/update_system.php?lang=ru в секции "Ответ сервера обновлений".

image003.png <

Шаг 2: Совместимость модулей и компонентов

Перед обновлением PHP до версии 8.x, убедитесь, что все используемые вами модули и компоненты 1C-Битрикс совместимы с этой версией PHP, как платные, так и бесплатные. Для этого вы можете воспользоваться специальным инструментом, предоставляемым 1C-Битрикс – «Проверка системы». Этот инструмент поможет вам определить, какие модули и компоненты нуждаются в обновлении или замене.

Если лицензия на какое-то решение истекла, ее также нужно обновить. Стоимость продления обычно составляет 50% от стоимости решения. Подробности можно найти на странице Маркетплейса, кликнув по названию решения.

Шаг 3: Резервное копирование

Перед обновлением PHP рекомендуется сделать полное резервное копирование вашего сайта, чтобы в случае каких-либо проблем можно было бы вернуться к предыдущей версии.

image005.png


Шаг 4: Обновление PHP до версии 8.x

После выполнения всех подготовительных мероприятий можно приступать к обновлению PHP. Переходите к настройке сервера, выбирая нужную версию PHP.

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

Шаг 5: Исправление ошибок в работе сайта

После перевода сайта на работу на PHP 8 вам потребуется проверить работу всех разделов сайта и в случае ошибок - оперативно их устранить.

Часто встречающиеся ошибки:

  • [TypeError] count(): Argument #1 ($value) must be of type Countable|array, null given (0)
  • Non-static method cannot be called statically
  • [TypeError] call_user_func_array(): Argument #1 ($callback) must be a valid callback, non-static method
  • PHP Fatal error: $GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax
  • [TypeError] Cannot access offset of type string on string (0)
  • и так далее…

Какие исправлять стандартные ошибки написано ниже.

Инструкция для перехода на PHP 8 – нестандартный подход

Этот метод комбинирует шаги первого способа с некоторыми дополнительными действиями. Его следует использовать, если:

  • У вас есть уникальный шаблон;
  • Ваш сайт использует кастомные компоненты;
  • Вы работаете с решениями, которые больше не поддерживаются разработчиками, но необходимы для вашего сайта;
  • Вы вносили изменения в ядро Bitrix;
  • У вас нет возможности или желания обновлять лицензии на сторонние решения.

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

Для начала вам надо выполнить шаги 1 и 3 из стандартного метода.

  1. Создайте полную резервную копию вашего сайта.
  2. Обновите ядро, как в идеальном сценарии. Если вы вносили изменения в ядро или штатные компоненты, перенесите их в папку local.
  3. Обновите все установленные сторонние решения. Если вы вносили изменения в эти решения, также переносите изменения в local.
  4. Включите вывод ошибок в настройках, в файле /bitrix/.settings.php.
  5. Настройте хостинг и активируйте PHP 8.

Как исправлять типовые ошибки перехода с PHP 7.x на PHP 8.x

1. Не статичный метод вызывается статично


[TypeError] 
call_user_func_array(): Argument #1 ($callback) must be a valid callback, non-static method CKladr::SetLocation() cannot be called statically (0)
Решение:
Находим файл, в котором прописан метод CKladr::SetLocation и указываем у него static
Пример:

public static function SetLocation(){
...
}

2. Нет проверки типа данных при использовании функции для определенно типа данных

php 8 стал более строгий, теперь переменные нужно проверять перед использованием методом, относящихся к определенному типу данных


1. Fatal error:  Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, bool given in /home/bitrix/ext_www/cin.ru/bitrix/modules/security/classes/general/antivirus.php:559
Решение:
Делаем проверку типа данных.
Пример 1. Проверка массива:

[TypeError] 
implode(): Argument #2 ($array) must be of type ?array, string given (0)

[TypeError] 
array_key_exists(): Argument #2 ($array) must be of type array, string given (0)

[TypeError] 
count(): Argument #1 ($value) must be of type Countable|array, null given (0)

[TypeError] 
array_filter(): Argument #1 ($array) must be of type array, bool given (0)

[TypeError] 
array_multisort(): Argument #1 ($array) must be an array or a sort flag (0)

[TypeError] 
array_unique(): Argument #1 ($array) must be of type array, null given (0)

[TypeError] 
in_array(): Argument #2 ($haystack) must be of type array, bool given (0)

Решение:

if(is_array($ar) && count($ar)>5){
...
}
Пример 3. Проверка массива:

[TypeError] 
array_key_exists(): Argument #2 ($array) must be of type array, string given (0)

Решение:

if(!array_key_exists($arFirstLvl, $arItem['IBLOCK_SECTION_ID'])){

меняем на 

if(is_array($arItem['IBLOCK_SECTION_ID']) && !array_key_exists($arFirstLvl, $arItem['IBLOCK_SECTION_ID'])){

Пример 4. Проверка массива:

[TypeError] 
array_filter(): Argument #1 ($array) must be of type array, bool given (0)

Решение:

$arItem['PROPERTIES']['SIMILAR_SWITCH']['VALUE'] = array_filter($arItem['PROPERTIES']['SIMILAR_SWITCH']['VALUE']);
	
меняем на 
	
if(is_array($arItem['PROPERTIES']['SIMILAR_SWITCH']['VALUE'])){
	$arItem['PROPERTIES']['SIMILAR_SWITCH']['VALUE'] = array_filter($arItem['PROPERTIES']['SIMILAR_SWITCH']['VALUE']);
}
Пример 5. Проверка числа:

[TypeError] 
gmdate(): Argument #2 ($timestamp) must be of type ?int, string given (0)

Решение:

header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
		
to

if(intval($lastModified)>0){
	header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
}

3. Не статичный метод не может быть определен как статичный


[Error] 
Non-static method Countrymask\Unitools::isAdminPage() cannot be called statically (0)
Возможно метод по ошибке установлен как static

заменяем 
public static function Location(){
...
}

на 

public function Location(){
...
}

4. Не отображаются наименования сторонних модулей в меню настроек модулей

В стороннем модуле может не быть конструктора и лэнги задаются в методе одноименным с классом. В php 7.4 это работало, но в php 8.1 нужно использовать __construct():

	function recaptchafree()
	{
		$this->MODULE_NAME = GetMessage("CAPTCHA_INSTALL_NAME");
		$this->MODULE_DESCRIPTION = GetMessage("CAPTCHA_INSTALL_DESCRIPTION");
                ...
	}
заменяем на 

	function __construct()
	{
		$this->MODULE_NAME = GetMessage("CAPTCHA_INSTALL_NAME");
		$this->MODULE_DESCRIPTION = GetMessage("CAPTCHA_INSTALL_DESCRIPTION");
                ...
	}

5. Ключ в массиве, заданный без кавычек, будет обрабатываться как константа.

Если константа не определена, то появляется соответствующая ошибка:

Undefined constant "HTTP_USER_AGENT" (0)
Самая частая ошибка, обязательно у ключа в ассоциативном массиве должны быть кавычки:

$_SERVER[HTTP_USER_AGENT] 

заменяем на 

$_SERVER['HTTP_USER_AGENT'] 

6. В некоторых функциях обязательно должен быть задан аргумент.


[ArgumentCountError] 
mktime() expects at least 1 argument, 0 given (0)
Пример:

заменяем 
mktime() 
на 
mktime(0)

7. Синтаксис доступа к смещению массива и строки с фигурными скобками больше не поддерживается.


[ErrorException] E_COMPILE_ERROR
Array and string offset access syntax with curly braces is no longer supported (0)
Пример:

$type0 = $type{0};	 
	
меняем на 

if(!is_array($type[0])){	
      $type0 = $type[0];
}	

8. На php 8.0 работает, ошибки php показывает, но на php 8.1 выдает 502 Bad Gateway

В модуле Проактивная защита ставим исключение: Маски исключения: /bitrix/*

Другие ошибки

 Ошибка:Undefined constant BX_RESIZE_PROPORTIONAL_ALT (0)
Код: $arImg = CFile::ResizeImageGet($arSubItemImg, array('width' => 60, 'height' => 60), BX_RESIZE_PROPORTIONAL_ALT);
Решение: $arImg = CFile::ResizeImageGet($arSubItemImg, array('width' => 60, 'height' => 60), BX_RESIZE_IMAGE_PROPORTIONAL_ALT);
 Ошибка:implode(): Argument #2 ($array) must be of type ?array, string given (0)
Код: $arImg = $arOfferProps = implode(';', $arParams['OFFERS_CART_PROPERTIES']);
Решение: $offersСartProperties = !empty($arParams['OFFERS_CART_PROPERTIES']) && is_array($arParams['OFFERS_CART_PROPERTIES']) ? $arParams['OFFERS_CART_PROPERTIES'] : [];
	 $arOfferProps = implode(';', $offersСartProperties);
Ошибка:in_array(): Argument #2 ($haystack) must be of type array, bool given (0)
Код: if(in_array($arCurrentOffer['TREE'][$strName], $arShowValues))
Решение: if(is_array($arShowValues) && in_array($arCurrentOffer['TREE'][$strName], $arShowValues))

Проверка работоспособности сайта

После обновления PHP до версии 8.x рекомендуется протестировать работу вашего сайта. Обратите внимание на работу всех компонентов, функциональность сайта и взаимодействие с базой данных.

Если при проверке работоспособности сайта обнаружены какие-либо проблемы, связанные с переходом на PHP 8.x, необходимо выполнить дополнительные действия для их устранения. Обычно это включает в себя обновление модулей и компонентов, переписывание кода, исправление ошибок и так далее.

Если при проверке системы, вы видите только белый экран, откройте исходный код сочетанием клавиш Ctrl + U и посмотрите каждую страницу сайта.

Обязательно проведите тщательную проверку интерактивности веб-ресурса. Выполните все функциональные тесты, включая отправку форм, проверку работы калькуляторов и использование поиска на сайте.

Также не забудьте проверить наличие ошибок в консоли (F12) браузера.

Для более глубокой проверки сайта, воспользуйтесь стандартным инструментом в разделе /bitrix/admin/site_checker.php?lang=ru. Здесь вы можете найти полезные подсказки и рекомендации в случае возникновения проблем.

Вывод

Переход сайтов 1C-Битрикс на PHP 8.x может быть сложным процессом, но при правильном подходе и последовательности действий вы сможете успешно выполнить его и обеспечить работу вашего сайта на самой новой версии PHP.

Обратите внимание, что штатный администратор сайта может решить описанные задачи. Однако, в случае более сложных вопросов, потребуются специализированные знания.

Команда компании «Цифровой Элемент» очень давно работает с сайтами на платформе 1С-Битрикс, поэтому наши специалисты обладают профессиональными навыками и основательным опытом в разработке и оптимизации сайтов на этой платформе. Мы предполагаем, какие проблемы могут возникнуть при переходе на PHP 8, сможем их минимизировать или вовсе полностью избежать. А это поможет избежать ненужного простоя сайта и потери потенциальных клиентов.

Обязательно к прочтению:

Мне не нравится
Россия, Челябинская область, Челябинск, ул. Энтузиастов, 2, оф. 200 Телефон: +7 (351) 220-45-35

Читайте в нашем блоге

Все статьи
Свой почтовый сервер для организации: настройка и запуск

Свой почтовый сервер для организации: настройка и запуск

Корпоративная почта на собственном домене давно стала стандартом для любой организации. Однако популярные сервисы — Яндекс 360, VK WorkSpace и ...

27.01.2026
9
Внедрение системы управления персоналом и автоматизация: обзор HRM-систем

Внедрение системы управления персоналом и автоматизация: обзор HRM-систем

Такие системы оптимизируют рутинные операции, ускоряют обработку кадровых процессов и служат фундаментом для развития корпоративной стратегии у...

25.01.2026
3404
Системы управления персоналом или HRM, что это?

Системы управления персоналом или HRM, что это?

Управление персоналом давно вышло за рамки кадрового делопроизводства, превратившись в стратегическую функцию бизнеса. На смену бумажным архива...

21.01.2026
602
Интеграция Битрикс24 и 1С

Интеграция Битрикс24 и 1С

Цифровой Элемент обладает значительным опытом в оптимизации бизнес-процессов за счет интеграции различных веб‑систем, ERP, CRM и ecommerc...

15.01.2026
2479
База знаний в Битрикс24: как создать и использовать для повышения эффективности работы

База знаний в Битрикс24: как создать и использовать для повышения эффективности работы

База знаний в Битрикс24 – это цифровой справочник, который объединяет всю ключевую информацию для сотрудников: регламенты, инструкции, шаблоны ...

10.11.2025
439
Интеграция Авито и Битрикс24: настройка и преимущества

Интеграция Авито и Битрикс24: настройка и преимущества

Интеграция Авито с Битрикс24 позволяет автоматизировать обработку заявок с популярной торговой площадки и синхронизировать их с вашей CRM-систе...

17.10.2025
813
BI Конструктор Битрикс24: как создавать отчеты и анализировать эффективность бизнеса

BI Конструктор Битрикс24: как создавать отчеты и анализировать эффективность бизнеса

BI Конструктор в Битрикс24 заменяет ручной сбор данных и сложные таблицы Excel готовыми отчетами, которые анализируют ваш бизнес за несколько к...

10.10.2025
626
Что такое CRM-система: функциональность и преимущества для бизнеса

Что такое CRM-система: функциональность и преимущества для бизнеса

CRM-система — это инструмент, который помогает бизнесу систематизировать работу с клиентами, от первого контакта до повторных продаж. Это не пр...

02.10.2025
335