С выходом новой версии модуля обмена данными с 1С произошили изменения не только в логике механизма обмена - был добавлен ряд новых возможностей. [spoiler]В частности появилась "адекватная" возможность выгрузки предложений товара в отдельный инфоблок(http://1c.1c-bitrix.ru/ecommerce/v2.php#chars). Этот режим выгрузки удобен в том случае, если товар в 1С имеет несколько характеристик и цены в зависимости от характиристик различаются. В соответствие с логикой продукта, такой товар удобнее предствить на сайте в 2 частях: элемент-описание и предложения товара с привязкой к элементу-описания. Данные из 1С приходят в 2-х файлах:
import.xml - собственно "описательная" часть товара, файл содержит каталог(без предложений) и при импорте данного файла создаётся инфоблок А, который содержит просто элементы, но не товары. offer.xml - файл содержит именно атрибуты товара (цены, скидки, остатки и т.п.) и в результате импорта этого файла создаётся другой инфоблок B, который содержит именно предложения товара. Каждое предложение инфоблока B привязывается к элементу инфоблок A по свойству типа "привязка к элементу".
Такой режим выгрузки имеет своеобразую логику и не всегда подходит под задачи пользователя. Чаще всего при выгрузке в этом режиме встречаются проблемы отсутствия тех или иных данных в нужных полях(свойствах) нужного инфоблока. С подобными проблемами часто обращаются в техподдержку.
Попытаемся решить одну из таких проблем: выгрузка значение веса в инфоблок предложений. По умолчанию вес в инфоблок предложений не выгружается потому, что значение передаётся в файле import.xml, а инфоблок предложений создаётся посредством файла offers.xml. НО т.к. каждое предложение привязано к своей "описательной" части - то проблема решаема. И решением является написание обработчиков событий на добавление/изменение элемента инфоблока + на добавление/изменение продукта.
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "SaveWeightToProp_1с");
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "SaveWeightToProp_1с");
AddEventHandler("sale", "OnProductAdd", "GetWeightFromProp_1с");
AddEventHandler("catalog", "OnBeforeProductUpdate", "GetWeightFromProp_1с_");
function SaveWeightToProp_1с(&$arFields)
{
//передаётся ли значение веса? импорт из 1С?
if ((isset($arFields['BASE_WEIGHT']))&&(@$_REQUEST['mode']=='import'))
{
// а место куда можно сохранить имеется?
$properties = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("IBLOCK_ID"=>$arFields['IBLOCK_ID'],"CODE"=>'PROP_WEIGHT'));
if(!$prop_fields = $properties->Fetch())
{
//нет свойства, придётся добавить
$arFields = Array(
"NAME" => "Вес",
"ACTIVE" => "Y",
"SORT" => "100",
"CODE" => "PROP_WEIGHT",
"PROPERTY_TYPE" => "S",
"IBLOCK_ID" => $arFields['IBLOCK_ID']
);
$ibp = new CIBlockProperty;
$PropID = $ibp->Add($arFields);
}
//значение веса передаётся и место куда сохранить тоже есть - сохраняем=)
CIBlockElement::SetPropertyValues($arFields['ID'], $arFields['IBLOCK_ID'], $arFields['BASE_WEIGHT'], 'PROP_WEIGHT');
}
}
function GetWeightFromProp_1с(&$ID,$Fields)
{
CModule::IncludeModule('catalog');
$res=CIBlockElement::GetByID($ID);
$res_ar=$res->Fetch();
$db_props = CIBlockElement::GetProperty($res_ar['IBLOCK_ID'], $ID,"sort", "asc", Array("CODE"=>'CML2_LINK'));
if ($prop=$db_props->GetNext())
{
$res = CIBlockElement::GetList(Array("SORT"=>"ASC"),Array("ID"=>$prop['VALUE']),false, Array(),Array("IBLOCK_ID","PROPERTY_PROP_WEIGHT"));
if($res_ar=$res->GetNext())
{
$w=$res_ar['PROPERTY_PROP_WEIGHT_VALUE'];
$ProductFields=Array('WEIGHT'=>$w);
CCatalogProduct::Update($ID,$ProductFields);
}
}
}
function GetWeightFromProp_1с_(&$ID,$Fields)
{
CModule::IncludeModule('catalog');
$res=CIBlockElement::GetByID($ID);
$res_ar=$res->Fetch();
$db_props = CIBlockElement::GetProperty($res_ar['IBLOCK_ID'], $ID,"sort", "asc", Array("CODE"=>'CML2_LINK'));
if ($prop=$db_props->GetNext())
{
$res = CIBlockElement::GetList(Array("SORT"=>"ASC"),Array("ID"=>$prop['VALUE']),false, Array(),Array("IBLOCK_ID","PROPERTY_PROP_WEIGHT"));
if($res_ar=$res->GetNext())
{
$Fields['WEIGHT']=$res_ar['PROPERTY_PROP_WEIGHT_VALUE'];
}
}
}
Этот код можно включить в /bitrix/php_interface/init.php и посмотреть, что получится:) При импорте файла import.xml будет создаваться свойство с символьным кодом "PROP_WEIGHT", в это свойство будет записываться значение веса. Затем, при импорте offers.xml значение веса можно "стянуть" из свойства элемента-описания. Всё довольно тривиально, просто требуется знание API продукта на уровне документации:) Возможно, данный пример (возможно не самый "красивый") поможет в решении других подобных задач.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».