При организации интернет-торговли нередко возникает задача продажи штучного товара только определенными партиями. Например, мелкий крепеж или фурнитура хранятся на складе в штуках, но на сайте должны продаваться строго упаковками по 100 штук (минимальная партия заказа и шаг добавления в корзину равны 100). Разберем, как устроен этот механизм при интеграции 1С:ERP с платформой 1С-Битрикс, почему стандартная схема XDTO не решает задачу напрямую и какими практическими способами можно реализовать требуемое поведение.
Выясним причину, с которой сталкиваются разработчики при анализе схемы выгрузки CommerceML. В стандартном механизме импорта каталога на стороне 1С-Битрикс отсутствует обработка тегов кратности для автоматического заполнения системного коэффициента единицы измерения (параметр MEASURE_RATIO). По умолчанию сайт всегда инициализирует этот коэффициент со значением 1.
Даже если расширить схему XDTO/XSD со стороны 1С и добавить туда дополнительный XML-узел с коэффициентом, штатный скрипт импорта на сайте просто проигнорирует неизвестные данные, поскольку логика их разбора не предусмотрена типовым парсером. Ручная установка коэффициента в панели управления сайтом также не является стабильным решением: при очередной выгрузке данных сайт может сбросить системный коэффициент обратно в единицу.
Рассмотрим рабочие способы реализации кратности упаковки.
Проанализируем практический подход, когда сайт оперирует не базовыми штуками, а сразу упаковками. В этом случае базовая единица для остатков в 1С остается штучной, но в интернет-магазин выгружаются данные, приведенные к упаковке.
Разберем по шагам реализацию этого метода:
ед_для_сайта) с типом ссылки на справочник Справочник.УпаковкиЕдиницыИзмерения.ОбменСБитриксУправлениеСайтомУТ.БУС_ВыгрузкаСервер.СформироватьДанныеПоТоварам.Посмотрим на пример запроса, модифицирующего единицу измерения и цену номенклатуры при формировании выгрузки:
ВЫБОР
КОГДА Номенклатура.ед_для_сайта = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
ТОГДА Номенклатура.ЕдиницаИзмерения
ИНАЧЕ Номенклатура.ед_для_сайта
КОНЕЦ КАК ЕдиницаИзмерения,
ВЫБОР
КОГДА ЦеныСрезПоследних.Номенклатура.ед_для_сайта = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
ТОГДА ЦеныСрезПоследних.Цена
ИНАЧЕ ЦеныСрезПоследних.Цена * ЦеныСрезПоследних.Номенклатура.ед_для_сайта.Числитель
КОНЕЦ КАК Цена
Важное ограничение: если мы меняем единицу и цену на этапе выгрузки из 1С, необходимо обязательно скорректировать и обратную процедуру загрузки заказов покупателей. Если этого не сделать, заказ с сайта вернется с количеством упаковок, а типовой алгоритм загрузки 1С запишет это число как базовые штуки, что приведет к неверному расчету сумм документов и ошибкам списания складских остатков.
Рассмотрим подробнее наиболее гибкий и масштабируемый архитектурный вариант, не требующий искажения цен и единиц в схеме выгрузки. В этом случае единица остается штучной, а системный коэффициент на сайте выставляется программно.
Кратность или Коэффициент упаковки.local/php_interface/init.php регистрируем обработчик события окончания импорта каталога (например, событие OnSuccessCatalogImport1C) либо событие изменения товара торгового каталога.CCatalogMeasureRatio или MeasureRatioTable).Такой подход гарантирует, что при регулярных сессиях обмена коэффициент кратности не будет затираться единицей, а заказы из интернет-магазина будут поступать в 1С в базовых единицах измерения с корректным пересчетом количества.
Разберем еще один штатный сценарий, когда товар может продаваться как поштучно, так и упаковками разной емкости. В этом случае в 1С упаковки связываются с характеристиками номенклатуры, либо выгружаются как отдельные торговые предложения (SKU).
Каждое торговое предложение получает собственную цену, остаток и наименование упаковки. Данный вариант полностью поддерживается типовым обменом «из коробки» и не требует программных доработок ни на стороне 1С, ни на стороне веб-платформы.