02 September, 2018

Импорт/экспорт в SQLite

SQLite + Bitrix

Вступление

Довольно часто возникает необходимость с импортировании и экспортировании каких-либо данных в 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. А все потому что в конретно этом случае у меня не стояла задача выгрузки изображений. Но все же в качестве бонуса приложу часть кода для экспорта и импорта картинок из разделов.

Экспорт

Импорт

02 September, 2018

Страница без шаблона в 1С-Битрикс

Запуск чистой страницы без шаблона, но возможностью использовать компоненты и классы 1С-Битрикс довольно часто становится необходимостью. Например при разработке какого-либо инструмента для импорта/экспорта данных или еще чего-то подобного нам зачастую совсем не нужен карсивый шаблон страницы. Нам нужно только видеть вывод результатов работы скрипта на пустой страничке.

Так как же запустить страницу без шаблона?

А очень просто:


<?php require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
//И дальше ваш код здесь
?>
15 May, 2017

Bitrix debug

1) Отключаем в .htaccess auto_prepend_file /bitrix/modules/security/tools/start.php

2) Включаем логи в Битрикс /bitrix/.settings.php

  'exception_handling' =>
  array (
    'value' =>
    array (
      'debug' => true,
      'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE & ~E_DEPRECATED,
      'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING,
      'ignore_silence' => true,
      'assertion_throws_exception' => false,
      'assertion_error_type' => 256,
      'log' => array (
        'settings' => array (
          'file' => 'bitrix/modules/error.log',
          'log_size' => 1000000,
        ),
    ),
    ),
    'readonly' => true,
  ),

3) Или в php.ini

display_errors display_startup_errors error_log

4) Отладка выгрузки 1С

init.php

AddEventHandler("main", "OnEndBufferContent", "ChangeMyContent");
function ChangeMyContent($content)
{
    if (strpos($_SERVER['REQUEST_URI'],'/bitrix/admin/1c_exchange.php')!==false) {
        $codabra = date("Y-m-d H:i:s")."\n";
        $codabra.= $content."\n";
        $codabra.= $_SERVER['REQUEST_URI']."\n";
        $codabra.= "------------------------------\n";
        file_put_contents($_SERVER["DOCUMENT_ROOT"].'/schmex.log', $codabra, FILE_APPEND);
    }
}
Home