Non-static method cannot be called statically: как чинить
Текст ошибки выглядит так:
Fatal error: Uncaught Error: Non-static method CVendorModule::checkBack() cannot be called statically in /home/site/public_html/bitrix/modules/main/classes/general/module.php
Что произошло
В коде метод объявлен как обычный, а вызывается как статический — через :: без создания объекта. PHP 7 на это ругался предупреждением, PHP 8 считает ошибкой и останавливает выполнение.
В 1С-Битрикс такие вызовы чаще всего приходят из обработчиков событий: модуль подписывается на событие, а ядро вызывает его метод статически. Имя класса в тексте ошибки сразу показывает виновника.
Как найти виновный модуль
- Посмотрите на имя класса в сообщении: у модулей Маркетплейса оно обычно начинается с префикса вендора.
- Найдите сам модуль:
/bitrix/modules/вендор.модуль/. Имя файла, где объявлен класс, подскажет поиск по каталогу модуля. - Проверьте, есть ли для модуля обновление: раздел обновления решений в административной части.
Правильное исправление
В объявлении метода добавляется модификатор:
public static function checkBack()
Делать это должен разработчик модуля в своём обновлении. Ваша последовательность такая:
- Обновите решение из Маркетплейса — часто этого достаточно.
- Если обновления нет, напишите разработчику модуля: контакты есть на странице решения, вкладка поддержки.
- Пока ждёте, можно временно отключить модуль, если сайт без него работает, или внести правку вручную — и записать её, чтобы вернуть после обновления.
Если модулей много
На сайте с десятком решений из Маркетплейса такие ошибки идут пачкой. Разумнее сначала обновить все решения разом на прежней версии PHP, и только потом переключать PHP: так список оставшихся проблем сократится в разы. Порядок перехода целиком — в инструкции про переход на PHP 8.
Частые вопросы
Можно дописать static прямо в файле модуля?
Технически да, и сайт заработает. Но при первом же обновлении модуля файл перезапишется и ошибка вернётся — обычно в самый неудобный момент. Правка допустима как временная мера, пока ждёте обновление, и её нужно записать, чтобы не забыть повторить.
Модуль куплен давно, разработчик не отвечает. Что делать?
Варианта три: заменить модуль на живой аналог, переписать нужную функциональность своими силами или поддерживать правку самостоятельно при каждом обновлении. Первый вариант обычно дешевле, хотя выглядит дороже.
Ошибка указывает на модуль вендора, а не на сторонний. Это нормально?
Значит продукт обновлён не до конца. Обновите ядро и модули на прежней версии PHP, затем переключайте версию заново — вендор такие несовместимости в своих модулях чинит.