Как публиковать 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

Проверяем логи, битрикс окружение BitrixEnv

В процессе жизнедеятельности сайт и сервер оставляют после себя различные записи в лог-файлах. Данные из этих файлов желательно периодически разгребать и анализировать, что бы сайт работал быстро и бесперебойно

Для BitrixEnv на centos пути к логам обычно будут такими (зависит от настроек):

  1. Битрикс: __bx_log.log или log.txt в корне сайта. Зависит от переменной LOG_FILENAME в файле /bitrix/php_interface/dbconn.php
  2. Apache: /var/log/httpd/error_log
  3. Nginx: /var/log/nginx/error.log
  4. PHP: /var/log/php/exceptions.log
  5. Почта: /home/bitrix/msmtp_default.log
  6. bash, cron: /var/spool/mail/root и /var/spool/mail/bitrix
  7. bitrixvm: /opt/webdir/temp (логи запущенных задач)

Как часто надо проверять? Раз в неделю стоит поглядывать, я думаю. Просто что бы убедиться, что эти файлы пусты и ошибок не было.

И как бонус стоит проверить файл /var/log/btmp командой last -f /var/log/btmp если там очень много попыток авторизации, значит доступ к ssh кто-то пытается подобрать (brute force). Стоит изменить порт доступа к ssh (в файле /etc/ssh/sshd_config поменять строку "Port 22" на другое значение, разрешить доступ к новому порту в iptables и перезагрузить sshd) Что бы сбросить лог авторизации нужно выполнить команду cat /dev/null > /var/log/btmp

Как сбросить пароль mysql на CentOS

Подключаемся к bash и вводим команды:
1. Остановим mysql:
bash> systemctl stop mysqld

2. Установим опцию для mySQL
bash> systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"

3. Запустим mysql с обновлёнными настройками
bash> systemctl start mysqld

4. Авторизуемся в mysql под root 
bash> mysql -u root

5. Обновим root пароль используя следующие команды (замените ТУТНОВЫЙПАРОЛЬ на ваш пароль)
mysql> UPDATE mysql.user SET authentication_string = PASSWORD('ТУТНОВЫЙПАРОЛЬ') WHERE User = 'root' AND Host = 'localhost';
mysql> FLUSH PRIVILEGES;
mysql> quit

*** Для mysql 5.7.6 и старше нужно использовать 
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'ТУТНОВЫЙПАРОЛЬ';
mysql> FLUSH PRIVILEGES;
mysql> quit

6. Остановим mysql
systemctl stop mysqld

7. Уберём настройку mySQL
systemctl unset-environment MYSQLD_OPTS

8. Запустим mysql в стандартном режиме
systemctl start mysqld

Попробуем авторизоваться с новым паролем:
7. mysql -u root -p

MYSQL on update TIMESTAMP and DATETIME не работает?

Был со мной случай, когда 3-ое суток я искал царапину на попе у слона... а оказалось в доке MYSQL всё написано предельно ясно!
Предыстория: загружаю остатки по товарам на складах из 1С в базу сайта через файл XML, если нет остатков по товару - тогда нужно удалять то, что осталось на сайте. Решил сделать метку последнего обновления и буду чистить что давно не обновлялось... А вот и нет! Пришлось ломать мозг.... в общем вот цитата из доки MYSQL:
An auto-updated column is automatically updated to the current timestamp when the value of any other column in the row is changed from its current value. An auto-updated column remains unchanged if all other columns are set to their current values. To prevent an auto-updated column from updating when other columns change, explicitly set it to its current value. To update an auto-updated column even when other columns do not change, explicitly set it to the value it should have (for example, set it to CURRENT_TIMESTAMP).
Если кратко и по делу: команда ON UPDATE работает для типов TIMESTAMP и DATETIME только если любая другая ячейка изменилась(!) в любом другом случае следует задать своё значение поля в UPDATE.  

Использование 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

Все JS события в Bitrix

Свет на поток событий

Скрипт, которым можно пропустить через себя вызовы JS битриксовских событий.
Выполняем в консоли и начинаем видеть поток событий. Благодаря замыканиям, все объекты в логе доступны для инспекции.
let originalBxOnCustomEvent = BX.onCustomEvent;

BX.onCustomEvent = function (eventObject, eventName, eventParams, secureParams)
{
    // onMenuItemHover например выбрасывает в другом порядке
    let realEventName = BX.type.isString(eventName) ?
        eventName : BX.type.isString(eventObject) ? eventObject : null;

    if (realEventName) {
        console.log(
            '%c' + realEventName, 
            'background: #222; color: #bada55; font-weight: bold; padding: 3px 4px;'
        );
    }

    console.dir({
        eventObject: eventObject,
        eventParams: eventParams,
        secureParams: secureParams
    });

    originalBxOnCustomEvent.apply(
        null, arguments
    );
};

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

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

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

