Получение данных из 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где x — это рандомное число/буквенное значение, генерируемое в 1с.
offers___xxxxxxxxxxxxxxxxxxxxx
prices___xxxxxxxxxxxxxxxxxxxxx
rests___xxxxxxxxxxxxxxxxxxxxxx
Помимо этих шести папок, в корне выгрузки лежат еще два файла:
import___xxxxxxxxxxxxxxxxxxxxxxxКоторые собственно отвечают за формирование каталога товаров и его дочерних подпапок. Моя задача при вызове ветки условия case 'import' проанализировать, что это у меня папка или файл в корне. Если папка, то мы в нее должны зайти и прочитать лежащие там файлы, если это файл, то просто получить его данные. Возвращая значение @$_REQUEST['filename'], я получаю лишь названия файлов в корне, получить папки мне не удается. Хотел спросить, как можно сделать, чтобы получить из @$_REQUEST данные папка это или нет. С 1с туго очень у меня, потому я как хромой всадник, в php варит голова, а в 1с нет. Есть идеи у кого как сделать правильно? Несколько часов уже убил на это решение. Простите за перегруженность вопроса информацией, кратко не изложишь просто эту проблему.
offers___xxxxxxxxxxxxxxxxxxxxxxx
Резюмируя все вышесказанное, хотел спросить, как можно корректно получить полные данные о каталогах и файлах с 1с? Чтобы проанализировать дерево каталогов передаваемых из 1с и все его файлы соответственно прочитать.
Комментарии: 2
у меня из xml так и не получилось, но почти сносно получилось через csv за исключением пары моментов
1) mSync (mSklad) игнорирует папки при импорте файлов, и складывает все приходящие файлы в одну временную папку.
2) Если случай применения данного аддона не единичный, то добавлю в компонент. Но нужна документация, что приходит в дополнительных файлах.
2) Если случай применения данного аддона не единичный, то добавлю в компонент. Но нужна документация, что приходит в дополнительных файлах.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.