Интерфейс экспорта-импорта инфоблоков посредством XML в продуктах 1С-Битрикс выглядит очень просто. Достаточно выбрать инфоблок, файл для загрузки-выгрузки, несколько дополнительных параметров, и казалось бы, дело сделано. Но на деле эта простота является немного обманчивой, и последствия от незнания некоторых аспектов, такие, как, например, загрузка данных не в тот инфоблок при импорте, создание дополнительных свойств вместо загрузки данных в существующие, могут выбить из колеи даже достаточно опытного пользователя или программиста, и заставить его на долгое время забыть об использовании этого мощного инструмента. Я постараюсь рассказать вам об этих аспектах.
[spoiler]
Внешний код
Главная хитрость: идентификация инфоблоков, свойств, разделов, элементов и пр. осуществляется по внешнему коду (XML_ID или EXTERNAL_ID). Внешний код - это код, используемый для синхронизации данных с внешними источниками. По умолчанию, возможность его отображения и редактирования через административный интерфейс выключена. Чтобы включить ее, нужно перейти в настройки модуля "Информационные блоки" (Настройки - Настройки продукта - Настройки модулей) и установить галочку "Показывать код загрузки из внешних источников".
При создании разделов и элементов инфоблоков, если внешний код не указан - он заполняется автоматически значением ID элемента или раздела. Но с инфоблоками и свойствами дело обстоит не так - по умолчанию внешний код пустой, но он создается при первом XML импорте аналогичным способом - заполняется значением ID инфоблока или свойства.
Соответственно, чтобы избежать создания ненужных инфоблоков или ошибочного импорта не в тот инфоблок - первое, что нужно сделать - проверить соответствие внешнего кода инфоблока-источника и целевого инфоблока. Если экспорт был сделан давно, или по какой-то другой причине нет возможности посмотреть внешний код инфоблока-источника, то его можно узнать, открыв xml-файл при помощи текстового редактора, из первых строк:
В данном примере значение "12" - и есть внешний код инфоблока.
Внешние коды свойств также должны соответствовать инфоблоку-источнику, в противном случае будут созданы новые свойства.
Свойства привязки к элементам и разделам
Свойства привязки к элементам и разделам также импортируются корректно. При импорте происходит преобразование значений свойств из внешнего кода в ID, поэтому инфоблоки, к элементам или разделам которых осуществляется привязка, должны импортироваться прежде тех, в которых есть свойства привязки к ним.
Файлы
При экспорте файлы, привязанные к элементам инфоблоков, сохраняются в специальной папке с именем, соответствующим имени xml-файла с добавлением "_files".
Если файлов много, то копировать их с одного хостинга на другой при помощи ftp может быть неудобно, к тому же на linux-хостингев одной папке могут находится больше одного файла с одинаковым именем, но отличающимся регистром символов, и при копировании таких файлов в Windows или Mac OS X, могут возникнуть проблемы (мне приходилось не раз сталкиваться с этим).
В таких случаях лучше воспользоваться доступом к командной строке (ssh) для упаковки файлов в архив, например, команда
заархивирует все файлы и папки, начинающиеся с "news". При этом нельзя использовать имя архива news.tar.gz во избежание архивации его самого в себя.
Команда
распакует архив в целевой папке.
Для навигации по файловой системе с помощью командной строки используются команды ls - просмотр содержимого текущей папки, и cd folder - вход в папку folder.
Нестандартная выгрузка
Если вам необходимо выгрузить не все элементы, а только элементы с каким-то признаком, в крайнем случае можно на время подправить код ядра, который относится к xml-экспорту (делайте это только если вы программист и понимаете что делаете).
Например, нам нужно выгрузить только элементы, лежащие в активных разделах с учетом активности родительских разделов (стандартный функционал, к сожалению это сделать не позволяет).
Для этого можно подправить код функции CIBlockCMLExport::ExportElements (в файле /bitrix/modules/iblock/classes/general/cml2.php приблизительно в строке 5225) и добавить фильтр по активности разделов ("SECTION_GLOBAL_ACTIVE"=>"Y").
P.S. Если ваш импорт зависает, возможно, вам поможет эта статья: http://g-rain-design.ru/blog/posts/php-long-scripts-timeouts/
[spoiler]
Внешний код
Главная хитрость: идентификация инфоблоков, свойств, разделов, элементов и пр. осуществляется по внешнему коду (XML_ID или EXTERNAL_ID). Внешний код - это код, используемый для синхронизации данных с внешними источниками. По умолчанию, возможность его отображения и редактирования через административный интерфейс выключена. Чтобы включить ее, нужно перейти в настройки модуля "Информационные блоки" (Настройки - Настройки продукта - Настройки модулей) и установить галочку "Показывать код загрузки из внешних источников".
При создании разделов и элементов инфоблоков, если внешний код не указан - он заполняется автоматически значением ID элемента или раздела. Но с инфоблоками и свойствами дело обстоит не так - по умолчанию внешний код пустой, но он создается при первом XML импорте аналогичным способом - заполняется значением ID инфоблока или свойства.
Соответственно, чтобы избежать создания ненужных инфоблоков или ошибочного импорта не в тот инфоблок - первое, что нужно сделать - проверить соответствие внешнего кода инфоблока-источника и целевого инфоблока. Если экспорт был сделан давно, или по какой-то другой причине нет возможности посмотреть внешний код инфоблока-источника, то его можно узнать, открыв xml-файл при помощи текстового редактора, из первых строк:
|
В данном примере значение "12" - и есть внешний код инфоблока.
Внешние коды свойств также должны соответствовать инфоблоку-источнику, в противном случае будут созданы новые свойства.
Свойства привязки к элементам и разделам
Свойства привязки к элементам и разделам также импортируются корректно. При импорте происходит преобразование значений свойств из внешнего кода в ID, поэтому инфоблоки, к элементам или разделам которых осуществляется привязка, должны импортироваться прежде тех, в которых есть свойства привязки к ним.
Файлы
При экспорте файлы, привязанные к элементам инфоблоков, сохраняются в специальной папке с именем, соответствующим имени xml-файла с добавлением "_files".
Если файлов много, то копировать их с одного хостинга на другой при помощи ftp может быть неудобно, к тому же на linux-хостингев одной папке могут находится больше одного файла с одинаковым именем, но отличающимся регистром символов, и при копировании таких файлов в Windows или Mac OS X, могут возникнуть проблемы (мне приходилось не раз сталкиваться с этим).
В таких случаях лучше воспользоваться доступом к командной строке (ssh) для упаковки файлов в архив, например, команда
|
заархивирует все файлы и папки, начинающиеся с "news". При этом нельзя использовать имя архива news.tar.gz во избежание архивации его самого в себя.
Команда
|
распакует архив в целевой папке.
Для навигации по файловой системе с помощью командной строки используются команды ls - просмотр содержимого текущей папки, и cd folder - вход в папку folder.
Нестандартная выгрузка
Если вам необходимо выгрузить не все элементы, а только элементы с каким-то признаком, в крайнем случае можно на время подправить код ядра, который относится к xml-экспорту (делайте это только если вы программист и понимаете что делаете).
Например, нам нужно выгрузить только элементы, лежащие в активных разделах с учетом активности родительских разделов (стандартный функционал, к сожалению это сделать не позволяет).
Для этого можно подправить код функции CIBlockCMLExport::ExportElements (в файле /bitrix/modules/iblock/classes/general/cml2.php приблизительно в строке 5225) и добавить фильтр по активности разделов ("SECTION_GLOBAL_ACTIVE"=>"Y").
|
P.S. Если ваш импорт зависает, возможно, вам поможет эта статья: http://g-rain-design.ru/blog/posts/php-long-scripts-timeouts/
10.07.201120:4210.07.2011 20:42:47
Делал я это с целью копирования инфоблока, чтобы иметь в распоряжении тестовый инфоблок и делать с ним все что пожелаю не влияя на рабочий.
Экспорт прошел тривиально. Использовал XML.
А вот с импортом пришлось повозиться, чтобы система посчитала импортируемые данные новыми (не отсносящимися к существующему) инфоблоку.
Менял безуспешно поля
- Классификатор/Ид
- Классификатор/Наименование
- Каталог/ИдКлассификатора
- Каталог/Наименование
- Каталог/БитриксКод
И только после изменения Каталог/Ид после импорта были созданы новые элементы инфоблока и новый инфоблок.Рисковать не стал, насчет ИД нового инфоблока. Сначала сделал запрос по таблице БД b_iblock.
Как осуществить выгрузку определенных заранее свойств элементов?
Нашел в документации http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockcmlimport/index.php
Может вы подскажите, почему при использовании этого когда, при импорте, пропадает привязка товаров к разделам?