Ошибка 504 Gateway Time-out при выгрузке из 1С


Ошибка 504 Gateway Time-out - бывает по разным причинам, главное, что ответ от сервера не приходит
Необходимо смотреть на каком этапе вылетает, я сталкивалась с разными причинами

Причина 1
Куча кастомных обработчиков событий, или мало но очень тяжелые (долго исполняются).
Смотреть в init.php
Решение 1: переделать обработчики, убрать обработчики,
Решение 2: увеличить время ответа сервера, время выполнения срипта:
Мы поставили 3500 секунд, но надо подбирать индивидуально
  • ngix 3500 секунд поставить
  • Установить php max_execution_time 3500
  • Установить @set_time_limit(3500);  в /bitrix/php_interface/dbconn.php
  • Установить php session.gc_maxlifetime 3500
  • В параметрах безопасности группы тоже увеличить сессию(во всех группах, где состоит пользователь, из-под которого обмен происходит, в т.ч. неавторизованные пользователи) 60мин
Причина 2
Большая структура разделов, она выполняется за 1 шаг, если количество товаров-свойств в пакете можно уменьшить, то структура создается за 1 шаг.
Решение: увеличить время ответа сервера, время выполнения срипта (см. выше)


Причина 3
при загрузке файла с ценами prices_***.xml
в компоненте bitrix/catalog.import.1с/component.php
на 7 шаге ($NS["STEP"] == 7)
вызывается метод
$result = $obCatalog->ImportElements($start_time, $arParams["INTERVAL"]);
который описан тут /bitrix/modules/iblock/classes/general/clm2.php

метод обновляет фасетный индекс инфоблока, запускается без учета по времени выполнения срипта
Iblock\PropertyIndex\Manager::runDeferredIndexing($this->next_step["IBLOCK_ID"]);
И он выполнялся у заказчика 2 минуты! Соответственно 1С получает 504 Gateway Time-out, и обмен завершается ошибкой.
метод runDeferredIndexing описан тут /bitrix/modules/iblock/lib/propertyindex/manager.php
цикл
 foreach (self::$elementQueue[$productIblock] as $elementId)
               self::elementIndexing($indexer, $elementId); //тут долго выполняется
Решение 1.  увеличить время ответа сервера, время выполнения срипта (см. выше)
Решение 2. закомментировать данную строку
self::elementIndexing($indexer, $elementId); 
но после выполнения обмена надо запустить создание фасетного индекса