Создание обработчика доставки для 1С-Битрикс (метод 2012 года)

Старый метод, позволяет понять некоторые вещи в работе доставки.

Разработчики, которые делают проекты на Битрикс, хорошо знакомы с двумя типами служб доставки в этой CMS — это Настраиваемые и Автоматизированные. В этой статье мы посмотрим как сделать свой Автоматизированный обработчик доставки и даже сделаем простой пример такого обработчика.

Об автоматизированном обработчике доставки

Все предустановленные обработчики располагаются в папке /bitrix/modules/sale/lang/ru/delivery/ . Свои обработчики следует располагать в папке /bitrix/php_interface/include/sale_delivery/ (этот путь можно изменить в свойствах модуля интернет-магазина). Обработчик представляет собой класс определенной структуры со строкой подключения обработчика доставки по событию onSaleDeliveryHandlersBuildList .

Класс обработчика доставки должен иметь ряд методов, типы действий которых, описываются в методе Init класса.

Эти методы такие:

1. Init — происходит инициализации основных полей.

2. DBGETSETTINGS  — метод считывания значений параметров.

3. DBSETSETTINGS  — метод установки значений параметров.

4. GETCONFIG — определение конфигурации настроек (их можно разбить на табы).

5. COMPABILITY — проверка совместимости профилей обработчика с заказом.

6. CALCULATOR — расчет стоимости доставки.

Также должны быть заданы поля:

1. SID  —  Уникальный строковой идентификатор обработчика.
2. NAME —  Название обработчика.
3. DESCRIPTION — Текстовое описание обработчика
4. DESCRIPTION_INNER — Внутреннее описание обработчика, отображаемое при конфигурации обработчика в Панели Управления.
5. BASE_CURRENCY — Идентификатор базовой валюты обработчика
6. HANDLER — Путь к файлу обработчика. Нужен для корректного автоматического копирования обработчика (ещё не реализовано). В подавляющем большинстве случаев достаточно значения __FILE__

Также должны быть заданы профили доставки. Хотя бы один.

Простейший обработчик доставки.

Не будем мудрить — сделаем обработчик, который ничего не считает и всегда выдает цену одну и ту же, например 200 руб. В нем будет всего один профиль — без ограничений. В настройки вынесем цену доставки.

class CDeliveryPlain
{

    /**
     * Описние обработчика
     */
    function Init()
    {
        //настройки
        return array(
            "SID"                     => "Plain",  // Идентификатор службы доставки
            "NAME"                     => "Пример обработчика службы доставки",
            "DESCRIPTION"             => "Описание его для клиентов сайта",
            "DESCRIPTION_INNER"     => "Описание для администраторов сайта",
            "BASE_CURRENCY"         => "RUR",

            "HANDLER"                 => __FILE__,

            /* Определение методов */
            "DBGETSETTINGS"         => array("CDeliveryPlain", "GetSettings"),
            "DBSETSETTINGS"         => array("CDeliveryPlain", "SetSettings"),
            "GETCONFIG"             => array("CDeliveryPlain", "GetConfig"),

            "COMPABILITY"             => array("CDeliveryPlain", "Compability"),
            "CALCULATOR"             => array("CDeliveryPlain", "Calculate"),

            /* Список профилей */
            "PROFILES" => array(
                "all" => array(
                    "TITLE" => "Без ограничений",
                    "DESCRIPTION" => "Профиль доставки без каких-либо ограничений",

                    "RESTRICTIONS_WEIGHT" => array(0),
                    "RESTRICTIONS_SUM" => array(0),
                ),
            )
        );
    }

    /* Установка параметров */
    function SetSettings($arSettings)
    {
        foreach ($arSettings as $key => $value) {
            if (strlen($value) > 0)
                $arSettings[$key] = doubleval($value);
            else
                unset($arSettings[$key]);
        }

        return serialize($arSettings);
    }

    /* Запрос параметров */
    function GetSettings($strSettings)
    {
        return unserialize($strSettings);
    }

    /* Запрос конфигурации службы доставки */
    function GetConfig()
    {
        $arConfig = array(
            "CONFIG_GROUPS" => array(
                "all" => "Параметры",
            ),

            "CONFIG" => array(
                "DELIVERY_PRICE" => array(
                    "TYPE" => "STRING",
                    "DEFAULT" => "200",
                    "TITLE" => "Стоимость доставки",
                    "GROUP" => "all"
                )
            ),
        );
        return $arConfig;
    }

    /* Проверка соответствия профиля доставки заказу */
    function Compability($arOrder, $arConfig)
    {
        return array("all");
    }

    /* Калькуляция стоимости доставки*/
    function Calculate($profile, $arConfig, $arOrder, $STEP, $TEMP = false)
    {
        return array(
            "RESULT" => "OK",
            "VALUE" => $arConfig["DELIVERY_PRICE"]
        );
    }
}

AddEventHandler("sale", "onSaleDeliveryHandlersBuildList", array("CDeliveryPlain", "Init"));


Сохраним этот обработчик в файле /bitrix/php_interface/include/sale_delivery/delivery_plain.php и посмотрим в список автоматизированных обработчиков. Если мы видим его в списке, то значит все сделано правильно. Нам осталось его активировать и проверить работу.

Информация взята с http://blog.sokov.org/sozdanie-obrabotchika-dostavki-dlya-1s-bitriks/

Как публиковать UserID в Yandex метрику (1C-Bitrix)

Для получения внешнего кода пользователя можно использовать PHP код:
$GLOBALS["USER"]->GetParam('XML_ID');  // или  $GLOBALS["USER"]->GetID();
Для передачи параметров пользователя в Yandex метрику можно использовать код JS:
window.onload = function () {
    try {
        if ({{Полученный в PHP UserID пользователя}}) {
            ym({{код счётчика}}, 'userParams', {
                vip_status: false,
                UserID: {{Полученный в PHP UserID пользователя}}
            });
        }
    } catch (e) {
        console.log("Ошибка отправки UserID");
    }
};


Вопросы и замечания прошу писать ниже в комментариях

Пресет в main.ui.filter

Вот как бы нет нареканий к большущим компонентам main.ui.filter и main.ui.grid, но я нигде не видел рабочий код для передачи данных для пресета фильтра и последующей фильтрации выборки для main.ui.grid.

Фокус в том, что пресет задаётся до вызова этих компонентов, и выбранный "по умолчанию" должен примениться к выборке main.ui.grid.
Что бы это реализовать в компоненте в месте где получаем и проверяем значения фильтра делаем так:
$arResult['GRID']['FILTER_ID'] = (str)$arParams['FILTER_ID];
$arResult['GRID']['FILTER_FIELDS'] =  $arParams['FILTER_FIELDS] // массив полей фильтра
$arResult['GRID']['FILTER_OBJ'] = new Bitrix\Main\UI\Filter\Options($arResult['GRID']['FILTER_ID'], $arParams['FILTER_PRESETS']); // либо запилить пресет прямо в компонент.
$filterData = $arResult['GRID']['FILTER_OBJ']->getFilter($arResult['GRID']['FILTER_FIELDS']); // получили массив для фильтрации

Фильтруем! :)