Почему не работают скидки для некоторых пользователей: ошибка провайдера товаров в корзине
Как-то была проблема, плавающая, что для некоторых пользователей не считались скидки на товары, очень редкая. При заходе под этим же пользователем скидки отображались нормально.
Такая ситуация повторялась изредка и не удавалось выяснить причину.
Но тут на днях таких заказов стало больше, люди жаловались. Проверка настроек скидок, пересечений, ограничений ни к чему не привела.
Но появилось одно НО. При заходе под пользователем, который сообщил об ошибке, скидки действительно не считались, добавляя эти же товары под своим аккаунтом в режиме инкогнито и без него — все считалось.
Путем долгих часов попыток выяснить, куда деваются скидки, почему они не применяются, поломав голову не раз, удалось выяснить, что проблема в том, что в корзине пользователя есть товары, которые были добавлены 3 года назад. И есть свежие.
И причина оказалась в разной работе провайдеров. Для старых товаров провайдер был - CCatalogProductProvider а для новых \Bitrix\Catalog\Product\CatalogProvider
Заменив принудительно в таблице название класса провайдера, все стало работать как положено.
Решение
Нужно всего лишь выполнить в админке sql запрос, именно в таком виде, с двойными слешами здесь - /bitrix/admin/sql.php
update b_sale_basket
set PRODUCT_PROVIDER_CLASS = '\\Bitrix\\Catalog\\Product\\CatalogProvider'
where PRODUCT_PROVIDER_CLASS='CCatalogProductProvider';