Поделюсь, как я решил проблему с импортом картинок.
Пользуясь событием [B]OnSuccessCatalogImport1C[/B], которое вызывается по окончании импорта в компоненте [B]catalog.import.1c[/B], перед отдачей сообщения 1С об успешном окончании обмена.
[CODE]458 ...
459 foreach(GetModuleEvents("catalog", "OnSuccessCatalogImport1C", true) as $arEvent)
460 ExecuteModuleEventEx($arEvent);
461
462 echo "success\n",GetMessage("CC_BSC1_IMPORT_SUCCESS");
463 ...
[/CODE]Далее фрагмент кода init.php ([url=http://mysticpaste.com/view/wkyb5DmA0q?3]перейти на просмотр с подсветкой синтаксиса[/url])
[CODE]AddEventHandler('catalog', 'OnSuccessCatalogImport1C', 'importPicturesFrom1C');
//Фильтр картинок (пользовательская функция, к которой мы будем передавать значения для проверки на предмет картинка ли это?)
function filterOfPictures($val = false){
if($val == false) return false;
else{
settype($val, 'string');
$length = strlen($val);
$jpg = stripos($val, '.jpg');
if(($jpg !== false) && (($length - $jpg) == 4)) return true;
$jpeg = stripos($val, '.jpeg');
if(($jpeg !== false) && (($length - $jpeg) == 5)) return true;
$png = stripos($val, '.png');
if(($png !== false) && (($length - $png) == 4)) return true;
$gif = stripos($val, '.gif');
if(($gif !== false) && (($length - $gif) == 4)) return true;
$bmp = stripos($val, '.bmp');
if(($bmp !== false) && (($length - $bmp) == 4)) return true;
}
return false;
}
function importPicturesFrom1C(){
global $APPLICATION;
CModule::IncludeModule('iblock');
//Иницилизация
$CIBlockXMLFile = new CIBlockXMLFile();
$CIBlockElement = new CIBlockElement();
$ID = false;
$currentID = false;
$morePhotos = array();
$properties = array();
$MORE_PHOTO = array();
$counter = 0;
$firstGood = 0;
//Выборка всех элементов из таблицы b_xml_tree
$arFields = $CIBlockXMLFile->GetList(array());
while($arField = $arFields->Fetch()){
++$counter;
//Получение идентификатора текущего элемента
if($arField['NAME'] == 'Ид'){
$EXTERNAL_ID = $arField['VALUE'];
//Так как элемент уже полностью импортировался и создался в инфоблоке мы его находим по внешнему ключу и узнаем ID-шник
$arItems = CIBlockElement::GetList(array('ID' => 'ASC'), array("IBLOCK_TYPE" => "1c_catalog", "IBLOCK_ID" => 37, 'EXTERNAL_ID' => $EXTERNAL_ID), false, false, array('ID'));
$arItem = $arItems->GetNext();
if(is_numeric($arItem['ID']))
$ID = $arItem['ID'];
else
$ID = false;
}
//Фильтрация картинок
if(($arField['NAME'] == 'Значение') and (filterOfPictures($arField['VALUE']))){
$morePhotos[] = CFile::MakeFileArray($_SERVER['DOCUMENT_ROOT'] . '/upload/1c_catalog/' . $arField['VALUE']);
$properties = array("PROPERTY_VALUES"=> $morePhotos);
}
if($currentID != $ID)
$firstGood++;
if($firstGood == 1)
$currentID = $ID; //1 и все
//Обновление элемента (добавление картинок)
if(is_numeric($ID) && ($currentID != $ID) and (!empty($properties)) and ($firstGood > 1)){
//$result = $CIBlockElement->Update($currentID, $properties);
CIBlockElement::SetPropertyValues($currentID, 37, $morePhotos, 'MORE_PHOTO');
$morePhotos = array();
$properties = array();
$currentID = $ID;
}
//file_put_contents('logimport.txt', "\n" . serialize($arField) . "\n", FILE_APPEND);
}
//Обновление последнего элемента (добавление картинок)
if(is_numeric($currentID) and (!empty($properties))){
//$result = $CIBlockElement->Update($currentID, $properties);
CIBlockElement::SetPropertyValues($currentID, 37, $morePhotos, 'MORE_PHOTO');
}
} [/CODE]Так как все данные идут в общем потоке, я подстроился под ту последовательность, по которой выводятся картинки:
============================
...
внешний код первого элемента
...
картинки первого элемента
...
внешний код второго элемента
...
картинки второго элемента
...
===========================
Добавление картинок происходит при смене ID.
[QUOTE]Людмила Черныщук пишет:
У нас тоже проблема с картинками, хоть и несколько другая: на сайте настроен автоматический обмен с 1С, весь каталог грузился отлично, вместе с картинками. В какой-то момент стали "пропадать" картинки в товарах.
Проверили выгрузку, оказалось, что выгрузка на стороне 1С происходит без ошибок, картинки выгружаются, мы видим процесс передачи архивных файлов (архивы весят много, видимо, все-таки содержат картинки), процесс выгрузки успешно завершается - ошибок нет, но на сайте в папке /upload/1c_catalog появляются только xml файлы, ни папки import_files, ни, соответственно, картинок, ни архивов, передачу которых мы видели в процессе выгрузки (только архив с xml-ками). Получается, что если даже у товара была раньше картинка, то при обновлении после выгрузки картинка пропадает.
Подскажите, пожалуйста, может кто сталкивался, куда копать и где искать проблему?
14-ю версию пока не устанавливали.
[/QUOTE]Видимо на каком-то шаге Ваш архив затирается и ко всем картинкам соответственно тоже обрываются пути. Попробуйте воспользоваться данным способом, потомучто, на шаге когда вызывается событие, нам еще доступна вся таблица [B]b_xml_tree[/B], в которой хранится весь XML.
=============================
Заметил одну особенность
Проблемы возникают только с теми свойствами, у которых (при их создании), значение отмечено как «Множественное».
Я думаю что это из-за такой сложности, которая связана с тем, что если свойство простое — то это просто «Название = значение», а в случае с множественным значением — формируется двумерный массив!
Пример: У меня свойство «Характеристики» отмечено как множественное. В результате при импорте у меня названия и значения поменялись местами.
[IMG]http://ipicture.kz/images/2013/12/8oegs1no7l4b6skggkyj.jpg[/IMG]