Ограничения — это механизм, который решает, показывать способ доставки покупателю или спрятать. Именно они превращают набор служб в корзине в осмысленный список, где курьер не предлагается для другого города, а самовывоз не всплывает при заказе на 300 килограммов.
Что такое ограничения и зачем они нужны
В новой системе доставки 1С-Битрикс (модуль sale) каждая служба доставки имеет вкладку «Ограничения». Ограничение — это условие, при выполнении которого служба остаётся доступной на этапе оформления заказа. Если хотя бы одно условие не выполнено, служба исчезает из списка выбора в корзине.
Технически ограничения — это отдельные обработчики, наследники класса \Bitrix\Sale\Delivery\Restrictions\Base. Их данные хранятся в таблице b_sale_delivery_rstr и привязаны к конкретной службе по её ID. При расчёте отгрузки система прогоняет корзину через все привязанные ограничения и оставляет только те службы, которые прошли проверку.
Типовые ограничения из коробки
Битрикс поставляет набор готовых обработчиков, которых хватает большинству магазинов. Классы лежат в bitrix/modules/sale/lib/delivery/restrictions/.
| Ограничение | Класс-обработчик | Когда применять |
|---|---|---|
| По местоположению | ByLocation | Курьер только в своём городе или регионе |
| По весу | ByWeight | Скрыть курьера для тяжёлых заказов |
| По сумме заказа | ByPrice | Условия для минимальной или крупной покупки |
| По габаритам | ByDimensions | Постаматы и ПВЗ с лимитом размера |
| По способу оплаты | ByPaySystem | Наложенный платёж только для части служб |
| По публичности | ByPublicMode | Спрятать служебную доставку от покупателя |
Каждое ограничение настраивается своим окном параметров: для веса и суммы задаются диапазоны «от» и «до», для местоположения выбираются города или группы местоположений, для оплаты — конкретные платёжные системы.
Где и как настраивать
Путь в админке: Магазин → Настройки → Службы доставки. Открываете нужную службу и переходите на вкладку «Ограничения». Здесь виден список уже добавленных условий и кнопка добавления нового.
- Нажмите «Добавить ограничение» и выберите тип из выпадающего списка.
- Заполните параметры — например, для «По весу» укажите диапазон в граммах.
- Сохраните службу; условие сразу вступает в силу для новых расчётов.
Порядок настройки типичной курьерской службы: сначала ограничиваете её по местоположению (свой город), затем добавляете верхний порог по весу, а для дорогих заказов — минимальную сумму. Такой набор из трёх условий закрывает большинство реальных сценариев.
Как работает логика проверки
Ключевое правило: несколько ограничений на одной службе работают по логике «И» (AND). Служба показывается, только если пройдены все условия одновременно. Нельзя настроить «показать, если вес до 5 кг ИЛИ сумма больше 10 000» на уровне одной службы — для «ИЛИ» создают две разные службы или два профиля.
Проверка выполняется методом check() каждого обработчика в момент, когда система собирает список доступных служб для отгрузки — обычно это \Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList(). Внутри учитывается состав корзины: суммарный вес позиций, итоговая цена, выбранное местоположение и способ оплаты.
- Ограничения на группе наследуются всеми её профилями.
- Профиль может иметь собственные, более узкие условия поверх групповых.
- Если по ограничению нельзя однозначно решить (нет данных о местоположении), служба обычно остаётся видимой до уточнения адреса.
Собственные ограничения через код
Когда штатных условий не хватает — например, нужно скрывать доставку для товаров определённого раздела или для оптовых групп пользователей — пишут свой обработчик. Он наследует \Bitrix\Sale\Delivery\Restrictions\Base и реализует метод check(), возвращающий true или false.
Класс регистрируется в системе через событие модуля sale — onSaleDeliveryRestrictionsClassNamesBuildList. После регистрации новый тип появляется в том же выпадающем списке на вкладке «Ограничения», и его можно настраивать через админку как штатный.
- Метод
getClassTitle()задаёт название в списке. - Метод
getParamsStructure()описывает поля настройки. - В
check()доступен объект отгрузки — из него берут корзину, свойства заказа и пользователя.
init.php так, чтобы он переживал обновления. Правки в ядре bitrix/modules/sale/ недопустимы — они затираются при апдейте.Типичные ошибки и как их избежать
Большинство проблем с ограничениями сводится к нескольким повторяющимся ситуациям.
- Единицы измерения. Вес в ограничениях задаётся в граммах, а не килограммах. Порог «5000» — это 5 кг, а не 5 тонн.
- Пустой вес товаров. Если у части каталога не заполнено свойство веса, ограничение
ByWeightсчитает такие позиции как ноль и пропускает заказ, который по факту тяжёлый. - Кеш служб доставки. После изменения условий очищайте кеш — иначе покупатель какое-то время видит старый список.
- Конфликт с оплатой. Ограничение по способу оплаты работает в паре с настройками платёжных систем; проверяйте обе стороны, иначе связка «доставка + оплата» рвётся.
Перед запуском обязательно прогоняйте тестовые заказы из разных городов и с разным весом корзины — это быстрее, чем ловить жалобы покупателей.
Итог
Ограничения — это фильтр, который делает выбор доставки в корзине честным: покупатель видит только реально доступные ему способы. Штатные обработчики закрывают вес, сумму, местоположение, габариты и оплату, а логика «И» позволяет собирать точные комбинации из нескольких условий. Для нестандартных правил всегда есть путь через собственный обработчик на базе Restrictions\Base.
Если условия доставки в вашем магазине разрослись до десятков служб и профилей, а покупатели путаются в вариантах, мы поможем навести порядок — от аудита текущих ограничений до разработки собственных обработчиков и интеграций. Это наша ежедневная работа с проектами на 1С-Битрикс.
Частые вопросы
Что произойдёт, если у службы нет ни одного ограничения?
Служба будет предлагаться всем покупателям без условий — для любого города, веса и суммы. Это нормально для универсального способа вроде Почты России, но опасно для локального курьера.
Как работают несколько ограничений на одной службе?
Они объединяются по логике «И»: служба показывается, только если выполнены все условия сразу. Для сценария «или-или» нужно создавать отдельные службы или профили.
В каких единицах задаётся ограничение по весу?
Вес указывается в граммах. Чтобы ограничить курьера пятью килограммами, в поле порога вписывают 5000.
Почему тяжёлый заказ проходит ограничение по весу?
Скорее всего, у части товаров не заполнено свойство веса. Незаполненные позиции считаются нулевыми, и суммарный вес корзины оказывается ниже реального.
Можно ли скрывать доставку по способу оплаты?
Да, за это отвечает ограничение по платёжным системам. Учтите, что оно работает в связке с настройками самих платёжных систем, поэтому проверять нужно обе стороны.
Как добавить своё условие, которого нет в списке?
Нужно написать класс-наследник Restrictions\Base с методом check() и зарегистрировать его через событие onSaleDeliveryRestrictionsClassNamesBuildList. После этого тип появится в админке.
Наследуются ли ограничения профилями внутри службы?
Да, условия родительской группы действуют на все её профили. Профиль может дополнительно иметь собственные, более узкие ограничения.
Почему изменения ограничений не видны в корзине сразу?
Обычно виноват кеш служб доставки. После правки условий очистите кеш модуля sale, и обновлённый список подтянется корректно.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.