Как выбрать API торгового каталога
В торговом каталоге API выбирают по задаче. Чтение, запись данных, карточка товара и складские операции работают через разные классы. Если перепутать их, цена не попадет в расчет. Остаток изменится без складского движения, элемент инфоблока не станет товаром, а события модуля не сработают.
Сначала определите, что меняется: карточка товара, товарные параметры, цена, складской остаток, скидка, купон, комплект, подписка или профиль обмена. Затем выберите, чем работать: ORM-таблицей, D7-моделью или классическим API. После записи проверьте данные через ORM-таблицу, например \Bitrix\Catalog\ProductTable или \Bitrix\Catalog\PriceTable.
Поля, связи и роли объектов описаны в статье Схема работы торгового каталога и основные объекты. В таблицах ниже для типовых задач указаны задача, основной метод и пояснение, почему подходит именно он.
Перед операциями с товарами подключите модули iblock и catalog. Для купонов, корзины, заказа и расчета скидок может понадобиться модуль sale.
Как выбрать между ORM, D7-моделями и классическим API
Разделите задачу по ответственности. Чтение, запись и операции с внутренними правилами каталога решают разные группы классов.
Читайте через ORM-таблицы D7. Если нужно получить товары, цены, остатки, склады, типы цен или справочники, используйте классы вида \Bitrix\Catalog\*Table. Например, \Bitrix\Catalog\ProductTable::getList() или \Bitrix\Catalog\PriceTable::getList(). Эти классы подходят для выборок, фильтров, сортировки и проверки результата после записи.
Записывайте товарные данные через D7-модели. Если нужно создать, обновить или удалить товарные параметры, цену или НДС, используйте классы \Bitrix\Catalog\Model\Product, \Bitrix\Catalog\Model\Price, \Bitrix\Catalog\Model\Vat. Модели проверяют данные и возвращают объект результата. Он содержит ошибки валидации, которые можно обработать сразу.
Классическое API запускает правила каталога. С помощью классических методов регистрируют каталог, связывают торговые предложения, проводят складские документы, создают комплекты, скидки и профили обмена. В таких задачах нужно создать связи, пересчитать состояние или провести документ.
Например, карточку товара создают через API инфоблоков, товарные параметры и цену оформляют отдельными методами каталога, а складское движение проводят документом.
Не заменяйте API прямой записью в таблицы. Прямая запись может обойти проверки, события и пересчет доступности.
Товары и торговые предложения
Товар в каталоге состоит из карточки инфоблока и товарной записи. Карточка хранит контент, а товарная запись включает элемент в логику продажи: тип товара, остаток, доступность и другие параметры.
Для простого товара цена и остаток относятся к самому товару. Для товара с торговыми предложениями цена и остаток относятся к конкретному предложению. Родительская карточка хранит общее описание: например, название модели, изображения и свойства, общие для всех вариантов.
|
Задача |
Метод |
Пояснение |
|
|
Инфоблок хранит карточки товаров: названия, коды, свойства, разделы и изображения |
|
|
|
Регистрация подключает к инфоблоку цены, остатки, типы товаров и связь с торговыми предложениями |
|
|
|
Карточка товара остается элементом инфоблока, поэтому контентные поля создают через API инфоблоков |
|
|
|
Без товарной записи элемент останется карточкой и не станет товаром каталога |
|
|
|
Родительская карточка хранит общее описание товара, а цена и остаток относятся к торговым предложениям |
|
|
|
Торговое предложение хранит конкретный вариант товара, его цену и остаток |
|
|
|
Услуга продается как позиция каталога без складского остатка |
|
|
|
ORM-таблица подходит для чтения типа товара, остатка и флага доступности без изменения данных |
|
|
|
D7-модель меняет товарную запись и возвращает ошибки, если данные не прошли проверку |
|
|
|
Метод учитывает связь родительского товара с инфоблоком предложений и группирует варианты по товару |
|
|
|
Метод возвращает варианты товара, которые нужно обработать до удаления родительской карточки |
|
|
|
Карточку предложения удаляют до родительского товара, чтобы не оставить варианты без товара |
Правило для торговых предложений: если у товара есть варианты, передавайте в PRODUCT_ID идентификатор предложения $offerId. Не используйте идентификатор родительского товара $productId для цены и остатка продаваемого варианта.
Базовые настройки: типы цен, НДС и единицы измерения
Подготовьте базовые настройки до массового создания товаров. Тип цены определяет, кто видит цену и может купить товар. НДС влияет на расчет налога. Единица измерения и коэффициент продажи задают, в каких количествах товар можно заказать.
|
Задача |
Метод |
Пояснение |
|
|
Базовый тип цены нужен перед созданием первой цены товара |
|
|
|
Классический метод сразу задает тип цены, языковые названия и права групп |
|
|
|
Цена может существовать, но пользователь не увидит ее без прав на просмотр или покупку |
|
|
|
D7-модель создает ставку с проверкой полей и возвращает ошибки в объекте результата |
|
|
|
НДС относится к товарной записи, поэтому его назначают через модель товара |
|
|
|
Единицы измерения хранятся в справочнике каталога и затем назначаются товарам |
|
|
|
Поле |
|
|
|
Метод создает шаг продажи для товара: например, покупать по одной штуке или упаковками |
|
|
|
Метод меняет существующий шаг продажи, если коэффициент для товара уже задан |
Если пользователь видит товар, но не видит цену или не может купить по ней, проверьте не только товар и остаток. Часто причина в правах на тип цены.
Цены
Цена хранится отдельно от карточки товара и товарных параметров. Для одного товара можно хранить несколько цен: базовую, оптовую, цены в разных валютах и диапазонные цены для количества.
Перед обновлением цены найдите существующую запись по паре PRODUCT_ID и CATALOG_GROUP_ID. Если запись есть, обновите ее. Если записи нет, создайте новую. Такой порядок защищает от дублей цен.
|
Задача |
Метод |
Пояснение |
|
|
Цена хранится отдельно от карточки и товарных параметров, поэтому ее создают отдельной моделью |
|
|
|
ORM-таблица подходит для чтения всех цен товара по типам цен и валютам |
|
|
|
Метод проверяет, есть ли цена для пары |
|
|
|
Метод меняет найденную запись цены и не создает дубль для того же типа цены |
|
|
|
Метод создает новую цену, если для товара и типа цены еще нет записи |
|
|
|
Диапазонная цена нужна, когда стоимость зависит от количества товара |
|
|
|
Метод выбирает подходящую диапазонную цену для заданного количества |
|
|
|
Метод учитывает права пользователя, скидки, купоны, диапазонные цены и сайт |
|
|
|
Метод применяет правила округления, настроенные для типа цены |
Не храните рабочую цену только в свойстве инфоблока. Корзина, заказ, скидки и права на типы цен работают с ценами каталога.
Склады и остатки
Остаток можно менять двумя способами. Если складской учет выключен, общий остаток хранится в товарной записи. Если складской учет включен и товар реально движется между складами, работайте через складские документы.
|
Задача |
Метод |
Пояснение |
|
|
Подходит для общего остатка, если складской учет выключен и движение по складам не нужно фиксировать документом |
|
|
|
Склад нужен до записи складских остатков и оформления складских документов |
|
|
|
ORM-таблица помогает выбрать склад для остатка, документа или проверки данных |
|
|
|
Поставщик нужен для приходных документов и истории поступления товаров |
|
|
|
Метод создает запись остатка для стартовой загрузки, а не для обычного движения товара |
|
|
|
Метод меняет существующую запись остатка при служебной корректировке |
|
|
|
Таблица показывает остатки конкретного товара или предложения по складам |
|
|
|
Документ сохраняет причину движения товара: приход, списание, перемещение или возврат |
|
|
|
Только проведенный документ меняет складские остатки |
|
|
|
Отмена снимает влияние документа без удаления истории операции |
При рабочем складском учете не меняйте остатки прямой записью для сценариев с движением товара. Складской документ сохраняет саму операцию и меняет остатки после проведения.
Комплекты и наборы
Комплект продается как составной товар. Набор хранит рекомендации или связанные товары. Оба сценария работают через \CCatalogProductSet, но используют разные типы: TYPE_SET для комплекта и TYPE_GROUP для набора.
|
Задача |
Метод |
Пояснение |
|
|
Тип |
|
|
|
Состав комплекта хранится отдельно от карточки товара и задается через |
|
|
|
Метод возвращает товары, которые входят в комплект |
|
|
|
Обновление заменяет состав на массив |
|
|
|
Тип |
|
|
|
Удаление убирает связь товаров из комплекта или набора |
Не путайте комплект и набор. Комплект участвует в продаже как составной товар, а набор описывает рекомендации.
Скидки, купоны и подписки
Цена хранит исходную стоимость. Скидка меняет итоговую стоимость при расчете. Купон включает условие для скидки, а подписка помогает оформить уведомление о поступлении товара.
|
Задача |
Метод |
Пояснение |
|
|
Скидка хранит правило изменения цены и участвует в расчете итоговой стоимости |
|
|
|
Купон создают отдельной записью и связывают со скидкой через |
|
|
|
Флаг включает расчет скидки только по купону |
|
|
|
Менеджер купонов передает купон в расчет цены с учетом модуля |
|
|
|
Метод показывает, какие скидки подходят товару, группам пользователя, типу цены и сайту |
|
|
|
Подписка привязана к товару или предложению и хранит контакт для уведомления о поступлении |
Не рассчитывайте скидку вручную. \CCatalogProduct::GetOptimalPrice() учитывает группы пользователя, купоны, диапазонные цены и сайт.
Импорт и экспорт
Импорт и экспорт работают через профили и PHP-шаблоны. Профиль отвечает за запуск, а шаблон выполняет обработку данных проекта.
|
Задача |
Метод |
Пояснение |
|
PHP-шаблон экспорта |
Шаблон описывает, какие данные выгружать и в каком формате |
|
|
|
Профиль хранит настройки запуска экспорта и связывает их с шаблоном |
|
|
|
Метод запускает профиль и подключает рабочий шаблон экспорта |
|
|
|
Метод возвращает профили экспорта для программной проверки настроек |
|
|
|
Метод возвращает настройки одного профиля экспорта |
|
|
|
Метод меняет настройки существующего профиля без ручной настройки в интерфейсе |
|
|
PHP-шаблон импорта |
Шаблон описывает, как файл или внешний источник обновляет карточки, товарные параметры и цены |
|
|
|
Профиль хранит настройки запуска импорта и связывает их с шаблоном |
|
|
|
Метод запускает профиль и подключает рабочий шаблон импорта |
|
|
|
Метод возвращает профили импорта для программной проверки настроек |
|
|
|
Метод возвращает настройки одного профиля импорта |
|
|
|
Метод меняет настройки существующего профиля импорта |
Шаблон импорта или экспорта — это PHP-код проекта. Не передавайте в имя шаблона значения из запроса пользователя.
Типичные ошибки в коде каталога
Большинство ошибок в API каталога возникает не из-за синтаксиса, а из-за неверного уровня API. Метод может выполниться без явной ошибки, но данные окажутся не там, где их ждут корзина, складской учет или расчет скидок.
|
Ошибка |
Почему возникает проблема |
Как делать |
|
Создать элемент инфоблока и не добавить товарные параметры |
Элемент останется карточкой, но не станет товаром каталога |
После создания карточки вызывайте |
|
Добавить цену родительскому товару с торговыми предложениями |
Покупатель выбирает предложение, а цена должна относиться к продаваемому варианту |
Передавайте идентификатор предложения в |
|
Создать новую цену без проверки существующей |
Для одной пары товар и тип цены может появиться дубль |
Сначала ищите цену через |
|
Хранить рабочую цену в свойстве инфоблока |
Корзина, заказы, скидки и права на типы цен читают цены каталога |
Работайте с ценой через модель |
|
Менять складские остатки напрямую при рабочем складском учете |
Система не сохранит движение товара в документе |
Проводите изменение остатка через складской документ |
|
Читать цены или остатки в цикле по списку товаров |
Возникают лишние запросы к базе. На большом каталоге страница начнет работать медленнее |
Соберите идентификаторы товаров в массив и сделайте одну выборку с фильтром по списку |
|
Рассчитывать скидку вручную |
Ручной расчет может пропустить права пользователя, купоны, диапазонные цены и настройки сайта |
Используйте |
Сводная таблица устаревших методов
Старые методы могут встречаться в проектах, которые давно используют модуль catalog. При поддержке такого кода сначала проверьте текущий сценарий и риски замены. Для нового кода, новых примеров и автоматической генерации используйте классы из колонки Актуальная замена.
|
Задача |
Устаревшие методы |
Актуальная замена |
|
Создать товарные параметры |
|
|
|
Обновить товарные параметры |
|
|
|
Удалить товарные параметры |
|
|
|
Создать цену |
|
|
|
Обновить цену |
|
|
|
Удалить цену |
|
|
|
Получить базовый тип цены |
|
|
|
Получить идентификатор базового типа цены |
|
|
|
Создать ставку НДС |
|
|
|
Обновить ставку НДС |
|
|
|
Удалить ставку НДС |
|
|
|
Создать единицу измерения |
|
|
|
Обновить единицу измерения |
|
|
|
Удалить единицу измерения |
|
|
|
Передать купон в расчет скидки |
|
|
|
Получить купоны для расчета |
|
|
|
Очистить купоны расчета |
|
|
|
Определить инфоблок предложений по товару |
|
|
|
Определить связь предложений по свойству |
|
|
|
Получить расширенную информацию о каталоге |
|
|