Наборы и комплекты — самая частая точка, где типовой обмен «спотыкается»: 1С хранит состав товара, а сайт по умолчанию получает лишь пустую карточку. Задача — договориться, что считать набором, и научить обмен передавать его состав, цену и остаток корректно.
Наборы и комплекты: разберёмся в терминах
Путаница начинается с того, что в 1С и в 1С-Битрикс под похожими словами скрываются разные сущности. Прежде чем настраивать обмен, зафиксируйте, что именно вы переносите.
В 1С:Управление торговлей есть два механизма. Набор — это временная группировка позиций в документе продажи: при отгрузке он «разбирается» на отдельные строки состава, собственной номенклатуры у набора нет. Комплект — это самостоятельная номенклатурная позиция со своим составом («Комплектация номенклатуры»), которую можно продавать как единое целое.
В 1С-Битрикс тоже два понятия. Набор товаров (product set, Bitrix\Catalog\ProductTable::TYPE_SET) — товар, который на витрине собирается из уже существующих элементов каталога с общей ценой. И отдельно — SKU/торговые предложения, которые к комплектам отношения не имеют, хотя их часто путают.
Что реально передаёт CommerceML
Обмен идёт по стандарту CommerceML 2 через файлы import.xml (каталог) и offers.xml (цены, остатки). Важно понимать: стандарт не описывает передачу состава наборов и комплектов как отдельную структуру. Комплект выгружается как обычный элемент <Товар> со своим <Ид>, наименованием и артикулом — но без списка того, что в него входит.
Поэтому при типовой настройке происходит следующее:
- комплект из 1С создаётся на сайте как отдельный простой товар — карточка есть, состава нет;
- наборы, которые в 1С существуют только внутри документов, на сайт вообще не приходят — переносить нечего;
- цена комплекта приходит из
offers.xmlкак цена цельной позиции, а не как сумма составляющих.
То есть «из коробки» вы получаете продаваемую карточку комплекта, но теряете информацию о его наполнении. Дальше вопрос в том, нужен ли вам этот состав на витрине.
Как устроены «Наборы товаров» в Битрикс
Если состав нужно показывать и продавать по отдельным позициям, используется штатный механизм модуля catalog. Набор — это товар с типом TYPE_SET, а его состав хранится в таблице b_catalog_product_sets и управляется классом CCatalogProductSet.
Создать набор можно тремя путями:
- вручную — на странице редактирования товара, вкладка «Набор» (
/bitrix/admin/cat_product_edit.php); - программно — методом
CCatalogProductSet::add()с массивомITEMS, где перечисленыOFFER_IDсоставляющих и их количество; - автоматически при обмене — но только через доработку, потому что типовой импорт этот метод не вызывает.
Как выгрузить состав из 1С
Чтобы состав дошёл до сайта, его нужно явно добавить в выгрузку. Практика знает два надёжных подхода.
Способ 1. Состав в свойстве товара. В обработке обмена на стороне 1С состав комплекта собирается в строку (артикулы или Ид составляющих через разделитель) и кладётся в дополнительный реквизит / <ЗначенияСвойств>. На сайте это свойство инфоблока, которое затем разбирает обработчик события.
Способ 2. Отдельная секция в XML. Доработанная обработка добавляет в import.xml кастомный узел (например, <Состав> внутри <Товар>) с перечнем Ид и количеств. Стандартный импортёр Битрикса такой узел проигнорирует — его перехватывает событие.
| Критерий | Состав в свойстве | Кастомная секция XML |
|---|---|---|
| Правки в 1С | минимальные | доработка обработки |
| Количество позиций | без количеств | с количествами |
| Подходит для «Набора» | частично | да |
Для полноценных наборов с количеством составляющих второй способ предпочтительнее — он несёт всю нужную структуру.
Сборка набора обработчиком события
Собственно превращение выгруженных данных в «Набор товаров» делается на событии завершения импорта. Модуль catalog предоставляет событие OnSuccessCatalogImport1C, а модуль iblock — OnAfterIBlockElementUpdate; чаще берут первое, чтобы отработать один раз после полной загрузки каталога.
Логика обработчика:
- найти элементы-комплекты (по свойству-маркеру или по признаку из XML);
- для каждого разобрать состав в массив
OFFER_ID => QUANTITY, сопоставив внешниеИд1С соXML_IDэлементов на сайте; - перевести товар в тип
TYPE_SETи вызватьCCatalogProductSet::add()(илиupdate(), если набор уже существует); - очистить кеш каталога, чтобы состав отобразился на витрине.
XML_ID (внешний код 1С), а не по названию или артикулу — только он гарантированно уникален и стабилен между сеансами обмена.Цены, остатки и доступность набора
С составными товарами всегда возникает вопрос: чью цену и какой остаток показывать. Здесь важно согласовать поведение 1С и сайта, иначе набор будет то дешевле, то недоступен.
- Цена. «Набор товаров» Битрикса умеет считать стоимость как сумму составляющих либо использовать собственную цену набора. Если 1С уже выгружает цену комплекта в
offers.xml, разумно оставить фиксированную цену и не давать витрине пересобирать её из позиций. - Остаток. Доступность набора ограничена самой дефицитной составляющей. Следите, чтобы остатки всех элементов приходили в том же сеансе обмена — иначе набор покажется в наличии при нулевом остатке комплектующей.
- Резервирование. При заказе набора списываются составляющие. Убедитесь, что обратный обмен заказами возвращает в 1С именно строки состава, если так настроен учёт.
Все три пункта стоит проверить на тестовом наборе до запуска — расхождения по цене и остаткам всплывают именно на комплектах.
Проверка и типичные ошибки
Перед боевым обменом прогоните набор по контрольному списку. Большинство проблем видно уже на первом полном сеансе.
- Пустой состав. Обработчик отработал раньше, чем загрузились составляющие — вынесите сборку наборов в отдельный финальный шаг.
- Дубли позиций. Повторный обмен вызывает
add()вместоupdate()— проверяйте наличие набора перед добавлением. - Набор не собирается как SKU. Составляющие — это торговые предложения, и в состав нужно класть
IDконкретного предложения, а не родительского товара. - Слетает тип товара. Типовой импорт при следующем сеансе может вернуть товар в
TYPE_PRODUCT— сборку набора нужно повторять на каждом обмене.
Логи ищите в /bitrix/admin/1c_exchange.php?mode=import и в журнале событий; свой обработчик полезно снабдить записью в AddMessage2Log(), чтобы видеть, какие Ид не сопоставились.
Итог
Обмен наборами и комплектами — это не галочка в настройках, а связка из трёх решений: договориться о терминах, доработать выгрузку состава на стороне 1С и собрать «Набор товаров» обработчиком события на стороне сайта. Типовой CommerceML передаёт комплект как простую карточку без состава, поэтому без кастомной логики полноценные наборы не появятся. Отдельно проверяются цена, остатки и повторяемость сборки при каждом сеансе.
Если нужно завести составные товары аккуратно и без сюрпризов на витрине — мы настраиваем выгрузку состава из 1С, пишем обработчики сборки наборов и сопровождаем обмен, чтобы наборы не «рассыпались» после очередного сеанса. Готовы взять эту часть интеграции на себя.
Частые вопросы
Передаёт ли типовой обмен состав комплекта на сайт?
Нет. Стандарт CommerceML выгружает комплект как обычный элемент товара без списка составляющих. Чтобы состав дошёл до сайта, его добавляют в выгрузку явно и разбирают обработчиком.
Чем отличается набор от комплекта в 1С?
Набор — временная группировка строк внутри документа, он разбирается на состав при отгрузке и своей номенклатуры не имеет. Комплект — самостоятельная номенклатурная позиция со своим составом, которую можно продавать целиком.
Как в Битрикс хранится состав набора?
Набор — это товар типа TYPE_SET, а его состав лежит в таблице b_catalog_product_sets и управляется классом CCatalogProductSet. Составляющими выступают конкретные товары или торговые предложения каталога.
На каком событии собирать набор при обмене?
Обычно на OnSuccessCatalogImport1C, чтобы отработать один раз после полной загрузки каталога и остатков. Так гарантируется, что все составляющие уже существуют на сайте.
Почему набор собирается пустым?
Чаще всего обработчик срабатывает раньше, чем загружены товары-составляющие, либо в состав кладутся ID родительских товаров вместо конкретных торговых предложений. Вынесите сборку в финальный шаг и сопоставляйте по XML_ID.
Как считать цену набора: сумму или свою?
Механизм наборов Битрикс поддерживает оба варианта. Если 1С уже выгружает цену комплекта в offers.xml, надёжнее оставить фиксированную цену набора и не пересобирать её из составляющих на витрине.
Нужно ли собирать набор при каждом обмене?
Да. Типовой импорт при очередном сеансе может вернуть товар к обычному типу, поэтому логику сборки набора имеет смысл выполнять после каждого полного обмена каталогом.
Как отслеживать несопоставленные позиции состава?
Добавьте в свой обработчик запись в журнал через AddMessage2Log(), фиксируя Ид из 1С, для которых не нашлось элемента на сайте. Так расхождения по составу видны сразу после сеанса обмена.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.