Довольно часто возникает необходимость с импортировании и экспортировании каких-либо данных в 1С-Битрикс. Для этого предусмотрен замечательный штатный механизм экспорта в csv и xml-файлы. Работают они хорошо, но имеют свои ограничения.

К примеру xml-экспорт по умолчанию заточен под выгрузку и импорт в один и тот же инфоблок.

Выгрузка в csv-файл напротив заточена под обмен данными с различными системами. На выходе получается csv-файл. Формат куда проще этого вашего XML, но в случае с большими инфоблоками получаются совершненно огромные файлы с которыми трудно работать в интерфейсе условного “экселя”. Также при переносе нужно не забыть прихватить директорию upload/iblock т.к. пути к картинкам ведут туда и по-умолчанию придется тащить всю директорию даже если вы выгрузили только один маленький инфоблок с 3 картинками. Ну или вытаскивать картинки вручную/написанным обработчиком. Также как-то замороченно выглядят привязки к разделам/элементам других инфоблоков. Далеко не самая удобная выгрузка получается, да и лично мне проще работать с SQL-базами данных.

Можно конечно запилить еще одну MySQL БД и экспортировать данные туда, но ведь мы делали экспорт чтобы унести данные куда-то, а стало быть нам затем придется ее и дампить базу. Не так уж и удобно получается. Поэтому ищем другой выход…

SQLite нас спасет

Действительно, та же БД, но в удобном формате =) Ну а теперь я запилю небольшой тестовый проект с примером импорта и экспорта данных из инфоблоков в SQLite.

1. Проверяем доступность SQLite на сервере

Набираем

php -m

и ищем в выводе pdo_sqlite, если данного модуля нет, то устанавливаем его.

Ищем sqlite3

whereis sqlite3

Аналогично в случае недоступности доустанавливаем.

2. Устанавливаем зависимости через composer

Сайт у нас будет называться - test.com, в корне создаем директорию с названием test-export и там размещаем composer.json

{
    "name": "bxblog/testexport",
    "require": {
        "j4mie/idiorm": "^1.5"
    },
    "authors": [
        {
            "name": "Test Testoff",
            "email": "tester@test.com"
        }
    ]
}

И подтягиваем зависимости

composer update

Тут могут возникнуть сложности с отсутствием опыта работы с composer, но если вы до сих пор не используете сей чрезвычайно полезный инструмент в работе то рекомендую прямо сейчас и начать. Несомненно пригодится!

3. Пишем свои функции для импорта и экспорта

Итак, после выполнения первых двух шагов в нашей директрии появляются 2 файла и одна директория:

Теперь создадим файл со схемой БД:

В нашу БД мы будем записывать старый id элемента (old_id), затем все необходимые нам поля закодированные в json (data), внешний код элемента (external_id) и при импорте будем отмечать уже обработанные строки (imported).

Теперь создаем там файл index.php

Создаем директорию images.

Создаем директорию includes и файлы:

И файл для импорта:

4. Все!

Вот собственно и все! Теперь при обращении к test.com/test-export/ у нас сгенерируется экспортированная БД (export.db).

Для импорта в другой инфоблок вам нужно лишь раскомментировать следующую строку в index.php

Вот скрин с итоговым кол-вом файлов в проекте:

А вот так мы можем просматривать наш экспорт через GUI:

P.S. А как же картинки?

Внимательные читатели догадаются что у нас никоим образом не использовалась директория images. А все потому что в конретно этом случае у меня не стояла задача выгрузки изображений. Но все же в качестве бонуса приложу часть кода для экспорта и импорта картинок из разделов.

Экспорт

Импорт

Предыдущая запись Следующая запись