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

Выгрузка цен из 1С - типы цен, единицы, частичный обмен

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

Решение

Смотрим типы цен на сайте и их внешние коды:

use Bitrix\Main\Loader;
Loader::includeModule('catalog');
// типы цен общие для установки: инфоблок на них не влияет
$res = CCatalogGroup::GetList([], []);
while ($group = $res->Fetch()) {
printf("%-6s %-20s код=%s\n",
$group['ID'], $group['NAME'], $group['XML_ID'] ?: '(пусто)');
}
// типы цен сопоставляются по внешнему коду, а не по названию

Пустой внешний код означает, что тип цены с обменом не связан. Учётная система присылает свой идентификатор вида цены, и сопоставление идёт именно по нему, а не по совпадению названий.

Проверяем, какие цены пришли в файле обмена:

Окно терминала
# виды цен объявляются в начале файла каталога, до самих товаров
grep -o '<Ид>[^<]*</Ид>' /home/bitrix/www/upload/1c_catalog/import*.xml | head
grep -c '<ЦенаЗаЕдиницу>' /home/bitrix/www/upload/1c_catalog/offers*.xml

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

Читаем цены товара после обмена:

$res = CPrice::GetList([], ['PRODUCT_ID' => $productId], false, false,
['CATALOG_GROUP_ID', 'PRICE', 'CURRENCY', 'QUANTITY_FROM', 'QUANTITY_TO']);
while ($price = $res->Fetch()) {
printf("тип=%-4s %10.2f %s от=%s до=%s\n",
$price['CATALOG_GROUP_ID'], $price['PRICE'], $price['CURRENCY'],
$price['QUANTITY_FROM'] ?: '-', $price['QUANTITY_TO'] ?: '-');
}

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

Запускаем обмен только ценами:

Окно терминала
# шаги обмена вызываются по одному, каталог при этом не перечитывается
curl -s -u login:password \
"https://example.com/bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=offers.xml"

Такой обмен идёт заметно быстрее полного, но новые товары в нём не появятся вовсе. Позиции сопоставляются по внешнему коду, и цена без своего товара просто отбрасывается при импорте.

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

Единица измерения приезжает вместе с ценой и на сайте не пересчитывается. Цена, заданная в учётной системе за упаковку, приедет ценой упаковки, даже если на сайте товар продаётся поштучно. Коэффициент пересчёта задают на стороне выгрузки, а не на сайте.

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

Товары приехали, цен нет ни у одного.

Типы цен не сопоставлены по внешнему коду. Сайт получает цену с чужим идентификатором вида и не знает, куда её записать.

Приехал только один тип цены из нескольких.

Остальные виды не отмечены к выгрузке в учётной системе. Сайт создаёт ровно то, что пришло в файле.

Цена отличается от учётной в несколько раз.

Она задана за другую единицу измерения. Пересчёта по коэффициенту при импорте не происходит.

Цена не создалась, а в журнале обмена пусто.

Валюта цены отсутствует на сайте. Незнакомая валюта приводит к пропуску строки без сообщения об ошибке.

После обмена цены старые, товары новые.

Обмен оборвался между файлами. Каталог успел записаться, файл предложений с ценами - нет.

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

Как связать вид цены из 1С с типом цены на сайте?

Заполнением внешнего кода у типа цены значением идентификатора вида из учётной системы. После первой удачной выгрузки платформа заполняет его сама.

Можно ли не выгружать закупочные цены на сайт?

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

Почему цены приезжают, а на витрине их нет?

Компонент выводит только перечисленные в его параметрах типы цен. Приехавший, но не названный в параметрах тип на витрину не попадёт.

Что делать с ценами по количеству?

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

Смежное

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