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

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С-Битрикс такие вызовы чаще всего приходят из обработчиков событий: модуль подписывается на событие, а ядро вызывает его метод статически. Имя класса в тексте ошибки сразу показывает виновника.

Как найти виновный модуль

  1. Посмотрите на имя класса в сообщении: у модулей Маркетплейса оно обычно начинается с префикса вендора.
  2. Найдите сам модуль: /bitrix/modules/вендор.модуль/. Имя файла, где объявлен класс, подскажет поиск по каталогу модуля.
  3. Проверьте, есть ли для модуля обновление: раздел обновления решений в административной части.

Правильное исправление

В объявлении метода добавляется модификатор:

public static function checkBack()

Делать это должен разработчик модуля в своём обновлении. Ваша последовательность такая:

  1. Обновите решение из Маркетплейса — часто этого достаточно.
  2. Если обновления нет, напишите разработчику модуля: контакты есть на странице решения, вкладка поддержки.
  3. Пока ждёте, можно временно отключить модуль, если сайт без него работает, или внести правку вручную — и записать её, чтобы вернуть после обновления.

Если модулей много

На сайте с десятком решений из Маркетплейса такие ошибки идут пачкой. Разумнее сначала обновить все решения разом на прежней версии PHP, и только потом переключать PHP: так список оставшихся проблем сократится в разы. Порядок перехода целиком — в инструкции про переход на PHP 8.

Частые вопросы

Можно дописать static прямо в файле модуля?

Технически да, и сайт заработает. Но при первом же обновлении модуля файл перезапишется и ошибка вернётся — обычно в самый неудобный момент. Правка допустима как временная мера, пока ждёте обновление, и её нужно записать, чтобы не забыть повторить.

Модуль куплен давно, разработчик не отвечает. Что делать?

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

Ошибка указывает на модуль вендора, а не на сторонний. Это нормально?

Значит продукт обновлён не до конца. Обновите ядро и модули на прежней версии PHP, затем переключайте версию заново — вендор такие несовместимости в своих модулях чинит.