отвечу сам себе))
UDP1. проблема заключается в том, что на сайте 2 каталога товаров для разных сайтов. Каталоги используют одинаковый XML_ID товара.
в файле \bitrix\modules\sale\general\order_loader.php
метод
function prepareProduct4Basket($itemID, $arItem, $orderId, $orderInfo)
{
$arFields = array();
$products = array();
$productType = array();
$arIBlockElement = array();
if(CModule::IncludeModule("iblock"))
{
$dbIBlockElement = CIBlockElement::GetList(array(), array("XML_ID" => $itemID, "ACTIVE" => "Y", "CHECK_PERMISSIONS" => "Y"), false, false, array("ID", "IBLOCK_ID", "XML_ID", "NAME", "DETAIL_PAGE_URL"));
while($arElement = $dbIBlockElement->Fetch())
выбирает по XML_ID без привязки к IBLOCK_ID, вот и получается такая хрень, несколько записей товара из разных IBLOCK_ID.
там же чуть ниже и наш 1C_Exchange в CATALOG_XML_ID
if(empty($arFields))
{
$arFields = array(
"ORDER_ID" => $orderId,
"PRICE" => $arItem["PRICE"],
"CURRENCY" => $orderInfo["CURRENCY"],
"QUANTITY" => $arItem["QUANTITY"],
"LID" => $orderInfo["LID"],
"DELAY" => "N",
"CAN_BUY" => "Y",
"NAME" => $arItem["NAME"],
"MODULE" => "1c_exchange",
"PRODUCT_PROVIDER_CLASS" => false,
"CATALOG_XML_ID" => "1c_exchange",
"PRODUCT_XML_ID" => $itemID,
"IGNORE_CALLBACK_FUNC" => "Y",
"VAT_RATE" => $arItem["VAT_RATE"],
"DISCOUNT_PRICE" => $arItem["DISCOUNT_PRICE"],
"CUSTOM_PRICE" => "Y",
);
Решить можно тупо задав IBLOCK_ID в getlist() но такая штука будет работать до первого обновления.
или сделать чуть лучше перенести компонент bitrix:sale.export.1c в local и там изменить ему класс
$loader = new CSaleOrderLoader; //любой другой CSaleOrderLoaderModify, например
и потом расширить класс CSaleOrderLoader который находится здесь /bitrix/modules/sale/general/order_loader.php
class CSaleOrderLoaderModify extends CSaleOrderLoader
{
function prepareProduct4Basket($itemID, $arItem, $orderId, $orderInfo)
{
...
// меняем его как нам нужно
//например указываем IBLOCK_ID или вообще дописываем в orders.xml новые поля и берем от туда BLOCK_ID
$dbIBlockElement = CIBlockElement::GetList(array(), array("XML_ID" => $itemID,"IBLOCK_ID"=>$XML_BLOCK_ID, "ACTIVE" => "Y",
...
}
}
-------------------------------------------------------------------------
Вопрос ранее:
Подскажите в чем может быть проблема.
обмен заказами с 1С типовой.
Сайт формирует заказ >> 1С забирает этот заказ к себе >> Наполняет этот заказ новыми позициями >> 1С отправляет этот заказ на сайт
и вот что получается, некоторые товары не определяются.
Кривой товар добавленный из 1С, на месте [Внешний код каталога] почему-то логин пользователя 1С на сайте, хотя должен быть идентификатор каталога товаров (в XML заполнен правильно и в свойствах тоже правильно)
Полукривой товар добавленный из 1С (но он хотя бы определился как товар каталога)
а вот этот товар добавленный на сайте, у него все поля заполнены как нужно
Вот что передаёт 1С в XML
это товар который кривой, всё вроде норм в XML, сайт его не понимает.
<Товар>
<Ид>Ц0000007725</Ид>
<ИдКаталога>aspro_mshop_catalog_s2</ИдКаталога>
<БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="PCE">шт</БазоваяЕдиница>
<Единица>
<Ид>796</Ид>
<НаименованиеКраткое>шт</НаименованиеКраткое>
<Код>796</Код>
<НаименованиеПолное>Штука</НаименованиеПолное>
</Единица>
<Коэффициент>1</Коэффициент>
<ЦенаЗаЕдиницу>133</ЦенаЗаЕдиницу>
<Количество>24</Количество>
<Сумма>3192</Сумма>
<Налоги>
<Налог>
<Наименование>НДС</Наименование>
<УчтеноВСумме>true</УчтеноВСумме>
<Сумма>532</Сумма>
<Ставка>20</Ставка>
</Налог>
</Налоги>
<ЗначенияРеквизитов>
<ЗначениеРеквизита>
<Наименование>ВидНоменклатуры</Наименование>
<Значение>Товар</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>ТипНоменклатуры</Наименование>
<Значение>Товар</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>СвойствоКорзины#CATALOG.XML_ID</Наименование>
<Значение>aspro_mshop_catalog_s2</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>СвойствоКорзины#PRODUCT.XML_ID</Наименование>
<Значение>Ц0000007725</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>CATALOG.XML_ID</Наименование>
<Значение>aspro_mshop_catalog_s2</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>PRODUCT.XML_ID</Наименование>
<Значение>Ц0000007725</Значение>
</ЗначениеРеквизита>
</ЗначенияРеквизитов>
</Товар>
Вот в этом же заказе код нормального товара, который был добавлен на стороне сайта
<Товар>
<Ид>Ц0000027053</Ид>
<ИдКаталога>aspro_mshop_catalog_s2</ИдКаталога>
<БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="PCE">шт</БазоваяЕдиница>
<Единица>
<Ид>796</Ид>
<НаименованиеКраткое>шт</НаименованиеКраткое>
<Код>796</Код>
<НаименованиеПолное>Штука</НаименованиеПолное>
</Единица>
<Коэффициент>1</Коэффициент>
<Скидки>
<Скидка>
<Наименование>Скидка на товар</Наименование>
<Сумма>13.2</Сумма>
<УчтеноВСумме>true</УчтеноВСумме>
</Скидка>
</Скидки>
<ЦенаЗаЕдиницу>66</ЦенаЗаЕдиницу>
<Количество>1</Количество>
<Сумма>52.8</Сумма>
<Налоги>
<Налог>
<Наименование>НДС</Наименование>
<УчтеноВСумме>true</УчтеноВСумме>
<Сумма>8.8</Сумма>
<Ставка>20</Ставка>
</Налог>
</Налоги>
<ЗначенияРеквизитов>
<ЗначениеРеквизита>
<Наименование>ВидНоменклатуры</Наименование>
<Значение>Товар</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>ТипНоменклатуры</Наименование>
<Значение>Товар</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>СвойствоКорзины#CATALOG.XML_ID</Наименование>
<Значение>aspro_mshop_catalog_s2</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>СвойствоКорзины#PRODUCT.XML_ID</Наименование>
<Значение>Ц0000027053</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>CATALOG.XML_ID</Наименование>
<Значение>aspro_mshop_catalog_s2</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>PRODUCT.XML_ID</Наименование>
<Значение>Ц0000027053</Значение>
</ЗначениеРеквизита>
</ЗначенияРеквизитов>
</Товар>
вот что происходит в БД таблица b_sale_basket
в таблице b_sale_basket_props товары которые добавлены из 1С информация отсутствует, только те что были добавлены на сайте
в чем может быть проблема? типовой обмен не трогался, работает из коробки