Как уже надоел штатный обмен товарами и заказами с 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С.