Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Эта публикация написана после неоднократных обращений как клиентов, так и (к горести моей) партнеров. Темы обращений были разные, но причиной в итоге оказывался один и тот же сценарий, реализуемый как через админку, так и через api.Все обращения можно было разбить на три группы:
1. Резкий рост объема базы, конкретно - таблицы b_sale_order_discount. Что характерно, правил корзины на сайте немного.
2. Долгое время работы компонентов корзины и заказа, а в случае включения режима "Использовать только правила корзины" - еще и увеличение времени генерации страниц каталога. Обязательный (но недостаточный) признак - большое число товаров на сайте (более 1000). Хотя причин такого поведения может быть множество и скидки - только одна, зачастую не самая важная.
3. Жалобы на затрудненную работу контент-менеджера (много времени уходит на настройку правил корзины, особенно при использовании пресетов). Дополнительная проблема (при большом количестве торговых предложений) - долго грузится форма выбора товара (пока эта проблема в стадии решения, увы).
Рассматривать будем на примере правил корзины, но для старых скидок на товары (модуля Торговый каталог) все аналогично.
Быстрый анализ выявляет несколько правил корзины с условиями вида (товаров в одном правиле - несколько десятков, а то и сотен(!)):
без использования пресетов
![screen-no-presets.png](https://opt-99999999.ssl.1c-bitrix-cdn.ru/resize_cache/8609381/04dbd6b4c314fe48f655aad84339ad15/main/191/19108e003aece0e226397e54f96ffb9f/screen-no-presets.png)
также без использования пресетов (наихудший вариант, как правило при создании через api)
![screen-no-presets-api.png](https://opt-99999999.ssl.1c-bitrix-cdn.ru/resize_cache/8609379/04dbd6b4c314fe48f655aad84339ad15/main/c0a/c0ac8a56d63344a6c22b43c3f9ac9fb7/screen-no-presets-api.png)
с пресетами
![screen-with-presets.png](https://opt-99999999.ssl.1c-bitrix-cdn.ru/resize_cache/8609377/04dbd6b4c314fe48f655aad84339ad15/main/7fb/7fb4d2d65fa26b2afc734f1e2a285844/screen-with-presets.png)
Т.е. условием применения правила выступает ID товара. Это самый простой вариант, который может быть использован лишь в случае небольшого магазина либо, например, для разовой акции на конкретные товары. Для ситуации, когда объем товарной номенклатуры велик, либо постоянно меняется (часто заводятся новые позиции, удаляются/деактивируются старые) настройка правил корзины должна быть иной.
Итак, первое, что нужно сделать - завести для инфоблока товаров (или инфоблока предложений - зависит от того, могут ли разные правила применяться к разным предложениям одного и того же товара) свойство типа Строка, Число или Список. Какой тип выбрать - определяется тем, сколько величин скидок планируется. Если скидок немного, их значения не меняются - тогда выберите списочное свойство. Если же магазин большой (с разделением прав между сотрудниками) либо планируется периодически расширять набор правил - берите свойство типа Число. Тип Строка универсальней, но потребует аккуратности:
Для типа Список
![screen-list-01.png](https://opt-99999999.ssl.1c-bitrix-cdn.ru/resize_cache/8609775/04dbd6b4c314fe48f655aad84339ad15/main/7bc/7bc970e004e15b39bd894212b3481a04/screen-list-01.png)
![screen-list-02.png](https://opt-99999999.ssl.1c-bitrix-cdn.ru/resize_cache/8609759/04dbd6b4c314fe48f655aad84339ad15/main/21b/21baed4a1e3a3b4cfd258c32050306a5/screen-list-02.png)
настройка правил (отказываемся от пресетов) - на скриншотах ниже пример настройки ДВУХ правил. Можно объединить их в одно, но пока (sale 18.5.5, catalog 18.5.5) нет возможности показа таких правил (с несколькими действиями в одном правиле) в каталоге (важно!).
![screen-list-03.png](https://opt-99999999.ssl.1c-bitrix-cdn.ru/resize_cache/8609869/04dbd6b4c314fe48f655aad84339ad15/main/9e9/9e9374b90f40046118c2edeac201c35d/screen-list-03.png)
![screen-list-04.png](https://opt-99999999.ssl.1c-bitrix-cdn.ru/resize_cache/8609865/04dbd6b4c314fe48f655aad84339ad15/main/4b0/4b0e60ae6814094117aaf30be3e66cda/screen-list-04.png)
Для полей типа Число или Строка
![screen-number-01.png](https://opt-99999999.ssl.1c-bitrix-cdn.ru/resize_cache/8610039/04dbd6b4c314fe48f655aad84339ad15/main/1a4/1a49c6b249cc39c141d6b84c6a2ab6b1/screen-number-01.png)
заполняем свойство значением для товара
![screen-number-02.png](https://opt-99999999.ssl.1c-bitrix-cdn.ru/resize_cache/8610037/04dbd6b4c314fe48f655aad84339ad15/main/f13/f1324ed76075e7ae506ae5d2a51e9fc0/screen-number-02.png)
настройка правила
![screen-number-03.png](https://opt-99999999.ssl.1c-bitrix-cdn.ru/resize_cache/8610035/04dbd6b4c314fe48f655aad84339ad15/main/57e/57e69c8f525a55560751d76e827b05a1/screen-number-03.png)
Для типа Строка аналогично типу Число, за исключением того, что можно писать что-то вида
![screen-string-01.png](https://opt-99999999.ssl.1c-bitrix-cdn.ru/resize_cache/8610151/04dbd6b4c314fe48f655aad84339ad15/main/2d5/2d50aab7c9542ea97fe57354b7ad5438/screen-string-01.png)
верное значение для правила
![screen-string-02.png](https://opt-99999999.ssl.1c-bitrix-cdn.ru/resize_cache/8610149/04dbd6b4c314fe48f655aad84339ad15/main/2a2/2a243826383a395f53d1b1c06ced0d51/screen-string-02.png)
и ошибочное (точка в конце - не сработает, т.к. нужно точное совпадение)
![screen-string-03.png](https://opt-99999999.ssl.1c-bitrix-cdn.ru/resize_cache/8610145/04dbd6b4c314fe48f655aad84339ad15/main/ec6/ec6af0af851715a6b589e21e97d50e36/screen-string-03.png)
Собственно, на этом все. Подведу итоги. Условие "Товар равен" может использоваться при небольших объемах либо для разовых акций. Для остальных случаев настоятельно рекомендуется использовать способ, показанный выше. В чем его преимущество? Условия правил корзины короче, их нет нужды перенастраивать при изменении номенклатуры. Применится правило или нет, определяет значение свойства - тут спокойно отработает и обмен с 1С, и csv-импорт, и быстрое редактирование в списке элементов. Нет роста объема базы, быстрее работа.