Создание обработчика доставки для 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']); // получили массив для фильтрации

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

Ошибка v17.8.25 "b_sale_trading_platform doesn't exist"

Ошибка в детальной заказа:
[Bitrix\Main\DB\SqlQueryException]
Mysql query error: (1146) Table 'sitemanager.b_sale_trading_platform' doesn't exist (400)
SEL ECT
`sale_tradingplatform_order_trading_platform`.`NAME` AS `SOURCE_NAME`,
`sale_tradingplatform_order`.`ID` AS `UALIAS_0`,
`sale_tradingplatform_order_trading_platform`.`ID` AS `UALIAS_1`
FR OM `b_sale_tp_order` `sale_tradingplatform_order`
LEFT JOIN `b_sale_trading_platform` `sale_tradingplatform_order_trading_platform` ON `sale_tradingplatform_order`.`TRADING_PLATFORM_ID` = `sale_tradingplatform_order_trading_platform`.`ID`
WHERE `sale_tradingplatform_order`.`ORDER_ID` = 11
/var/www/www-root/data/www/your_site.ru/bitrix/modules/main/lib/db/mysqliconnection.php:137
#0: Bitrix\Main\DB\MysqliConnection->queryInternal(string, array, NULL)
/var/www/www-root/data/www/your_site.ru/bitrix/modules/main/lib/db/connection.php:330
#1: Bitrix\Main\DB\Connection->query(string)
/var/www/www-root/data/www/your_site.ru/bitrix/modules/main/lib/orm/query/query.php:3357
#2: Bitrix\Main\ORM\Query\Query->query(string)
/var/www/www-root/data/www/your_site.ru/bitrix/modules/main/lib/orm/query/query.php:825
#3: Bitrix\Main\ORM\Query\Query->exec()
/var/www/www-root/data/www/your_site.ru/bitrix/modules/main/lib/orm/data/datamanager.php:500
#4: Bitrix\Main\ORM\Data\DataManager::getList(array)
/var/www/www-root/data/www/your_site.ru/bitrix/modules/sale/lib/helpers/admin/blocks/orderstatus.php:272
#5: Bitrix\Sale\Helpers\Admin\Blocks\OrderStatus::prepareData(object)
/var/www/www-root/data/www/your_site.ru/bitrix/modules/sale/lib/helpers/admin/blocks/orderstatus.php:336
#6: Bitrix\Sale\Helpers\Admin\Blocks\OrderStatus::getScripts(object, string)
/var/www/www-root/data/www/your_site.ru/bitrix/modules/sale/admin/order_view.php:453
#7: require_once(string)
/var/www/www-root/data/www/your_site.ru/bitrix/admin/sale_order_view.php:2

Решением стало удаление файла: /bitrix/modules/sale/lib/tradingplatform.php

Использование Vue.JS в Битрикс.

Подключение vue библиотеки из ядра битрикс:
Доступна с версии ui 18.5.1
\Bitrix\Main\UI\Extentions::Load("ui.vue");

Подключение vuex:
Доступна с версии ui 18.5.1
\Bitrix\Main\UI\Extentions::Load("ui.vue.vuex");

Подключение дебаг информации от vue
Добавить в init.php - подключение версии для разработки
define('VUEJS_DEBAG', true)

Для использования функций vue в битрикс, нужно использовать не Vue.xxx
а BX.Vue.xxx - где xxx нужная функция
Исключение. Для создания экземпляра писать не
new Vue(...)
а
BX.Vue.create(...)

Для использования функций vuex правила теже
а BX.Vuex.xxx - где xxx нужная функция
Vuex.Store(...) заменить на BX.Vuex.store(...)

Как работает bitrix:main.ui.grid

Гриды работают на 80% через сервер, т.е. вся сортировка, фильтрация, отображение колонок происходит через запросы к серверу.

Основная идея:
есть компонент (component.php) со своей логикой выборки и обновления данных.
есть шаблон, где подключены компоненты bitrix:main.ui.filter и bitrix:main.ui.grid - они только отображают полученные данные и реализуют интерфейс для взаимодействия с сервером (отправка запросов происходит через js шаблона либо штатными методами грида)

