Как уже надоел штатный обмен товарами и заказами с 1С, шаг влево, шаг вправо и все работает совсем не так, как надо, сегодня встал вопрос о...[spoiler] выгрузке в 1С заказов, которые содержат товары из 1С и товары, созданные на сайте.
В штатном режиме товары, которых нет в 1С, автоматически создаются в справочнике "номенклатура" и в 1С им присваивается уникальный идентификатор xml_id. При дальнейшем обмене с сайтом компонент обмена заказами проверяет состав заказа, пришедший из 1С и, конечно же, те товары, которые были созданы на сайте и не имеют назначенного в 1С xml_id, удаляются из этого заказа.
Я считаю, что задача штатного обмена идентифицировать эти товары, т.е. товару на сайте присвоить xml_id, чтобы в дальнейшем 1С и сайт понимали друг-друга правильно... Но нет, стандартный механизм суров-только удалить! И при этом даже общую стоимость заказа пересчитать он не удосуживается, то есть общая стоимость больше, чем суммарная стоимость товаров, входящих в заказ.
В техподдержке сказали увы, можем посоветовать закомментировать строчку в компоненте, отвечающую за удаление не найденных на сайте товаров из заказа:
Но мне проблему это не решает. Я решил дописать логику, чтобы товару на сайте присваивался xml_id, назначенный товару в 1С. Необходимо сначала решить вопрос все таки идентификации товара из 1С с товаром на сайте. Я повесил обработчик на событие
который дописывет к названию элемента текст: " - ID123456", то есть ID элемента. Для моей специфики имя элемента значения не имеет, и в него я мог писать все, что захочется, но проблемы в дописанном тексте в имени нет, так как в любом шаблоне вывода можно, используя регулярное выражение, выводить имя без доп. текста.
Далее копируем компонент sale.export.1c в своё пространство имен. И в коде компонента после:
вставляем:
где функция MyUpdateElement - ваша функция, вызывающая как вам надо метод CIBlockElement::Update, принимающая параметры на входе: $res["ID"] - ID элемента, которому не удалось найти сопоставление на сайте и $k - непосредственно xml_id код этого товара в каталоге 1С.
Вызову функции MyUpdateElement предшествует проверка регулярным выражением
наличия в имени товара ID123456, то есть для товаров, у которых в имени не приписан ID, работа компонента будет продолжаться в штатном режиме.
Данный материал не претендует на панацею, а лишь показывает направление, в котором можно решать подобного рода проблемы обмена с 1С.
В штатном режиме товары, которых нет в 1С, автоматически создаются в справочнике "номенклатура" и в 1С им присваивается уникальный идентификатор xml_id. При дальнейшем обмене с сайтом компонент обмена заказами проверяет состав заказа, пришедший из 1С и, конечно же, те товары, которые были созданы на сайте и не имеют назначенного в 1С xml_id, удаляются из этого заказа.
Я считаю, что задача штатного обмена идентифицировать эти товары, т.е. товару на сайте присвоить xml_id, чтобы в дальнейшем 1С и сайт понимали друг-друга правильно... Но нет, стандартный механизм суров-только удалить! И при этом даже общую стоимость заказа пересчитать он не удосуживается, то есть общая стоимость больше, чем суммарная стоимость товаров, входящих в заказ.
В техподдержке сказали увы, можем посоветовать закомментировать строчку в компоненте, отвечающую за удаление не найденных на сайте товаров из заказа:
CSaleBasket::Delete($arBasket["ID"]); |
Но мне проблему это не решает. Я решил дописать логику, чтобы товару на сайте присваивался xml_id, назначенный товару в 1С. Необходимо сначала решить вопрос все таки идентификации товара из 1С с товаром на сайте. Я повесил обработчик на событие
OnBeforeIBlockElementUpdate |
Далее копируем компонент sale.export.1c в своё пространство имен. И в коде компонента после:
... if(strlen($value["#"][GetMessage("CC_BSC1_TAXES")][0]["#"][GetMessage("CC_BSC1_TAX")][0]["#"][GetMessage("CC_BSC1_NAME")][0]["#"])>0) { $taxValueTmp = $val[GetMessage("CC_BSC1_TAXES")][0]["#"][GetMessage("CC_BSC1_TAX")][0]["#"][GetMessage("CC_BSC1_TAX_VALUE")][0]["#"]; $arItem[$productID]["VAT_RATE"] = $taxValueTmp/100; if(IntVal($taxValueTmp) > IntVal($taxValue)) { $taxName = $val[GetMessage("CC_BSC1_TAXES")][0]["#"][GetMessage("CC_BSC1_TAX")][0]["#"][GetMessage("CC_BSC1_NAME")][0]["#"]; $taxValue = $taxValueTmp; } } } } |
вставляем:
CModule::IncludeModule("iblock"); foreach($arItem as $k => $v) { if(preg_match("{.*ID(\d*)}", $v["NAME"], $pockets)) { if(intval($pockets["1"])>0) { $res = CIBlockElement::GetByID($pockets["1"]); $res=$res->Fetch(); if(intval($res["ID"])>0) { if($res["XML_ID"]!=$k) { MyUpdateElement($res["ID"],$k); } } } } } |
где функция MyUpdateElement - ваша функция, вызывающая как вам надо метод CIBlockElement::Update, принимающая параметры на входе: $res["ID"] - ID элемента, которому не удалось найти сопоставление на сайте и $k - непосредственно xml_id код этого товара в каталоге 1С.
Вызову функции MyUpdateElement предшествует проверка регулярным выражением
preg_match("{.*ID(\d*)}", $v["NAME"], $pockets) |
Данный материал не претендует на панацею, а лишь показывает направление, в котором можно решать подобного рода проблемы обмена с 1С.