"Это не баг, это фича" (С) Советы по эффективному маркетингу.
Версия 17.5.4 "main" и 17.0.32 "sale".
В дефолтном компоненте sale.order.ajax есть вот такая настройка. Для тех, кто не открывает левые ссылки при чтении основной статьи: настройка "Когда рассчитывать доставки с внешними системами расчёта". Настройка имеет селект-поле выбора с 3 вариантами выбора:
Не рассчитывать (вариант "угадай сам")
Учитывать настройки доставки
Рассчитывать сразу
Вторая опция (Учитывать настройки доставки) работает с обработчиками доставок, сконструированными с применением высокотехнологичных методов d7. Это значит, что обработчик должен быть унаследован от базового класса Bitrix\Sale\Delivery\Services\Base и быть в пространстве имён Sale\Handlers\Delivery. Подробности в курсе. Больше подробностей в классной статье.
Модуль же ipol.sdek, который на скриншоте у Алексея, написан в соответствии с Ветхим Заветом старым положением вещей и ядра. Без использования неймспейсов вообще, что можно посмотреть в include.php модуля.
В новом варианте описания обработчиков есть метод isCalculatePriceImmediately():bool, который как раз и используется при отмеченной опции "Учитывать настройки доставки".
Ещё подробности для новой системы: 1) Если рассчитываемая внешними сервисами доставка стоит первой в списке, то в самом начале метод рассчёта (calculateConcrete()) будет вызван трижды: при initDelivery(), для recalculatePayment() и из calculateDeliveries(). Поэтому в дополнительных рекомендациях к курсу и есть непрозрачно-однозначный намёк на организацию кэширования. Также это повод переместить нерассчитываемые внешне службы, вроде самовывоза и статического рассчёта, в списке в самый верх.
2) Помимо написания непосредственно обработчика доставки можно написать к нему профили и дополнительные услуги. Как пример - СПСР. Комментариев в коде кот наплакал, но они уже есть!
3) Метод проверки совместимости isCompatible() вызывается до calculateConcrete(), что логично. Но если, например, нужно рассчитывать совместимость, исходя из полей ответа внешнего сервиса, то всегда можно вызвать в переопределяемом методе тот, что нужен. В некоторых случаях этим можно даже заменить ограничения служб доставки, связанные с внешними факторами.
Цитата
Алексей написал: На небольших ИМ эти бесполезные лишние запросы не критичны, а при высокой посещаемости, дают существенную нагрузку + выедают лимиты.
Если есть возможность и время, то возможно Вам поможет кэширование.
Just Ahmed написал: На небольших ИМ эти бесполезные лишние запросы не критичны, а при высокой посещаемости, дают существенную нагрузку + выедают лимиты.
Есть ещё интересный вариант отключения ненужного насовсем (неявно из курса). Если в папку /bitrix/php_interface/include/sale_delivery/ положить пустой файл с именем имеющейся, но ненужной службы доставки (в точности как в /bitrix/modules/sale/delivery/ ), то запросов не будет вообще: т.е. пустые файлы /bitrix/php_interface/include/sale_delivery/delivery_pecom.php /bitrix/php_interface/include/sale_delivery/delivery_cpcr.php
Ребят, еще столкнулся с интересным моментом. Переносил свойства из блока "пользователь" в блок "доставка". Было не просто, но в итоге получилось) Но проявился баг, где его не ждали - отвалились службы доставки с пунктами самовывоза. Мб, кто уже сталкивался и может дать подсказку? А то, чувствую ,еще день ковырять и пытаться внести изменение в одном месте так, чтобы в другом не развалилось.
Юрий Поляков написал: Есть ещё интересный вариант отключения ненужного насовсем (неявно из курса). Если в папку /bitrix/php_interface/include/sale_delivery/ положить пустой файл с именем имеющейся, но ненужной службы доставки (в точности как в /bitrix/modules/sale/delivery/ ), то запросов не будет вообще: т.е. пустые файлы /bitrix/php_interface/include/sale_delivery/delivery_pecom.php /bitrix/php_interface/include/sale_delivery/delivery_cpcr.php
Если при копировании не изменить имя (оставить /bitrix/php_interface/include/sale_payment/yandex), то в настройках платежных систем можно будет использовать только кастомный обработчик. Системный (тот, который копировался) не будет доступен, то есть кастомный обработчик подменяет системный.
baltika написал: Подскажите, как с помощью OnSaleComponentOrderJsData отловить город который выбирает пользователь? в arResult не видел такого.
Город отбирает отдельный компонент. В JS можно посмотреть в сторону BX.Sale.component.location (и там либо step либо search в зависимости от того какой способ выбора города выбран). Так же можно напрямую в JS самого шаблона компонента дописать передачу города в ваш скрипт. Написать например у себя в JS метод getCity(res) и его вызывать в JS шаблона компонента выбора города. Помоему на 128 строке там.
Разработчики системы выпустили новый компонент корзины с использованием mustache js шаблонизатором. Возможно, если данный компонент пройдет "положительную" обкатку, они и оформление заказа на него переведут. Когда-нибудь.
P.S Для личный целей переносил логику работы на riot js и preact js. Удовольствие еще то конечно, но зато потом не возникает вопросов что да где и вместо 8К строк одного только order_ajax.js, все аккуратно, разбито на небольшие компоненты.