sql_mode после обновления MySQL: ONLY_FULL_GROUP_BY и что делать на сервере с Битрикс
Откуда берётся ошибка
С версии MySQL 5.7.5 в стандартный набор включили ONLY_FULL_GROUP_BY. Движок требует, чтобы каждая колонка в списке SELECT при наличии GROUP BY либо входила в группировку, либо однозначно выводилась из группы через агрегат. Старый SQL с «случайной» недетерминированной колонкой теперь падает с сообщением вида:
Expression #… of SELECT list is not in GROUP BY clause and …
… incompatible with sql_mode ONLY_FULL_GROUP_BYВ экосистеме 1С‑Битрикс это не только «чужие» CMS‑плагины — любой произвольный отчёт, сырой $DB->Query или обмен может годами жить без группировки «по правилам», пока режим сервера мягкий.
Правильный долгосрочный ответ
Исправить текст запроса: добавить недостающие поля в GROUP BY, завернуть «лишнее» в MAX()/MIN() осознанно, переписать подпроекцию. Так вы не ломаете семантику отчётов после следующего патча или смены движика на другую ветку MariaDB или другую сборку Bitrix‑ВМ.
Где узнать фактический sql_mode
SELECT @@GLOBAL.sql_mode AS global_mode,
@@SESSION.sql_mode AS session_mode;Для сравнения с тем, как сервер был запущен, полезно глянуть цепочку конфигов, которую парсит mysqld (пути зависят от дистрибутива):
mysqld --verbose --help 2>/dev/null | grep -A1 '^Default options'Обычно в списке фигурируют /etc/my.cnf, /etc/mysql/my.cnf и пользовательский ~/.my.cnf — править нужно именно активный файл для вашей службы (mysqld или mariadb).
Временное ослабление на уровне сервера
Если бизнесу нужно «остановить кровотечение» до релиза фиксов, из строки режимов убирают ONLY_FULL_GROUP_BY и задают остальное без изменений, например секциями:
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONТочный набор ключей должен совпасть с тем, что вы сняли у себя оператором SELECT @@GLOBAL.sql_mode, только без удаляемого флага. После сохранения — перезапуск службы БД (systemctl restart mysql или эквивалент хостинга).
Риски: вы снова разрешаете недетерминированные результаты в группировках; возможны расхождения между стендом без ослабления и боем.
Связка с Битрикс
Не смешивайте правку режима без аудита модулей: маркетплейсовые решения могут генерировать «старый» SQL. Держите хотя бы один стенд с жёстким ONLY_FULL_GROUP_BY, чтобы ловить регрессии до продакшена.
Итог
ONLY_FULL_GROUP_BY — сигнал, что группировку надо поправить в запросах; глобальное выключение в my.cnf оставляйте временной мерой под контролем сроков, а не постоянным «решением» для сайта на 1С‑Битрикс.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии