партнер компании 1с-битрикс
сайт фрилансера Сергея Эстрина
Войти как пользователь
Вы можете войти на сайт, если вы зарегистрированы на одном из этих сервисов:
Универсальная галерея - модуль для битрикс
Интерфейс экспорта-импорта инфоблоков посредством XML в продуктах 1С-Битрикс выглядит очень просто. Достаточно выбрать инфоблок, файл для загрузки-выгрузки, несколько дополнительных параметров, и казалось бы, дело сделано. Но на деле эта простота является немного обманчивой, и последствия от незнания некоторых аспектов, такие, как, например, загрузка данных не в тот инфоблок при импорте, создание дополнительных свойств вместо загрузки данных в существующие, могут выбить из колеи даже достаточно опытного пользователя или программиста, и заставить его на долгое время забыть об использовании этого мощного инструмента. Я постараюсь рассказать вам об этих аспектах.
[spoiler]
Внешний код

Главная хитрость: идентификация инфоблоков, свойств, разделов, элементов и пр. осуществляется по внешнему коду (XML_ID или EXTERNAL_ID). Внешний код - это код, используемый для синхронизации данных с внешними источниками. По умолчанию, возможность его отображения и редактирования через административный интерфейс выключена. Чтобы включить ее, нужно перейти в настройки модуля "Информационные блоки" (Настройки - Настройки продукта - Настройки модулей) и установить галочку "Показывать код загрузки из внешних источников".



При создании разделов и элементов инфоблоков, если внешний код не указан - он заполняется автоматически значением ID элемента или раздела. Но с инфоблоками и свойствами дело обстоит не так - по умолчанию внешний код пустой, но он создается при первом XML импорте аналогичным способом - заполняется значением ID инфоблока или свойства.

Соответственно, чтобы избежать создания ненужных инфоблоков или ошибочного импорта не в тот инфоблок - первое, что нужно сделать - проверить соответствие внешнего кода инфоблока-источника и целевого инфоблока. Если экспорт был сделан давно, или по какой-то другой причине нет возможности посмотреть внешний код инфоблока-источника, то его можно узнать, открыв xml-файл при помощи текстового редактора, из первых строк:


<?xml version="1.0" encoding="UTF-8"?>

<КоммерческаяИнформация ВерсияСхемы="2.021" ДатаФормирования="2011-06-19T03:38:23">
     <Классификатор>
       <Ид>12</Ид>
       <Наименование>Визы</Наименование>

В данном примере значение "12" - и есть внешний код инфоблока.

Внешние коды свойств также должны соответствовать инфоблоку-источнику, в противном случае будут созданы новые свойства.

Свойства привязки к элементам и разделам

Свойства привязки к элементам и разделам также импортируются корректно. При импорте происходит преобразование значений свойств из внешнего кода в ID, поэтому инфоблоки, к элементам или разделам которых осуществляется привязка, должны импортироваться прежде тех, в которых есть свойства привязки к ним.

Файлы

При экспорте файлы, привязанные к элементам инфоблоков, сохраняются в специальной папке с именем, соответствующим имени xml-файла с добавлением "_files".

Если файлов много, то копировать их с одного хостинга на другой при помощи ftp может быть неудобно, к тому же на linux-хостингев одной папке могут находится больше одного файла с одинаковым именем, но отличающимся регистром символов, и при копировании таких файлов в Windows или Mac OS X, могут возникнуть проблемы (мне приходилось не раз сталкиваться с этим).

В таких случаях лучше воспользоваться доступом к командной строке (ssh) для упаковки файлов в архив, например, команда

tar czf archive.tar.gz news*


заархивирует все файлы и папки, начинающиеся с "news". При этом нельзя использовать имя архива news.tar.gz во избежание архивации его самого в себя.

Команда

tar xzf archive.tar.gz


распакует архив в целевой папке.

Для навигации по файловой системе с помощью командной строки используются команды ls - просмотр содержимого текущей папки, и cd folder - вход в папку folder.

Нестандартная выгрузка

Если вам необходимо выгрузить не все элементы, а только элементы с каким-то признаком, в крайнем случае можно на время подправить код ядра, который относится к xml-экспорту (делайте это только если вы программист и понимаете что делаете).

Например, нам нужно выгрузить только элементы, лежащие в активных разделах с учетом активности родительских разделов (стандартный функционал, к сожалению это сделать не позволяет).

Для этого можно подправить код функции CIBlockCMLExport::ExportElements (в файле  /bitrix/modules/iblock/classes/general/cml2.php приблизительно в строке 5225) и добавить фильтр по активности разделов ("SECTION_GLOBAL_ACTIVE"=>"Y").


if(is_array($arElementFilter))

{
   
$arFilter $arElementFilter;
}
else
{
   if(
$arElementFilter === "none")
      return 
0;
   
$arFilter = array (
      
"IBLOCK_ID"=> $this->arIBlock["ID"],
      
"ACTIVE" => "Y",
      
"SECTION_GLOBAL_ACTIVE"=>"Y",
      
">ID" => $this->next_step["LAST_ID"],
   );
   if(
$arElementFilter === "all")
      unset(
$arFilter["ACTIVE"]);
}

P.S. Если ваш импорт зависает, возможно, вам поможет эта статья: http://g-rain-design.ru/blog/posts/php-long-scripts-timeouts/

Чтобы оставить сообщение, авторизуйтесь, или войдите с помощью:
31.05.2012 18:32:11
Голосуйте за идею внедрить архивацию в XML экспорт: http://idea.1c-bitrix.ru/arkhivatsiya-pri-xml-eksporteimporte-infoblokov/
Анатолий
10.09.2012 02:57:48
Уточнения по версии модуля инфоблоки 11.5.1 (05.07.2012)
Делал я это с целью копирования инфоблока, чтобы иметь в распоряжении тестовый инфоблок и делать с ним все что пожелаю не влияя на рабочий.

Экспорт прошел тривиально. Использовал XML.
А вот с импортом пришлось повозиться, чтобы система посчитала импортируемые данные новыми (не отсносящимися к существующему) инфоблоку.

Менял безуспешно поля
  • Классификатор/Ид
  • Классификатор/Наименование
  • Каталог/ИдКлассификатора
  • Каталог/Наименование
  • Каталог/БитриксКод
И только после изменения Каталог/Ид после импорта были созданы новые элементы инфоблока и новый инфоблок.
Рисковать не стал, насчет ИД нового инфоблока. Сначала сделал запрос по таблице БД b_iblock.
24.02.2016 14:07:36
Выгрузка конкретных свойств элементов
Как осуществить выгрузку определенных заранее свойств элементов?
24.02.2016 15:17:02
Никак, он просто выгружает все свойства что есть.
24.02.2016 15:55:24
Это я знаю, придется переделать)
24.02.2016 16:07:39
Указать свойства можно только при экспорте в csv
Alex
02.09.2016 14:35:02
Импорт из XML в инфоблок (нет привязки к разделам)
Нашел в документации  http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockcmlimport/index.php



$ABS_FILE_NAME $_SERVER["DOCUMENT_ROOT"]."/xml/demo.xml";

$WORK_DIR_NAME substr($ABS_FILE_NAME0strrpos($ABS_FILE_NAME"/")+1);
           
           
$obXMLFile = new CIBlockXMLFile;
           
// Удаляем результат предыдущей загрузки
           
$obXMLFile->DropTemporaryTables();
           
// Подготавливаем БД
           
if($obXMLFile->CreateTemporaryTables())
           {
            if(
$fp fopen($ABS_FILE_NAME"rb"))
            {
               
// Чтение содержимого файла за один шаг
               
$obXMLFile->ReadXMLToDatabase($fp$NS0);
               
fclose($fp);
                
// Индексируем загруженные данные для ускорения доступа
                
if(CIBlockXMLFile::IndexTemporaryTables()){
                 
$obCatalog = new CIBlockCMLImport;
                 
$obCatalog->InitEx($NS, array(
                 
"files_dir" => $WORK_DIR_NAME
                 
));
                 
$result $obCatalog->ImportMetaData(1$IBLOCK_TYPE_ID"s1");
                 if(
$result === true){
                  
$result $obCatalog->ImportSections();
                  
$obCatalog->SectionsResort();
                  
$obCatalog->ReadCatalogData($_SESSION["BX_CML2_IMPORT"]["SECTION_MAP"], $_SESSION["BX_CML2_IMPORT"]["PRICES_MAP"]);
                  
$result $obCatalog->ImportElements(time(), 0);
                 }
                }
            }
           }

Может вы подскажите, почему при использовании этого когда, при импорте, пропадает привязка товаров к разделам?