Получение данных из 1с на сайте


Доброго времени суток).

Решаю непростую задачу, как передача xml-отчетности 1с на сайт. На 1с установлен аддон описанный по этой ссылке

Сайт реализован на modx, с иcпользованием компонента MSklad. Но не в этом суть вопроса собственно. В ходе исследований установлена точка входа 1с на сайт — файл 1c_exchange.php, который собственно вызывается из 1с для передачи данных. Подробнее о протоколе обмена данными между 1с и сайтом, можно почитать тут. В файле отмечу важные аспекты:

$type = $_REQUEST['type'];
$mode = $_REQUEST['mode'];
Идет передача через $_REQUERST данных, а именно типа (type) получаемого объекта. Объект может быть остатком именованный почему-то как catalog, либо может быть заказом именованный как sale. Sale трогать не буду — это отдельная тема разговора. Рассматривая конструкцию, если $_REQUEST['type'] = catalog, то идет следующая логика:

case 'catalog':
        switch ($mode) {
           // авторизация 1с на сервере
           case 'checkauth':
                $response = $mSklad->catalog->checkauth();
            break;

            // инициализация перед просмотром каталога
            case 'init':
                $response = $mSklad->catalog->init();
            break;

            // загрузчик данных файла xml
            case 'file':
                $response = $mSklad->catalog->file(@$_REQUEST['filename'], @file_get_contents("php://input"));
            break;

        // Операция импорта товаров из mskladCatalogHandler.class.php 
            case 'import':
            $response = $mSklad->catalog->import(@$_REQUEST['filename'], @file_get_contents("php://input"));
            break;

            default:        
            break;
       }
       break;
На пальцах объясню. Сначала идет инициализация, то есть вызывается метод init. Затем идет вызов авторизации 1ски на сайте, соответственно через ветку условия checkauth. Далее идет формирование импорта import — формирование каталога просматриваемого для передачи хранимых в нем файлов. Заключительным условием будет итерация с заголовком case 'file':

Все решается просто если у нас имеется одна папка и в ней лежат файлы, полученные с 1с. Аддон который установлен в 1с, позволяет расширить функциональную выгрузку данных. В итоге у нас получается шесть папок нумерованный в последовательности от 1 до 6. В каждой хранятся файлы:

import___xxxxxxxxxxxxxxxxxxxxx
offers___xxxxxxxxxxxxxxxxxxxxx
prices___xxxxxxxxxxxxxxxxxxxxx
rests___xxxxxxxxxxxxxxxxxxxxxx
где x — это рандомное число/буквенное значение, генерируемое в 1с.

Помимо этих шести папок, в корне выгрузки лежат еще два файла:

import___xxxxxxxxxxxxxxxxxxxxxxx
offers___xxxxxxxxxxxxxxxxxxxxxxx
Которые собственно отвечают за формирование каталога товаров и его дочерних подпапок. Моя задача при вызове ветки условия case 'import' проанализировать, что это у меня папка или файл в корне. Если папка, то мы в нее должны зайти и прочитать лежащие там файлы, если это файл, то просто получить его данные. Возвращая значение @$_REQUEST['filename'], я получаю лишь названия файлов в корне, получить папки мне не удается. Хотел спросить, как можно сделать, чтобы получить из @$_REQUEST данные папка это или нет. С 1с туго очень у меня, потому я как хромой всадник, в php варит голова, а в 1с нет. Есть идеи у кого как сделать правильно? Несколько часов уже убил на это решение. Простите за перегруженность вопроса информацией, кратко не изложишь просто эту проблему.

Резюмируя все вышесказанное, хотел спросить, как можно корректно получить полные данные о каталогах и файлах с 1с? Чтобы проанализировать дерево каталогов передаваемых из 1с и все его файлы соответственно прочитать.
Андрей
12 января 2015, 10:37
modx.pro
2 950
0

Комментарии: 2

Сергей Скат
13 января 2015, 19:03
0
у меня из xml так и не получилось, но почти сносно получилось через csv за исключением пары моментов
    Александр Рахимов
    18 января 2015, 23:44
    0
    1) mSync (mSklad) игнорирует папки при импорте файлов, и складывает все приходящие файлы в одну временную папку.
    2) Если случай применения данного аддона не единичный, то добавлю в компонент. Но нужна документация, что приходит в дополнительных файлах.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      2