Как из 1С запустить выполнение импорта (CRON) на сайте 1С-Битрикс?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

При настройке нестандартного обмена между 1С и 1С-Битрикс часто возникает ситуация, когда типовой модуль обмена не удовлетворяет требованиям по скорости или логике работы. Распространенный сценарий: программист пишет собственную выгрузку данных (например, в формате CSV), отправляет файл на сервер по FTP или HTTP, но сталкивается с тем, что автоматический импорт на стороне сайта настроен по расписанию CRON и запускается несвоевременно. Ждать следующего цикла планировщика неудобно, поэтому возникает задача — принудительно инициировать импорт сразу после того, как 1С завершила передачу файла.

В этой статье мы подробно разберем, как реализовать механизм «обратного вызова» со стороны 1С, чтобы сайт мгновенно подхватывал обновленные данные, а также проанализируем способы оптимизации этого процесса.

Решение 1: Вызов скрипта-обработчика через HTTP-запрос

Наиболее логичный и гибкий способ — это создание на стороне сайта небольшого PHP-скрипта (так называемого «webhook» или прослойки), который будет принимать сигнал от 1С и запускать стандартные механизмы импорта Битрикса. Просто вызвать системный файл cron_frame.php напрямую через браузер не получится, так как он обычно настроен на работу только из командной строки (CLI).

Разберем алгоритм действий по шагам:

  1. На стороне сайта в папке /php_interface/include/catalog_import/ (или в корне сайта для простоты) создаем файл, например, remote_import.php.
  2. В этом файле необходимо подключить ядро Битрикса и вызвать функцию выполнения профиля импорта.
  3. Для безопасности обязательно добавляем проверку секретного ключа (токена), чтобы посторонние лица не могли нагружать сервер бесконечными запросами на импорт.

Пример кода на стороне сайта (PHP):


// Отключаем сбор статистики и проверку прав для ускорения
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);

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

$secretKey = "MY_SUPER_SECRET_TOKEN_123";
if ($_GET['key'] !== $secretKey) {
    die("Access denied");
}

if (\CModule::IncludeModule("catalog")) {
    // ID профиля импорта CSV, который вы настроили в админке Битрикса
    $profileID = 12; 
    
    // Подключаем стандартный скрипт выполнения крона
    // Важно: путь может отличаться в зависимости от версии Битрикс
    include($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/catalog_import/cron_frame.php");
    
    echo "Import started successfully";
}

Теперь рассмотрим, как вызвать этот скрипт из 1С. Воспользуемся объектом HTTPСоединение. Предположим, вы уже выгрузили файл CSV на сервер и теперь хотите дать команду на импорт:


Процедура ЗапуститьИмпортНаСайте()
    
    Сервер = "www.mysite.ru";
    Токен  = "MY_SUPER_SECRET_TOKEN_123";
    ПутьКФайлу = "/remote_import.php?key=" + Токен;
    
    Попытка
        Соединение = Новый HTTPСоединение(Сервер, 443, , , , 60, Новый ЗащищенноеСоединениеOpenSSL());
        Запрос = Новый HTTPЗапрос(ПутьКФайлу);
        Ответ = Соединение.Получить(Запрос);
        
        Если Ответ.КодСостояния = 200 Тогда
            Сообщить("Сайт подтвердил запуск импорта: " + Ответ.ПолучитьТелоКакСтроку());
        Иначе
            Сообщить("Ошибка при запуске: Код " + Ответ.КодСостояния);
        КонецЕсли;
    Исключение
        Сообщить("Не удалось связаться с сервером: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Решение 2: Использование файла-флага (триггера)

Если вы не хотите создавать открытые URL-адреса для запуска задач, можно использовать метод «файла-флага». Этот способ считается более стабильным при работе с большими объемами данных, так как не зависит от таймаутов веб-сервера (Nginx/Apache).

Проанализируем этот подход:

  1. На сервере настраивается стандартный CRON, который запускается часто (например, раз в минуту).
  2. Скрипт, который запускает CRON, сначала проверяет наличие в определенной папке специального файла (например, start.txt).
  3. Если файла нет — скрипт мгновенно завершается.
  4. Как только 1С закончила передачу данных, она загружает этот пустой файл start.txt на сервер.
  5. Планировщик видит файл, запускает импорт и по завершении удаляет файл-флаг.

Этот метод позволяет избежать ситуации, когда CRON начинает обрабатывать CSV-файл, который еще не успел до конца загрузиться из 1С (при медленном интернете).

Почему импорт CSV в Битриксе работает медленно и «вешает» сайт?

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

1. Индексация поиска. При каждом обновлении элемента инфоблока Битрикс пытается переиндексировать его для модуля поиска. Если у вас тысячи строк, сайт будет постоянно пересчитывать поисковые индексы, что приведет к блокировкам таблиц. Рассмотрим решение: перед массовым импортом рекомендуется программно отключать индексацию или настроить её выполнение по отдельному расписанию.

2. События (Events). При записи каждого товара вызываются события типа OnAfterIBlockElementUpdate. В этих событиях часто «висят» обработчики других модулей: пересчет скидок, генерация маркетинговых рассылок или выгрузка в сторонние сервисы. Для ускорения обмена в кастомных скриптах импорта следует использовать методы, не вызывающие лишних событий, например, CIBlockElement::SetPropertyValuesEx для обновления свойств (остатки, цены).

3. Фасетный индекс. Если на сайте активно используются фильтры, то обновление цен и остатков требует перестройки фасетного индекса. Лучше всего запускать полную перестройку фасетов один раз после завершения всего процесса импорта, а не для каждой позиции отдельно.

Оптимальная архитектура обмена остатками

Проанализируем ситуацию: автору темы необходимо обновлять только остатки. В этом случае использование CSV и стандартного импорта — самый трудозатратный путь для системы. Профессиональным подходом будет создание легкого API на стороне Битрикса, который принимает JSON-пакет данных.

Вместо вызова тяжелых профилей импорта, рассмотрим использование метода CCatalogProduct::Update. Он работает напрямую с таблицами каталога, минуя многие проверки инфоблоков. Вызов этого метода из 1С через HTTP-сервис сайта позволит обновлять данные практически в реальном времени.

Важный совет: При прямой работе с базой данных (как предлагали некоторые участники обсуждения в (19)) нужно быть крайне осторожным. Битрикс хранит данные о товарах в нескольких связанных таблицах (инфоблоки, свойства, торговый каталог). Прямая запись SQL UPDATE может привести к тому, что в административной панели данные обновятся, а в публичной части (в фильтрах и корзине) останутся старыми из-за кеширования и индексов. Всегда используйте методы API Битрикса (CCatalogProduct::Update или SetPropertyValuesEx), так как они автоматически заботятся об очистке кеша.

Выводы

Для того чтобы запустить выполнение CRON из 1С, наиболее эффективным решением будет создание PHP-прослойки, защищенной токеном, которую 1С будет вызывать методом GET через HTTPСоединение. Это обеспечит моментальный старт обработки данных сразу после их выгрузки. Однако, если процесс импорта CSV по-прежнему замедляет работу сайта, стоит рассмотреть переход на использование REST API или специализированных PHP-скриптов для точечного обновления цен и остатков, минуя громоздкие стандартные профили импорта.

← На главную