итак, вот примеры вызова наших компонентов в шаблоне (templates.php):
<? $APPLICATION->IncludeComponent('bitrix:main.ui.filter', '', [
        'FILTER_ID' => $arResult['GRID']['ID'].'_filter',
        'GRID_ID' => $arResult['GRID']['ID'],
        'FILTER' => $arResult['GRID']['FILTER'],
        'ENABLE_LIVE_SEARCH' => true,
        'ENABLE_LABEL' => true
]); ?>
<? $APPLICATION->IncludeComponent(
        'bitrix:main.ui.grid',
        '',
        [
            'GRID_ID' => $arResult['GRID']['ID'],
            'COLUMNS' => $arResult['GRID']['COLUMNS'],
            'ROWS' => $arResult['GRID']['DATA'],
            'SHOW_ROW_CHECKBOXES' => true,
            'NAV_OBJECT' => $arResult['GRID']['NAV'],
            'AJAX_MODE' => 'Y',
            'AJAX_ID' => \CAjax::getComponentID('bitrix:main.ui.grid', '.default', ''),
            'PAGE_SIZES' => [
                ['NAME' => "5", 'VALUE' => '5'],
                ['NAME' => '10', 'VALUE' => '10'],
                ['NAME' => '20', 'VALUE' => '20'],
                ['NAME' => '50', 'VALUE' => '50'],
                ['NAME' => '100', 'VALUE' => '100']
            ],
            'AJAX_OPTION_JUMP'          => 'N',
            'SHOW_CHECK_ALL_CHECKBOXES' => true,
            'SHOW_ROW_ACTIONS_MENU'     => true,
            'SHOW_GRID_SETTINGS_MENU'   => true,
            'SHOW_NAVIGATION_PANEL'     => true,
            'SHOW_PAGINATION'           => true,
            'SHOW_SELECTED_COUNTER'     => true,
            'SHOW_TOTAL_COUNTER'        => true,
            'SHOW_PAGESIZE'             => true,
            'SHOW_ACTION_PANEL'         => true,
            'ACTION_PANEL'              => $arResult['GRID']['ACTION_PANEL'],
            'ALLOW_COLUMNS_SORT'        => true,
            'ALLOW_COLUMNS_RESIZE'      => true,
            'ALLOW_HORIZONTAL_SCROLL'   => true,
            'ALLOW_SORT'                => true,
            'ALLOW_PIN_HEADER'          => true,
            'AJAX_OPTION_HISTORY'       => 'N',
            "SORT" => $arResult['GRID']["SORT"],
            "SORT_VARS" => $arResult['GRID']["SORT_VARS"],
            "FOOTER" => array(array("title" => "Всего", "value" => $arResult['GRID']["ROWS_COUNT"])),
            "FILTER" => $arResult['GRID']["FILTER"],
        ]
); ?>

Можно заметить, что вся информация по гридам разнесена в свойстве массива $arResult['GRID'] - это позволит интегрировать гриды в дефолтные компоненты без ущерба другим шаблонам.

Чуть позже найду время расписать все параметры этих компонентов (ведь их тоже нигде не найти в открытом виде)

Где документация по bitrix:main.ui.grid

Гриды - Интересный инструмент в Битрикс но опять без документации...


Как я выяснил, это уже старый инструмент (статьи по main.interface.grid нашёл за 2010 год, а по новым гридам (main.ui.grid) самые первые за 2018 год)
Но поскольку документации нет почти нет, я решил отписываться сюда по реализованному функционалу, добавил тег #main.ui.grid

Если касса 1C-Bitrix.кассы зависла и не печатает чеки

При проверке работы кассы возможна ситуация, когда чеки не печатаются и "висят" в системе в статусе В процессе печати.
Удалить такие чеки через интерфейс нельзя, поэтому
Если касса 1C-Bitrix.кассы зависла и не печатает чеки, то наиболее быстрым будет вручную удалить чеки из системы и сформировать чек вручную.

Для удаления чеков в PHP панели(/bitrix/admin/php_command_line.php?lang=ru) пишем:
CModule::IncludeModule("sale");
\Bitrix\Sale\Cashbox\Internals\CashboxCheckTable::delete(id_чека);
Страницы: 1 | 2 | След.