Обмен заказами БУС с 1С (какие поля участвуют)

URL: /bitrix/admin/1c_exchange.php?type=sale

Обмен заказами начинается с авторизации с помощью логина и пароля, который указали в настройках обмена. После авторизации сайт выдает ID сессии, URL: /bitrix/admin/1c_exchange.php?type=sale&mode=checkauth.

После получения ID сессии идёт инициализация обмена, URL: /bitrix/admin/1c_exchange.php?type=sale&mode=init&sessid=ID_Сессии. На этом этапе сайт отдаёт настройки обмена со стороны сайта.

Для получения списка заказов запрашивается URL /bitrix/admin/1c_exchange.php?type=sale&mode=query&sessid=ID_Сессии. Выгружаются заказы с полями EXTERNAL_ORDER = "N", UPDATED_1C = "N" и обновившиеся после последней успешной выгрузки в 1С (это проверяется по времени из свойства "last_export_time_committed_/bitrix/admin/1c_excha" модуля sale).

Флаг EXTERNAL_ORDER указывает, что заказ создан в 1С и его выгрузка в 1С не требуется.

Флаг UPDATED_1C после успешного импорта из 1С на сайте устанавливается в "Y" и такие заказы не участвуют в дальнейших экспортах до их обновления на сайте. Во время обновлений заказов на сайте UPDATED_1C устанавливается в "N".

Деактивировать товар если не активны SKU

Кастомный обмен с 1С впилился в дефолтный компонент catalog.import.1c, но у нас несколько БД сливают информацию о товарах, поэтому из обмена было не понятно какие товары должны отображаться, а какие нет.

Вот пример sql запроса, который включает элемент, у которого хоть 1 активный SKU.
Он же делает наоборот: отключает элемент если все SKU неактивны.

/**
     * catalog_import_1C_finish
     * - событие, вызываемое после окончания обмена одним XML-файлом.
     * @param  mixed $arParams - Параметры подключения компонента обмена.
     * @param  mixed $ABS_FILE_NAME - Полный путь к XML-файлу обмена.
     * @return void
     */
    function catalog_import_1C_finish($arParams, $ABS_FILE_NAME)
    {
        if(stripos($ABS_FILE_NAME,"offers.xml"))
        {
            global $DB;
            $strSql = "CREATE TEMPORARY TABLE `sku_active`
                SELECT `ID`,count(DISTINCT CASE WHEN `ACTIVE` = 'Y' THEN `ID` END) as `COUNT`, substr(`XML_ID`, 1, INSTR(`XML_ID`, '#')-1) AS `PARENT_XML_ID`
                FROM `b_iblock_element`
                WHERE `XML_ID` LIKE '%#%'
                GROUP BY `PARENT_XML_ID`;
            ";
            $DB->Query($strSql, true);

            $strSql = "UPDATE `b_iblock_element` AS `T1`
                SET `T1`.`ACTIVE` = (SELECT CASE WHEN `T2`.`COUNT`>0 THEN 'Y' ELSE 'N' END AS `ACTIVE` FROM `sku_active` AS `T2` WHERE `T1`.`XML_ID` = `T2`.`PARENT_XML_ID`)
                WHERE `T1`.`XML_ID` NOT LIKE '%#%'
            ";
            $DB->Query($strSql, true);
        }
    }


p.s. для оптовой компании решение зашло.

Костыль 'автоотправление заявок в DPD' в модуле Bitrix

