Интеграция сайта с 1С или "хитрые" контрагенты

дата: 19.10.2015 автор: Александр Буйлов

Я долго и упорно не мог отловить данные о пользователях которые приходят из 1С. Ловить их через события конечно не составляет труда, но вся проблема в том, что туда приходят не совсем полные данные в сравнением с тем, что отправила 1С. Хотелось поправить данные до того, как они будут добавлены на сайт и сделать это нужно так аккуратно, чтобы не покалечить из без того "несчастное" ядро Битрикса.

В общем ответ был найден самостоятельно...

Как мне сказала "Великая и Могучая" Техническая поддержка самого Битрикса:
За выгрузку отвечает файл \bitrix\modules\sale\general\order_loader.php вам нужно отладкой этого файла найти где хранятся нужные вам данныех. 
Техподдержка 1C-Bitrix

А вот за работу с данными отвечает компонент "sale.export.1c". И что же нужно с ним сделать, смотрите далее...

Первым делом копируем компонент к себе в папку, например "/bitrix/components/my" Открываем файл "/bitrix/components/my/component.php" и что мы видим?? Да видим мы кашу из кода который достаточно тяжело читать, не то что понимать. Но коли нам нужны пользователи из импорта которые у меня приходили файлом ищем вот такое условие:

elseif($_GET["mode"] == "import" && $ABS_FILE_NAME)

Кстати для отладки я создал небольшой файл который методом POST отправлял на страницу импорта все необходимые данные:


<form method="post" action="/bitrix/admin/1c_exchange.php?type=sale&mode=import&filename=contragents___f6078d41-69c4-4a96-9adf-92df5529f0e8.xml">
    <input type="hidden" name="sessid" id="sessid" value="b786923acada551822ab74bef29c1b60" />
    <input type="submit" value="Отправить" />
</form>

Файл должен лежать в папке "/upload/1c_exchange/contragents___f6078d41-69c4-4a96-9adf-92df5529f0e8.xml".

В файле "/bitrix/components/my/component.php" мы видим что все необходимы манипуляции с контрагентами проходят через класс "CSaleOrderLoader" который находится именно в том файле куда нас послала направила ТП. Открываем его и видим еще более глубокую и изощренную кашу. По сути мне нужна была только функция "CSaleOrderLoader::collectAgentInfo()" чтобы нормализовать данные о пользователе. Но я ни как не мог догнать или мне было просто лень (хотя наверное все таки лень), как они туда приходят. Всю работу с пользователями приводит метод "CSaleOrderLoader::nodeHandler(CDataXML $value)" внутри которого и вызывается метод для нормализации.

Что же нужно с ними такими страшными сделать:

Я создал файл прям в папке с компонентом который скопировал в слою папку. В нем описал свой класс который унаследовал от класса "CSaleOrderLoader". В моем классе только один метод "nodeHandler()", а все остальные пусть выполняет родительский (тут надо казать разрабам Битрикса спасибо, что они не сделали все методы приватными, иначе ... ну вы понимаете).

Вот результат:


/bitrix/components/my/component.php

// ...
elseif($_GET["mode"] == "import" && $ABS_FILE_NAME) {
    if(file_exists($ABS_FILE_NAME) && filesize($ABS_FILE_NAME)>0) {
        if(!is_array($_SESSION["BX_CML2_EXPORT"]) || !array_key_exists("last_xml_entry", $_SESSION["BX_CML2_EXPORT"]))
            $_SESSION["BX_CML2_EXPORT"]["last_xml_entry"] = "";
            include_once(__DIR__."/class/Gorshok.php");
            $position = false; $loader = new Gorshok();
            // $loader = new CSaleOrderLoader; // Это стандартный класс, он на не нужен
            // ... все остальное пусть так и остается
        }
    } // ...

/bitrix/components/my/class/Gorshok.php

class Gorshok extends CSaleOrderLoader {
    public function nodeHandler(CDataXML $value) {
        $value = $value->GetArray();
        if(!empty($value[GetMessage("CC_BSC1_DOCUMENT")])) {
            parent::nodeHandler($value); // это мне не надо было, пусть родитель мучается
        } elseif($this->arParams["IMPORT_NEW_ORDERS"] == "Y") {
            $value = $value[GetMessage("CC_BSC1_AGENT")]["#"];
            $arAgentInfo = $this->collectAgentInfo($value);
            // $arAgentInfo - вот тут у нас уже нормальные данные, прям тут можем их записывать в БД или еще чего нибудь
        }
    }
}

Ну и в общем-то все, там почти все данные по пользователям. Да я уже за одно то, что так могу более адекватные логины сформировать готов ее юзать!

Рекомендуем почитать

Как санаторию получить клиентов из интернета?
Все больше курортно-лечебных учреждений обращают внимание на интернет, как способ привлечения новых клиентов. Но какие инструменты выбрать и как с ними работать?
Мы вывели Башкомснаббанк в лидеры рейтинга Frank Research Group
Акция "Лайк БКСБ", которую мы запустили для банка в феврале 2015 года уже в первый месяц сделала его лидером по многим показателям в социальных сетях по рейтингу Frank Research Group.
Где искать информацию про жилые комплексы? На ALODO!
Пару месяцев одна из проектных групп весело и с душой работала над проектом ALODO. Это один из немногих проектов, который прошел все этапы в нашем агентстве - от нейминга и айдентики до запуска и сопровождения.

Читайте также

Зажгли на «Пекло»: отзыв о конференции
Мы стараемся не пропускать полезные конференции по нашей теме. «Пекло» не исключение. Решили написать свой отзыв о мероприятии.
Помогаем выстроить стратегию цифровой экономики РБ
На этой неделе мы приняли участие на форсайт-сессии по определению основных направлений стратегии цифровизации экономики Республики Башкортостан.
Новость для предпринимателей: разработаем сайт бесплатно
Хотите сайт прямо сейчас, но нет на него средств? Кажется, мы нашли для вас идеальное решение! Бесплатное. Сейчас все расскажем по порядку.
Хочу заказать дизайн сайта: что обсудить со специалистами?
Что вам нужно обязательно рассказать представителям интернет-компании, заказывая дизайн, чтобы потом не оказаться у разбитого корыта.
Почему мы выбираем xMind и Axure?
Мы уже писали о том, что такое прототип. Сейчас хотим рассказать, почему для его создания мы выбираем xMind и Axure.
Что такое прототип сайта и для чего он нужен?
Представьте, что вы заказали сайт. Встретились с менеджером, обсудили проект, оплатили работу. Что дальше?

Всегда на связи

Заполните форму внизу или позвоните по телефону