Удивительно, но в 2022 у битрикса всё ещё большие проблемы с такой тривиальной вещью как разграничение типа цены по городам (замените на филиал/склад или иное условие зависящее от какой-то настройки или параметра в админке).
Рассматриваемый пример: есть интернет-магазин на БУС.Бизнес. сайт работает на одном домене на 3 города, в каждом городе свой склад и своя политика цен. Но каталог товаров общий. Смена города для покупателя реализована через Инфоблок "Города" в котором созданы 3 города, и добавлены свойства привязки склада, типа цены, и ID группы пользователей. При выборе или переключении города, выбранная позиция сохраняется в сессионный кэш сервера, а также записывается в глобальную переменную, откуда потом берутся значения для фильтров в параметры компонентов, требующих указание типа цены или склада. Это всё работает, то есть сделать отображение каталога с товарами по выбранному типу цены для города - не сложно.
Проблема возникает при настройке работы корзины. Корзина учитывает все доступные покупателю типы цен и автоматически выбирает наименьший тип цены и далее от него рассчитывает дополнительные скидки, если они есть. Никаких удобных средств повлиять на список цен, учитываемых в корзине - нет. У типа цены нет привязок ни к складу, ни к какому либо иному параметру интернет-магазина. Только к группам пользователей.
Есть обработчик события [B]OnGetOptimalPrice[/B], но он не позволяет просто изменить список входящих параметров (хотя некоторые его используют для этих целей), а требует полностью написать алгоритм вычисления нужной цены. То есть используя его требуется учесть все возможные механизмы скидок, купонов, наценок и прочего и фактически заново написать алгоритм расчёта цены. А значит для нашей задачи он не подходит.
Есть вариант на ходу менять группу пользователя, меняющего города и дать доступ к ценам только пользователям из соответствующей группы. Но тогда мы лишаем возможности анонимных покупателей добавлять товары в корзину, так как для них невозможно записать группу в БД. Кроме того, этот функционал также добавляет ошибку описанную в [URL=https://dev.1c-bitrix.ru/support/forum/forum6/topic110477/]этом посте[/URL], а именно - [B]Ошибка проверки доступного количества товара. [/B]Я не успел докопаться до проблемы но в моём случае была 4я цена созданная в магазине при установке БУСа и она не использовалась (значения были пустые) и когда я настроил права доступа по группам, все товары у которых была эта цена пустой, перестали добавляться в корзину выдавая эту ошибку. добавление в корзину вызывалось методом [B]\Bitrix\Catalog\Product\Basket::addProduct[/B]
В общем хлебнул я проблем за последние пару дней не мало с этой настройкой. Поэтому создаю тему в надежде что найдутся умные люди кто уже реализовывал данный функционал с наименьшими проблемами и без модификаций ядра и сторонних модулей.
Если вдруг кто-то знает способ как до формирования цены в корзине перехватить и изменить массив передаваемых туда цен - буду очень благодарен.
Для разработчиков, на мой взгляд, ничего не стоит добавить обработчик вроде [B][COLOR=#ff0000]BeforeGetOptimalPrice[/COLOR][/B] в котором можно было бы посмотреть приходящие в него параметры и изменить их. В моём случае было бы достаточного пары строчек кода - получить ид типа цены из глобального массива и передать его на вход событию, и всё. Это решило бы множество проблем с которыми сейчас сталкиваются разработчики при настройке такого функционала.
В общем если кто-то может помочь решить задачу - welcome. Когда всё заработает я опишу в подробностях и с примерами как что надо делать для других пытливых умов.
Рассматриваемый пример: есть интернет-магазин на БУС.Бизнес. сайт работает на одном домене на 3 города, в каждом городе свой склад и своя политика цен. Но каталог товаров общий. Смена города для покупателя реализована через Инфоблок "Города" в котором созданы 3 города, и добавлены свойства привязки склада, типа цены, и ID группы пользователей. При выборе или переключении города, выбранная позиция сохраняется в сессионный кэш сервера, а также записывается в глобальную переменную, откуда потом берутся значения для фильтров в параметры компонентов, требующих указание типа цены или склада. Это всё работает, то есть сделать отображение каталога с товарами по выбранному типу цены для города - не сложно.
Проблема возникает при настройке работы корзины. Корзина учитывает все доступные покупателю типы цен и автоматически выбирает наименьший тип цены и далее от него рассчитывает дополнительные скидки, если они есть. Никаких удобных средств повлиять на список цен, учитываемых в корзине - нет. У типа цены нет привязок ни к складу, ни к какому либо иному параметру интернет-магазина. Только к группам пользователей.
Есть обработчик события [B]OnGetOptimalPrice[/B], но он не позволяет просто изменить список входящих параметров (хотя некоторые его используют для этих целей), а требует полностью написать алгоритм вычисления нужной цены. То есть используя его требуется учесть все возможные механизмы скидок, купонов, наценок и прочего и фактически заново написать алгоритм расчёта цены. А значит для нашей задачи он не подходит.
Есть вариант на ходу менять группу пользователя, меняющего города и дать доступ к ценам только пользователям из соответствующей группы. Но тогда мы лишаем возможности анонимных покупателей добавлять товары в корзину, так как для них невозможно записать группу в БД. Кроме того, этот функционал также добавляет ошибку описанную в [URL=https://dev.1c-bitrix.ru/support/forum/forum6/topic110477/]этом посте[/URL], а именно - [B]Ошибка проверки доступного количества товара. [/B]Я не успел докопаться до проблемы но в моём случае была 4я цена созданная в магазине при установке БУСа и она не использовалась (значения были пустые) и когда я настроил права доступа по группам, все товары у которых была эта цена пустой, перестали добавляться в корзину выдавая эту ошибку. добавление в корзину вызывалось методом [B]\Bitrix\Catalog\Product\Basket::addProduct[/B]
В общем хлебнул я проблем за последние пару дней не мало с этой настройкой. Поэтому создаю тему в надежде что найдутся умные люди кто уже реализовывал данный функционал с наименьшими проблемами и без модификаций ядра и сторонних модулей.
Если вдруг кто-то знает способ как до формирования цены в корзине перехватить и изменить массив передаваемых туда цен - буду очень благодарен.
Для разработчиков, на мой взгляд, ничего не стоит добавить обработчик вроде [B][COLOR=#ff0000]BeforeGetOptimalPrice[/COLOR][/B] в котором можно было бы посмотреть приходящие в него параметры и изменить их. В моём случае было бы достаточного пары строчек кода - получить ид типа цены из глобального массива и передать его на вход событию, и всё. Это решило бы множество проблем с которыми сейчас сталкиваются разработчики при настройке такого функционала.
В общем если кто-то может помочь решить задачу - welcome. Когда всё заработает я опишу в подробностях и с примерами как что надо делать для других пытливых умов.