Перейти к содержимому

Местоположения - импорт, свойство заказа, доставки и индекс

Разбираемся со справочником местоположений: что импортировать, как он попадает в заказ и почему индекс живёт своей жизнью.

Решение

Смотрим, что уже импортировано:

\Bitrix\Main\Loader::includeModule('sale');
$rows = \Bitrix\Sale\Location\LocationTable::getList([
'select' => ['ID', 'CODE', 'TYPE_ID', 'NAME_RU' => 'NAME.NAME'],
'filter' => ['=NAME.LANGUAGE_ID' => 'ru'],
'limit' => 5,
])->fetchAll();
print_r($rows); // пусто - справочник не импортирован, и поле выбора будет пустым
// CODE местоположения - то, на что ссылаются ограничения доставки

Справочник приезжает импортом из админки, а не появляется сам. Пустой справочник выглядит как поломка формы: поле местоположения либо не выводится вовсе, либо не находит ни одного города.

Выбираем глубину импорта осознанно:

страны и регионы - тысячи записей, быстро
города - десятки тысяч, обычный выбор магазина
улицы и дома - миллионы записей, заметно медленнее поиск

Глубину выбирают по задаче доставки. Курьеру и почте хватает города, адрес при этом собирают обычным текстовым полем; улицы нужны там, где по ним считается стоимость или строится маршрут.

Проверяем свойство заказа с местоположением:

$props = \Bitrix\Sale\Internals\OrderPropsTable::getList([
'filter' => ['=TYPE' => 'LOCATION'],
'select' => ['ID', 'PERSON_TYPE_ID', 'CODE', 'REQUIRED', 'IS_LOCATION'],
])->fetchAll();
// у каждого типа плательщика своё свойство: общего на всех не бывает

Отсутствие поля у юридического лица - не ошибка платформы. Свойства принадлежат типу плательщика, и то, что заведено для физического лица, у компании не появится, пока его не заведут отдельно.

Смотрим ограничения службы доставки:

use Bitrix\Sale\Delivery\Services\Manager;
foreach (Manager::getRestrictionsList($deliveryId) as $restriction) {
printf("%-40s %s\n", $restriction['CLASS_NAME'], $restriction['ID']);
}
// среди них и ограничение по местоположению: оно решает, видна ли служба

От местоположения зависит список доставок, а от доставки - набор полей заказа. Эта цепочка объясняет, почему при переносе блока местоположения в конец формы оформление начинает вести себя странно.

Индекс подставляется по выбранному местоположению автоматически, без участия покупателя. При смене службы доставки значение пересчитывается заново, и правка покупателя теряется; сохранять её приходится своим обработчиком события заказа.

Справочник местоположений сам себя не обновляет никогда. Новые города, переименования и изменения границ приезжают только повторным импортом, и делают его руками при изменении географии доставки.

Чистить справочник на боевом сайте нельзя. Удаление местоположений ломает службы доставки и обработку уже оформленных заказов, а после любой правки справочника нужна переиндексация поиска местоположений.

Переносить блок местоположения по форме оформления стоит осторожно. От города зависит список доставок, от доставки - набор обязательных полей, и перестановка блока в конец формы ломает эту цепочку целиком.

Типичные проблемы

Поле местоположения не выводится в оформлении.

Справочник не импортирован либо свойство не заведено для этого типа плательщика. Проверяют оба условия по очереди: сначала справочник, потом набор свойств заказа.

У юридического лица нет поля адреса доставки.

Свойства заказа принадлежат конкретному типу плательщика, а не заказу вообще. Для компании такие поля заводят отдельным набором, со своими названиями и порядком.

Индекс, введённый покупателем, сбрасывается.

Значение подставляется по выбранному местоположению при каждом пересчёте стоимости доставки. Введённое покупателем значение индекса сохраняют своим обработчиком события заказа.

При самовывозе форма требует местоположение.

Свойство помечено обязательным для всего типа плательщика, включая заказы с самовывозом. Обязательность настраивают с привязкой к службам доставки, а не для всех сразу.

Поиск города работает медленно.

Справочник импортирован до уровня улиц, и записей в нём получаются миллионы. Для обычной доставки по городам такая глубина справочника не нужна вовсе.

Частые вопросы

До какого уровня импортировать местоположения?

Обычно до городов: этого хватает и службам доставки, и налогам. Улицы и дома нужны только там, где по ним считают стоимость или строят маршрут, а справочник после такого импорта вырастает до миллионов записей.

Почему у одного типа плательщика поле есть, а у другого нет?

Свойства заказа принадлежат типу плательщика: у физического лица и у компании наборы разные. Поле заводят отдельно для каждого типа, а не переиспользуют чужое.

Как связать местоположение и доступные доставки?

Ограничением службы доставки по местоположению: служба, не прошедшая ограничение, в форму не попадает. Именно поэтому смена города меняет список доставок прямо во время оформления.

Можно ли отключить автоподстановку индекса?

Штатной настройки для этого нет, поэтому введённое покупателем значение сохраняют своим обработчиком события заказа. Иначе оно перетирается при каждом пересчёте доставки.

Обновляется ли справочник сам?

Нет: новые города и переименования приезжают только повторным импортом. Его делают руками при изменении географии доставки, а не по расписанию.

Смежное

Первоисточник