При настройке нестандартного обмена между 1С и 1С-Битрикс часто возникает ситуация, когда типовой модуль обмена не удовлетворяет требованиям по скорости или логике работы. Распространенный сценарий: программист пишет собственную выгрузку данных (например, в формате CSV), отправляет файл на сервер по FTP или HTTP, но сталкивается с тем, что автоматический импорт на стороне сайта настроен по расписанию CRON и запускается несвоевременно. Ждать следующего цикла планировщика неудобно, поэтому возникает задача — принудительно инициировать импорт сразу после того, как 1С завершила передачу файла.
В этой статье мы подробно разберем, как реализовать механизм «обратного вызова» со стороны 1С, чтобы сайт мгновенно подхватывал обновленные данные, а также проанализируем способы оптимизации этого процесса.
Наиболее логичный и гибкий способ — это создание на стороне сайта небольшого PHP-скрипта (так называемого «webhook» или прослойки), который будет принимать сигнал от 1С и запускать стандартные механизмы импорта Битрикса. Просто вызвать системный файл cron_frame.php напрямую через браузер не получится, так как он обычно настроен на работу только из командной строки (CLI).
Разберем алгоритм действий по шагам:
/php_interface/include/catalog_import/ (или в корне сайта для простоты) создаем файл, например, remote_import.php.Пример кода на стороне сайта (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 Тогда
Сообщить("Сайт подтвердил запуск импорта: " + Ответ.ПолучитьТелоКакСтроку());
Иначе
Сообщить("Ошибка при запуске: Код " + Ответ.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Не удалось связаться с сервером: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если вы не хотите создавать открытые URL-адреса для запуска задач, можно использовать метод «файла-флага». Этот способ считается более стабильным при работе с большими объемами данных, так как не зависит от таймаутов веб-сервера (Nginx/Apache).
Проанализируем этот подход:
CRON, который запускается часто (например, раз в минуту).CRON, сначала проверяет наличие в определенной папке специального файла (например, start.txt).start.txt на сервер.Этот метод позволяет избежать ситуации, когда CRON начинает обрабатывать CSV-файл, который еще не успел до конца загрузиться из 1С (при медленном интернете).
Как отмечают участники обсуждения, штатный импорт через профили 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-скриптов для точечного обновления цен и остатков, минуя громоздкие стандартные профили импорта.