Как передать кратность упаковки товара при выгрузке из 1С в 1С-Битрикс?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Торговля и дистрибуция
← На главную

При организации интернет-торговли нередко возникает задача продажи штучного товара только определенными партиями. Например, мелкий крепеж или фурнитура хранятся на складе в штуках, но на сайте должны продаваться строго упаковками по 100 штук (минимальная партия заказа и шаг добавления в корзину равны 100). Разберем, как устроен этот механизм при интеграции 1С:ERP с платформой 1С-Битрикс, почему стандартная схема XDTO не решает задачу напрямую и какими практическими способами можно реализовать требуемое поведение.

Почему не получается передать коэффициент через схему XDTO напрямую?

Выясним причину, с которой сталкиваются разработчики при анализе схемы выгрузки CommerceML. В стандартном механизме импорта каталога на стороне 1С-Битрикс отсутствует обработка тегов кратности для автоматического заполнения системного коэффициента единицы измерения (параметр MEASURE_RATIO). По умолчанию сайт всегда инициализирует этот коэффициент со значением 1.

Даже если расширить схему XDTO/XSD со стороны 1С и добавить туда дополнительный XML-узел с коэффициентом, штатный скрипт импорта на сайте просто проигнорирует неизвестные данные, поскольку логика их разбора не предусмотрена типовым парсером. Ручная установка коэффициента в панели управления сайтом также не является стабильным решением: при очередной выгрузке данных сайт может сбросить системный коэффициент обратно в единицу.

Рассмотрим рабочие способы реализации кратности упаковки.

Способ 1. Подмена единицы измерения и пересчет цены на стороне 1С

Проанализируем практический подход, когда сайт оперирует не базовыми штуками, а сразу упаковками. В этом случае базовая единица для остатков в 1С остается штучной, но в интернет-магазин выгружаются данные, приведенные к упаковке.

Разберем по шагам реализацию этого метода:

  1. В карточке номенклатуры создаем дополнительный реквизит (например, ед_для_сайта) с типом ссылки на справочник Справочник.УпаковкиЕдиницыИзмерения.
  2. Для товаров, требующих кратности, указываем соответствующую упаковку (например, «упак 100 шт.»). Если реквизит не заполнен, товар выгружается в своей базовой единице измерения.
  3. В расширении конфигурации переопределяем процедуру формирования данных по товарам в модуле ОбменСБитриксУправлениеСайтомУТ.БУС_ВыгрузкаСервер.СформироватьДанныеПоТоварам.

Посмотрим на пример запроса, модифицирующего единицу измерения и цену номенклатуры при формировании выгрузки:


ВЫБОР 
    КОГДА Номенклатура.ед_для_сайта = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка) 
        ТОГДА Номенклатура.ЕдиницаИзмерения 
    ИНАЧЕ Номенклатура.ед_для_сайта 
КОНЕЦ КАК ЕдиницаИзмерения,

ВЫБОР 
    КОГДА ЦеныСрезПоследних.Номенклатура.ед_для_сайта = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка) 
        ТОГДА ЦеныСрезПоследних.Цена 
    ИНАЧЕ ЦеныСрезПоследних.Цена * ЦеныСрезПоследних.Номенклатура.ед_для_сайта.Числитель 
КОНЕЦ КАК Цена

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

Способ 2. Передача кратности через дополнительный реквизит и обработчик на сайте

Рассмотрим подробнее наиболее гибкий и масштабируемый архитектурный вариант, не требующий искажения цен и единиц в схеме выгрузки. В этом случае единица остается штучной, а системный коэффициент на сайте выставляется программно.

  1. В 1С создаем дополнительный реквизит номенклатуры с числовым типом, например Кратность или Коэффициент упаковки.
  2. При стандартной выгрузке этот реквизит штатно выгружается в XML-файл обмена в блоке значений свойств товара (свойств CommerceML). Вмешиваться в XSD-схему при этом не требуется.
  3. На стороне 1С-Битрикс в файле local/php_interface/init.php регистрируем обработчик события окончания импорта каталога (например, событие OnSuccessCatalogImport1C) либо событие изменения товара торгового каталога.
  4. Обработчик находит переданное свойство товара, считывает его числовое значение и программно устанавливает системный коэффициент единицы измерения через API торгового каталога (классы CCatalogMeasureRatio или MeasureRatioTable).

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

Способ 3. Использование торговых предложений (SKU)

Разберем еще один штатный сценарий, когда товар может продаваться как поштучно, так и упаковками разной емкости. В этом случае в 1С упаковки связываются с характеристиками номенклатуры, либо выгружаются как отдельные торговые предложения (SKU).

Каждое торговое предложение получает собственную цену, остаток и наименование упаковки. Данный вариант полностью поддерживается типовым обменом «из коробки» и не требует программных доработок ни на стороне 1С, ни на стороне веб-платформы.

← На главную