Новый шаблон sale.order.ajax: кастомизация

Изображение
На реализацию этого функционала ушло порядка 30 часов рабочего времени (плюс время на самообразование). За это время было отправлено 18 коммитов, написано 371 строк кода и осуществлено несколько попыток виртуального суицида :) Основная задача Создать группу свойств "Параметры доставки", которая будет зависеть от выбора типа доставки. Для курьера это "Адрес доставки", для "Транспортной компании" это выбор ТК из выпадающего списка, для доставки "Другая транспортная компания" - тоже текстовое поле (как и адрес доставки). Все эти поля являются обязательными, и отображаться должны не в блоке "Пользователь", а в блоке с доставками. В новом шаблоне sale.order.ajax перенести поля в другой блок не так просто, как кажется на первый взгляд, а информации на эту тему буквально крупицы.

Если при полной выгрузке из 1С в битрикс товары и разделы приходят неактивными

Есть такая беда. Москвичи и питерцы с ней, скорее всего, не сталкиваются :)

На разгадывание этой загадки у нас ушло 8,5 часов чистого рабочего времени.

Небольшой ликбез о том, что происходит при полной выгрузке.

Есть компонент, который отвечает за выгрузку. Он лежит по адресу: /bitrix/components/bitrix/catalog.import.1c/component.php
В 607 строке (у вас может быть другая строка) есть условие:
elseif ($_GET["mode"]=="deactivate")
И дальше начинается магия. Во время выгрузки 1с посылает GET-параметр, в котором указано время начала выгрузки.
После полной выгрузки разделов и элементов инфоблока происходит проверка. Если время обновления товара/раздела в битриксе меньше, чем время начала выгрузки - значит, это старый элемент, и тогда происходит...
$section->Update($arSection["ID"], array("ACTIVE" => "N"));



Вносить изменения в компонент нельзя (входит в ядро битрикса, затрется при обновлениях). Но можно временно добавить после строки с Update запись в лог, примерно такую:
\CEventLog::Add(array(
    "SEVERITY" => "SECURITY",
    "AUDIT_TYPE_ID" => "1C_EXCHANGE_LOG",
    "MODULE_ID" => "iblock",
    "ITEM_ID" => "UNKNOWN",
    "DESCRIPTION" => 'timestamp: '.$arSection["TIMESTAMP_X"],));

Тогда в журнале событий мы увидим, что происходит на самом деле.
Заходим в Настройки - Инструменты - Журнал событий.
Нам важна колонка URL, в ней будет что-то вроде
/bitrix/admin/1c_import.php?type=catalog&mode=deactivate&timestamp=1504258489
А также колонка "Описание", в которой мы увидим, что лежит в переменной $timestamp для этого элемента:
timestamp: 01.09.2017 11:34:50
Чтобы расшифровать пришедший из GET timestamp, можно в командной PHP-строке выполнить: 
echo ConvertTimeStamp(1504258489, "FULL");
Получаем 01.09.2017 12:34:49 и видим, что элемент в битриксе создался как будто раньше, чем началась выгрузка.
Компонент видит это и сразу делает вывод "он старый, деактивировать его".
А суть в разнице часовых поясов.

Что делать?

1. Сверить часы. Проверяем время сервера, время apache, время mysql. Они должны совпадать.
Проверить аппаратное время сервера (SSH): hwclock --show
Сменить его: hwclock --set --date="2017-09-01 15:05:30" --localtime
Проверить системное время сервера: date
Сменить систеамный часовой пояс: cp /usr/share/zoneinfo/Europe/Kaliningrad /etc/localtime
Вывести текущее время php: echo date('H:i:s');
Сменить время: ini_set('date.timezone''Europe/Kaliningrad'); echo date('Y-m-d H:i:s'); 
mysql:  SELECT CURTIME()
Сменить время:
SELECT NOW(); SET TIME_ZONE='+02:00'; SELECT NOW(); 
2. Далее проверяем время компьютера, который делает выгрузку 1с.
Всё это нам не помогло в нашей ситуации. Поэтому копаем дальше:
Идем в битриксе в Настройки - Настройки продукта - Настройки модулей. В настройках главного модуля есть пункт Часовые пояса.
Ставим принудительно часовой пояс, совпадающий с сервером. И (важно!) снимаем галочку 
По умолчанию автоматически определять часовой пояс по браузеру
Нам эта настройка съела очень много времени и нервов.
В нашем случае выгрузку 1с запускал калининградский браузер, поэтому в GET он передавал московское время (это время сервера), а битрикс принимал товары уже по-калининградскому времени.

!!! После того, как закончите отладку, верните файл компонента к исходному состоянию.
Если вам помогла эта заметка, отпишитесь в комментариях :)

Комментарии

  1. Вот же говнюки! В настройках Интеграции галочки игнорируются. Действительно время было сбито. Лечге всего синхронизировать hwclock -w

    ОтветитьУдалить
  2. А встречались с таким, что товары наоборот, никакие не деактивируются?

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

Новый шаблон sale.order.ajax: кастомизация

Вывод пользовательского свойства раздела в компонентах catalog.section и news.list