Есть модуль "Интеграция с DPD" от компании ipolh.
Всё здорово! Много настроек, но вот только нет одной... автоматической отправки заявки по статусу заказа! т.е. обязательно менеджер магазина (или админ) должен нажать кнопочку (точнее 3 кнопки) что бы отправить заявку в DPD!
В поддержке предложили платную доработку, но ковырять код мы привыкли и я допилил это одним событием, прошу к обозрению:
AddEventHandler("sale", "OnOrderAdd", "OnOrderAddHandler");
AddEventHandler("sale", "OnSaleStatusOrder", "LoadDPD");

    function OnOrderAddHandler($ID, $arFields) {
        self::LoadDPD($ID, $arFields['STATUS_ID']);
    }
    function LoadDPD($ORDER_ID, $STATUS_ID){
        if(!$ORDER_ID) return false;
        if($STATUS_ID=="P")
        {// только на статусе "Оплачено"
            \Bitrix\Main\Loader::includeModule('ipol.dpd');
            $_REQUEST['ID'] = $ORDER_ID;
            $_REQUEST['IPOLH_DPD_ACTION'] = 'CREATE_ORDER';
            $_REQUEST['IPOLH_DPD_ORDER']['PICKUP_DATE'] = date("d.m.Y H:i:s",time()+86400); // через сутки
            if (isset($_REQUEST['ID'])) 
            {
                $arOrder  = \CSaleOrder::GetByID($_REQUEST['ID']);
            }
            else
            {
                $arOrder = \CSaleOrder::GetList(
                    $arOrder = [],
                    $arFilter = [
                        \Bitrix\Main\Config\Option::get('ipol.dpd', 'ORDER_ID', 'ID') => $_REQUEST['dID'],
                    ]
                )->Fetch();
            }
            // кусок из модуля 
            $ORDER_ID = \Ipolh\DPD\Utils::getOrderId($arOrder);
            $deliveryCode = \Ipolh\DPD\Delivery\DPD::getDeliveryCode($arOrder['DELIVERY_ID']);
            $profile      = \Ipolh\DPD\Delivery\DPD::getDeliveryProfile($deliveryCode);
            $showButtonAlways = \Bitrix\Main\Config\Option::get('ipol.dpd', 'SHOW_ADMIN_BUTTON', '') == 'ALWAYS';
            if ($profile !== false || $showButtonAlways)
            {
                $entity = \Ipolh\DPD\DB\Order\Table::findByOrder($ORDER_ID, true);
                if (!$entity->id)
                {
                    $errors = $entity->save();
                }
                if (!$entity->isCreated())
                {
                    $entity->fillFromOrder($ORDER_ID);
                }
                $form = new \Ipolh\DPD\Admin\Order\Edit($entity);
                $form->processAndShow();
            }
        }
        elseif($order = CSaleOrder::GetByID($ORDER_ID) && $order['PAY_SYSTEM_ID']==2)
        {// На проверке менеджером
            CSaleOrder::StatusOrder($ORDER_ID, "CH");
        }
    }
Таким образом, этот костыль не ломает модуль, не отключает его обновления но может перестать работать в случае если разработчик модуля изменит метод отправки...

p.s. если разработчик читает это сообщение и собирается внедрить это в модуль "по умолчанию" - прошу отписаться в комментариях или написать в чат сайта!

Детект мобильного на BX от Битрикс

Для тех кто не знал или не нашёл, у стандартной js-библы БУСа есть такие методы https://dev.1c-bitrix.ru/api_help/js_lib/kernel/browser.php
С их помощью можно через BX определить пользователя с мобильного устройства и изменить логику поведения некоторых элементов! Например, при отображении слайдера для мобильного и плитки для десктопа.

Если кому станет интересно, вскоре опубликую интеграцию адаптивного слайдера в компоненты битрикс.

Кастомизация импорта каталога из 1С в Bitrix

Для начала ссылки на сторонние статьи:
Итак, из всех статей выше мы можем заключить, что обмен проходит через файл /bitrix/admin/1c_exchange.php
посмотрев этот файл мы понимаем, что импорт каталога происходит через компонент catalog.import.1c

Вынесем этот компонент для кастомизации (перенесём папку /bitrix/components/bitrix/catalog.import.1cв /local/components/bitrix/catalog.import.1c)
Далее смотрим в созданной папке файл component.php и прочитав немного код, понимаем, что вся логика происходит в классе CIBlockCMLImport... значит нам нужно "отпочковаться" от него и откорректировать некоторые методы (например ImportSection и ImportElement - отвечающие за сбору массива из XML)

Собственно делаем вышеописанное, создав в папке /local/components/bitrix/catalog.import.1c/ файл EX_CIBlockCMLImport.php со следующим кодом:
<?php
use Bitrix\Main,
   Bitrix\Iblock,
   Bitrix\Catalog;

IncludeModuleLangFile(__FILE__);

/**
 * дорабатываем класс под свои нужды
 */
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/classes/general/cml2.php");

class EX_CIBlockCMLImport extends CIBlockCMLImport
{
   // Обмен разделами
   function ImportSection($xml_tree_id, $IBLOCK_ID, $parent_section_id)
   {
      
   }
   // Обмен элементами
   function ImportElement($arXMLElement, &$counter, $bWF, $arParent)
   {

   }
}
Расширяемый класс CIBlockCMLImport находится в файле /bitrix/modules/iblock/classes/general/cml2.php
Далее нам следует заменить ВСЕ вызовы класса CIBlockCMLImport в файле /local/components/bitrix/catalog.import.1c/component.php на строку EX_CIBlockCMLImport, и в начале этого файла подключить наш файл строчкой
require_once(__DIR__."/EX_CIBlockCMLImport.php"); // подключаем расширение класса

