Есть такая беда. Москвичи и питерцы с ней, скорее всего, не сталкиваются :)
На разгадывание этой загадки у нас ушло 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×tamp=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 он передавал московское время (это время сервера), а битрикс принимал товары уже по-калининградскому времени.
!!! После того, как закончите отладку, верните файл компонента к исходному состоянию.
Если вам помогла эта заметка, отпишитесь в комментариях :)
Вот же говнюки! В настройках Интеграции галочки игнорируются. Действительно время было сбито. Лечге всего синхронизировать hwclock -w
ОтветитьУдалитьА встречались с таким, что товары наоборот, никакие не деактивируются?
ОтветитьУдалить