Всё! Теперь обмен с 1С будет происходить через наш класс EX_CIBlockCMLImport где мы можем легко изменить любую логику скопировав соответствующий метод из файла /bitrix/modules/iblock/classes/general/cml2.php Очень сжато и кратко это и есть весь ужас и недопонимание кастомизации обмена каталогом БУС и 1С.

Если есть вопросы или что-то написано не верно - прошу в комментарии!

Поддерживаемые узлы ecommerce_2 в импорте каталога из 1С в Bitrix

Расположение языковых конструкций в файле:
/bitrix/modules/iblock/lang/ru/classes/general/cml2.php
<?
$MESS["IBLOCK_XML2_SUM_FORMAT"] = "ФорматСуммы";
$MESS["IBLOCK_XML2_SUM_FORMAT_DELIM"] = "ЧРД";
$MESS["IBLOCK_XML2_CATALOG_NAME"] = "1С Каталог";
$MESS["IBLOCK_XML2_CATALOG_SECTION_NAME"] = "Группа";
$MESS["IBLOCK_XML2_CATALOG_ELEMENT_NAME"] = "Товар";
$MESS["IBLOCK_XML2_ATTRIBUTES"] = "Характеристики";
$MESS["IBLOCK_XML2_ITEM_ATTRIBUTES"] = "ХарактеристикиТовара";
$MESS["IBLOCK_XML2_ITEM_ATTRIBUTE"] = "ХарактеристикаТовара";
$MESS["IBLOCK_XML2_TRAITS"] = "Реквизиты";
$MESS["IBLOCK_XML2_TRAITS_VALUES"] = "ЗначенияРеквизитов";
$MESS["IBLOCK_XML2_BASE_UNIT"] = "БазоваяЕдиница";
$MESS["IBLOCK_XML2_BASE_UNIT_NAME"] = "Базовая единица";
$MESS["IBLOCK_XML2_TAXES"] = "Ставки налогов";
$MESS["IBLOCK_XML2_TAXES_VALUES"] = "СтавкиНалогов";
$MESS["IBLOCK_XML2_TAX_VALUE"] = "Ставка";
$MESS["IBLOCK_XML2_ANONS"] = "Анонс";
$MESS["IBLOCK_XML2_DETAIL"] = "Описание";
$MESS["IBLOCK_XML2_ARTICLE"] = "Артикул";
$MESS["IBLOCK_XML2_MANUFACTURER"] = "Изготовитель";
$MESS["IBLOCK_XML2_PROP_MANUFACTURER"] = "Производитель";
$MESS["IBLOCK_XML2_BX_TAGS"] = "БитриксТеги";
$MESS["IBLOCK_XML2_BX_WORKFLOW"] = "БитриксДокументооборот";
$MESS["IBLOCK_XML2_BX_DETAIL_URL"] = "БитриксURLДеталь";
$MESS["IBLOCK_XML2_BX_SECTION_URL"] = "БитриксURLРаздел";
$MESS["IBLOCK_XML2_BX_LIST_URL"] = "БитриксURLСписок";
$MESS["IBLOCK_XML2_BX_CANONICAL_URL"] = "БитриксURLКанонический";
$MESS["IBLOCK_XML2_BX_DEFAULT_VALUE"] = "БитриксЗначениеПоУмолчанию";
$MESS["IBLOCK_XML2_BX_INDEX_SECTIONS"] = "БитриксИндексироватьРазделы";
$MESS["IBLOCK_XML2_BX_INDEX_ELEMENTS"] = "БитриксИндексироватьЭлементы";
$MESS["IBLOCK_XML2_BX_PICTURE"] = "БитриксКартинка";
$MESS["IBLOCK_XML2_BX_DETAIL_PICTURE"] = "БитриксКартинкаДетальная";
$MESS["IBLOCK_XML2_BX_CODE"] = "БитриксКод";
$MESS["IBLOCK_XML2_BX_FIELDS_COUNT"] = "БитриксКоличествоПолей";
$MESS["IBLOCK_XML2_BX_COLUMNS"] = "БитриксКолонок";
$MESS["IBLOCK_XML2_BX_SECTION_NAME"] = "БитриксНазваниеРаздела";
$MESS["IBLOCK_XML2_BX_SECTIONS_NAME"] = "БитриксНазваниеРазделов";
$MESS["IBLOCK_XML2_BX_ELEMENT_NAME"] = "БитриксНазваниеЭлемента";
$MESS["IBLOCK_XML2_BX_ELEMENTS_NAME"] = "БитриксНазваниеЭлементов";
$MESS["IBLOCK_XML2_LABELS"] = "БитриксПодписи";
$MESS["IBLOCK_XML2_LABEL"] = "БитриксПодпись";
$MESS["IBLOCK_XML2_BX_WITH_DESCRIPTION"] = "БитриксОписаниеРазрешено";
$MESS["IBLOCK_XML2_BX_SEARCH"] = "БитриксПоискРазрешен";
$MESS["IBLOCK_XML2_BX_USER_TYPE"] = "БитриксРасширениеТипа";
$MESS["IBLOCK_XML2_BX_USER_TYPE_SETTINGS"] = "БитриксНастройкиРасширенияТипа";
$MESS["IBLOCK_XML2_BX_LINKED_IBLOCK"] = "БитриксСвязанныйИнфоблок";
$MESS["IBLOCK_XML2_BX_SORT"] = "БитриксСортировка";
$MESS["IBLOCK_XML2_BX_ROWS"] = "БитриксСтрок";
$MESS["IBLOCK_XML2_BX_PROPERTY_TYPE"] = "БитриксТипСвойства";
$MESS["IBLOCK_XML2_BX_LIST_TYPE"] = "БитриксТипСписка";
$MESS["IBLOCK_XML2_BX_FILE_EXT"] = "БитриксТипыФайлов";
$MESS["IBLOCK_XML2_BX_FILTER"] = "БитриксФильтрРазрешен";
$MESS["IBLOCK_XML2_BX_IS_REQUIRED"] = "БитриксОбязательное";
$MESS["IBLOCK_XML2_BX_PROPERTY_FEATURE_LIST"] = "БитриксРасширенныеПараметры";
$MESS["IBLOCK_XML2_CURRENCY"] = "Валюта";
$MESS["IBLOCK_XML2_VALUES_TYPES"] = "ТипыЗначений";
$MESS["IBLOCK_XML2_VALUES_TYPE"] = "ТипЗначений";
$MESS["IBLOCK_XML2_TYPE"] = "Тип";
$MESS["IBLOCK_XML2_TYPE_LIST"] = "Справочник";
$MESS["IBLOCK_XML2_TYPE_NUMBER"] = "Число";
$MESS["IBLOCK_XML2_TYPE_STRING"] = "Строка";
$MESS["IBLOCK_XML2_USER_TYPE_DATE"] = "Даты";
$MESS["IBLOCK_XML2_USER_TYPE_DATETIME"] = "ДатаВремя";
$MESS["IBLOCK_XML2_CHOICE"] = "Вариант";
$MESS["IBLOCK_XML2_CHOICE_VALUES"] = "ВариантыЗначений";
$MESS["IBLOCK_XML2_CHOICE_VALUE"] = "ВариантЗначения";
$MESS["IBLOCK_XML2_SCHEMA_VERSION"] = "ВерсияСхемы";
$MESS["IBLOCK_XML2_PARAMS_PACKAGE"] = "ПараметрПакета";
$MESS["IBLOCK_XML2_OWNER"] = "Владелец";
$MESS["IBLOCK_XML2_GROUP"] = "Группа";
$MESS["IBLOCK_XML2_GROUPS"] = "Группы";
$MESS["IBLOCK_XML2_TIMESTAMP"] = "ДатаФормирования";
$MESS["IBLOCK_XML2_MEASURE"] = "Единица";
$MESS["IBLOCK_XML2_VALUE"] = "Значение";
$MESS["IBLOCK_XML2_VALUE_ID"] = "ИдЗначения";
$MESS["IBLOCK_XML2_PROPERTIES_VALUES"] = "ЗначенияСвойств";
$MESS["IBLOCK_XML2_PROPERTY_VALUES"] = "ЗначенияСвойства";
$MESS["IBLOCK_XML2_PROPERTY_VALUE"] = "ЗначениеСвойства";
$MESS["IBLOCK_XML2_ID_1C_SITE"] = "ИдСайта";
$MESS["IBLOCK_XML2_ID_SITE_1C"] = "СистемныйИд";
$MESS["IBLOCK_XML2_ID"] = "Ид";
$MESS["IBLOCK_XML2_CATALOG_ID"] = "ИдКаталога";
$MESS["IBLOCK_XML2_METADATA_ID"] = "ИдКлассификатора";
$MESS["IBLOCK_XML2_PRICE_TYPE_ID"] = "ИдТипаЦены";
$MESS["IBLOCK_XML2_PICTURE"] = "Картинка";
$MESS["IBLOCK_XML2_PICTURES"] = "Картинки";
$MESS["IBLOCK_XML2_PREVIEW_PICTURE"] = "Картинка анонса";
$MESS["IBLOCK_XML2_CATALOG"] = "Каталог";
$MESS["IBLOCK_XML2_METADATA"] = "Классификатор";
$MESS["IBLOCK_XML2_AMOUNT"] = "Количество";
$MESS["IBLOCK_XML2_COMMERCE_INFO"] = "КоммерческаяИнформация";
$MESS["IBLOCK_XML2_COEFF"] = "Коэффициент";
$MESS["IBLOCK_XML2_MULTIPLE"] = "Множественное";
$MESS["IBLOCK_XML2_FOR_CATALOG"] = "ДляТоваров";
$MESS["IBLOCK_XML2_FOR_OFFERS"] = "ДляПредложений";
$MESS["IBLOCK_XML2_NAME"] = "Наименование";
$MESS["IBLOCK_XML2_TAX"] = "Налог";
$MESS["IBLOCK_XML2_START_TIME"] = "Начало активности";
$MESS["IBLOCK_XML2_END_TIME"] = "Окончание активности";
$MESS["IBLOCK_XML2_DESCRIPTION"] = "Описание";
$MESS["IBLOCK_XML2_TITLE"] = "ОфициальноеНаименование";
$MESS["IBLOCK_XML2_OFFER_LIST"] = "ПакетПредложений";
$MESS["IBLOCK_XML2_BY_DEFAULT"] = "ПоУмолчанию";
$MESS["IBLOCK_XML2_FULL_TITLE"] = "ПолноеНаименование";
$MESS["IBLOCK_XML2_FULL_TITLE2"] = "Полное наименование";
$MESS["IBLOCK_XML2_OFFER"] = "Предложение";
$MESS["IBLOCK_XML2_OFFERS"] = "Предложения";
$MESS["IBLOCK_XML2_VIEW"] = "Представление";
$MESS["IBLOCK_XML2_PROPERTIES"] = "Свойства";
$MESS["IBLOCK_XML2_PROPERTY"] = "Свойство";
$MESS["IBLOCK_XML2_SERIALIZED"] = "Сериализовано";
$MESS["IBLOCK_XML2_SYMBOL_CODE"] = "Символьный код";
$MESS["IBLOCK_XML2_UPDATE_ONLY"] = "СодержитТолькоИзменения";
$MESS["IBLOCK_XML2_SORT"] = "Сортировка";
$MESS["IBLOCK_XML2_STATUS"] = "Статус";
$MESS["IBLOCK_XML2_PRICE_TYPE"] = "ТипЦены";
$MESS["IBLOCK_XML2_PRICE_TYPES"] = "ТипыЦен";
$MESS["IBLOCK_XML2_POSITION"] = "Товар";
$MESS["IBLOCK_XML2_POSITIONS"] = "Товары";
$MESS["IBLOCK_XML2_DELETED"] = "Удален";
$MESS["IBLOCK_XML2_IN_SUM"] = "УчтеноВСумме";
$MESS["IBLOCK_XML2_PRICE"] = "Цена";
$MESS["IBLOCK_XML2_PRICE_FOR_ONE"] = "ЦенаЗаЕдиницу";
$MESS["IBLOCK_XML2_QUANTITY_FROM"] = "КоличествоОт";
$MESS["IBLOCK_XML2_QUANTITY_TO"] = "КоличествоДо";
$MESS["IBLOCK_XML2_PRICES"] = "Цены";
$MESS["IBLOCK_XML2_BAR_CODE"] = "ШтрихКод";
$MESS["IBLOCK_XML2_BAR_CODE2"] = "Штрихкод";
$MESS["IBLOCK_XML2_CATALOG_ELEMENT"] = "Элемент каталога";
$MESS["IBLOCK_XML2_PCS"] = "шт";
$MESS["IBLOCK_XML2_RUB"] = "руб";
$MESS["IBLOCK_XML2_TYPE_ADD_ERROR"] = "Ошибка создания типа информационных блоков.";
$MESS["IBLOCK_XML2_CURRENCY_ERROR"] = "При импорте встретилась валюта цены содержащая не латинские буквы. Цена была импортирована с валютой RUB.";
$MESS["IBLOCK_XML2_DISCOUNTS"] = "СкидкиНаценки";
$MESS["IBLOCK_XML2_DISCOUNT_CONDITION"] = "Условие";
$MESS["IBLOCK_XML2_DISCOUNT_COND_VOLUME"] = "Количество одного товара в документе превысило";
$MESS["IBLOCK_XML2_DISCOUNT_COND_VALUE"] = "ЗначениеУсловия";
$MESS["IBLOCK_XML2_DISCOUNT_COND_PERCENT"] = "Процент";
$MESS["IBLOCK_XML2_WEIGHT"] = "Вес";
$MESS["IBLOCK_XML2_BX_ACTIVE"] = "БитриксАктивность";
$MESS["IBLOCK_XML2_FILE"] = "Файл";
$MESS["IBLOCK_XML2_FILE_DESCRIPTION"] = "ОписаниеФайла";
$MESS["IBLOCK_XML2_FILES"] = "Файлы";
$MESS["IBLOCK_XML2_HTML_DESCRIPTION"] = "ОписаниеВФорматеHTML";
$MESS["IBLOCK_XML2_GROUPS_PROPERTIES"] = "СвойстваГрупп";
$MESS["IBLOCK_XML2_BX_SHOW_IN_LIST"] = "БитриксПоказыватьВСписке";
$MESS["IBLOCK_XML2_BX_EDIT_IN_LIST"] = "БитриксРедактироватьВСписке";
$MESS["IBLOCK_XML2_BX_SETTINGS"] = "БитриксНастройки";
$MESS["IBLOCK_XML2_BX_ORIGINAL_NAME"] = "БитриксОригинальноеНазвание";
$MESS["IBLOCK_XML2_BX_URL"] = "БитриксURL";
$MESS["IBLOCK_XML2_BX_FILE_SIZE"] = "БитриксРазмерФайла";
$MESS["IBLOCK_XML2_BX_FILE_WIDTH"] = "БитриксШиринаИзображения";
$MESS["IBLOCK_XML2_BX_FILE_HEIGHT"] = "БитриксВысотаИзображения";
$MESS["IBLOCK_XML2_BX_FILE_CONTENT_TYPE"] = "БитриксТипФайла";
$MESS["IBLOCK_XML2_UF_ERROR"] = "Ошибка импорта пользовательского свойства (xml_id: #XML_ID#): #ERROR_TEXT#";
$MESS["IBLOCK_XML2_STORE"] = "Склад";
$MESS["IBLOCK_XML2_STORES"] = "Склады";
$MESS["IBLOCK_XML2_STORE_ADDRESS"] = "Адрес";
$MESS["IBLOCK_XML2_STORE_AMOUNT_LIST"] = "КоличествоНаСкладах";
$MESS["IBLOCK_XML2_STORE_AMOUNT"] = "КоличествоНаСкладе";
$MESS["IBLOCK_XML2_STORE_ID"] = "ИдСклада";
$MESS["IBLOCK_XML2_STORE_DESCRIPTION"] = "Комментарий";
$MESS["IBLOCK_XML2_STORE_CANTACTS"] = "Контакты";
$MESS["IBLOCK_XML2_STORE_CONTACTS"] = "Контакты";
$MESS["IBLOCK_XML2_MULTI_STORE_IMPORT_ERROR"] = "Количество импортированных складов превышает разрешённое для данной редакции.";
$MESS["IBLOCK_XML2_SECTION_PROPERTIES"] = "СвойстваЭлементов";
$MESS["IBLOCK_XML2_SMART_FILTER"] = "УмныйФильтр";
$MESS["IBLOCK_XML2_SMART_FILTER_DISPLAY_TYPE"] = "ТипОтображения";
$MESS["IBLOCK_XML2_SMART_FILTER_DISPLAY_EXPANDED"] = "ПоказатьРазвёрнутым";
$MESS["IBLOCK_XML2_SMART_FILTER_HINT"] = "Подсказка";
$MESS["IBLOCK_XML2_PRICE_SB_ADD_ERROR"] = "В редакции Малый Бизнес нет возможности иметь более одного типа цены. Настройте выгрузку из 1С или перейдите на другую редакцию БУС.";
$MESS["IBLOCK_XML2_PRICE_DUP_ERROR"] = "В выгрузке настроены цены с одинаковым названием. Продолжение обмена невозможно.";
$MESS["IBLOCK_XML2_STORE_CONTACT"] = "Контакт";
$MESS["IBLOCK_XML2_STORE_PHONE"] = "Телефон";
$MESS["IBLOCK_XML2_PRODUCTS_SETS"] = "НаборыТоваров";
$MESS["IBLOCK_XML2_PRODUCT_SETS"] = "НаборыТовара";
$MESS["IBLOCK_XML2_PRODUCT_SET"] = "Набор";
$MESS["IBLOCK_XML2_PRODUCT_SET_ITEM"] = "ЭлементНабора";
$MESS["IBLOCK_XML2_INHERITED_TEMPLATES"] = "НаследуемыеШаблоны";
$MESS["IBLOCK_XML2_TEMPLATE"] = "Шаблон";
$MESS["IBLOCK_XML2_OFFERS_CHANGE"] = "ИзмененияПакетаПредложений";
$MESS["IBLOCK_XML2_VERSION"] = "НомерВерсии";
$MESS["IBLOCK_XML2_DELETE_MARK"] = "ПометкаУдаления";
$MESS["IBLOCK_XML2_RESTS"] = "Остатки";
$MESS["IBLOCK_XML2_REST"] = "Остаток";
$MESS["IBLOCK_XML2_BASE_UNITS"] = "ЕдиницыИзмерения";
$MESS["IBLOCK_XML2_CODE"] = "Код";
$MESS["IBLOCK_XML2_FULL_NAME"] = "НаименованиеПолное";
$MESS["IBLOCK_XML2_SHORT_NAME"] = "НаименованиеКраткое";
$MESS["IBLOCK_XML2_INTL_SHORT_NAME"] = "МеждународноеСокращение";
$MESS["IBLOCK_XML2_BASE_UNIT_ADD_ERROR"] = "Ошибка добавления новой единицы измерения (код единицы: #CODE#).";
$MESS["IBLOCK_XML2_EXTERNAL"] = "Внешний";
$MESS["IBLOCK_XML2_HBLOCK_NAME_IS_INVALID"] = "Название справочника должно начинаться с буквы и состоять только из латинских букв и цифр.";
$MESS["IBLOCK_XML2_MODULE_CATALOG_IS_ABSENT"] = "Отсутствует модуль \"Торговый каталог\". Импорт торговых предложений и цен невозможен.";
$MESS["IBLOCK_XML2_LINK"] = "Ссылка";
$MESS["IBLOCK_XML2_FULL_DESCRIPTION"] = "ПолноеОписание";
$MESS["IBLOCK_XML2_TEMPORARY_TABLE_EXIST_ERROR"] = "Временная таблица не существует";
?>

Bitrix Запуск не отправленных event-ов

Для повторной проверки всех событий и запуска записей из таблицы событий b_event, нужно выполнить код:
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);
define("BX_CRONTAB", true);
define('BX_NO_ACCELERATOR_RESET', true);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

@set_time_limit(0);
@ignore_user_abort(true);

CEvent::CheckEvents();
вместе с этим можно проверить ошибки на событиях

Как выбирать картон для визитки

Выбор картон для визитки часто приводит в замешательство людей, которым вываливают тонны различной бумаги, по плотности, фактуре, изготовителю, возможным методам нанесения и прочим. Постараюсь дать краткий совет, как выбрать картон для визитки (именно для картонных визиток).

1) Определяем цели
Первое, что требуется сделать - определить цели использования визиток. Только если визитка нужна для персонального общения Вам потребуется читать статью дальше, иначе - печатайте на тонком или среднем картоне в зависимости от допустимой стоимости изделия в среднем 100шт будут стоить ~500-600 рублей.

2) Вычислим уровень значимости потенциальной аудитории
Если визитки нужно раздавать всем людям при личном контакте, то тут нет особых проблем с картоном - белый выбеленный картон идеально вписывается в модель "цена-качество". Цена таких визиток будет от 500 до 1000 рублей за 100 штук.
Если визитки предназначены для руководителей и должны подчеркнуть почтение к традициям передачи визитки - то это обязательно плотный картон 340-380гр/м желательно с необычной ламинацией SoftTouch. на Либо можно напечатать визитки на специальном дизайнерском картоне, но тут придётся положиться только на интуицию, вариантов будет действительно много, какие-то схожи, какие-то очень похожи. Стоимость таких визиток уже переваливает за 10руб/шт., но если для чего/кого их делать, то станет ясно откуда такая цена.

3) Определиться с нанесением
Тут лучше консультироваться с человеком с большим опытом или дизайнером. Сам картон не покажет всю незаурядность визитки, и для подчёркивания необычности последних используют разные комбинации нанесения краски. Рассмотрим самые популярные:
- Цифровая/офсетная печать - самая обычная печать самым тонким слоем краски, фактура бумаги остаётся, но чернил на ней вы не почувствуете.
- Шелкография - печать по трафарету и как следствие большие затраты на саму краску и на время изготовления; краска ложится плотным слоем, как правило перекрывая фактуру бумаги (можно ощутить пальцем линии печати)
- Тиснение - метод при котором шаблон вдавливается в полотно визитки, после чего на его место заливают гель-краску (тут с цветом очень сложно, обычно это фольга "серебро"/"золото"). Неплохой вариант для комбинаций.

Больше особо и нет правил по выбору картона для визитки, а если есть - пишите комментарий добавим в статью.