-10%Переходите к нам от другого подрядчика — дадим скидку на первый этап работ

Фоновые задачи: импорт прайсов, генерация фидов, рассылки

Фоновые задачи в 1С-Битрикс: агенты, cron и очереди для импорта прайсов, генерации YML-фидов и рассылок

Импорт прайса на пятьдесят тысяч позиций, который валит сайт на полчаса. YML-фид, собирающийся заново на каждый запрос маркетплейса и съедающий процессор. Рассылка, которая после сбоя ушла клиентам дважды. Знакомые истории? Все они об одном — о неправильно организованных фоновых задачах. Пока каталог маленький и писем немного, любая реализация «работает». С ростом объёмов наивные подходы начинают ронять сайт, задваивать данные и молча ломаться.

В этой статье разберём, как грамотно строить фоновую обработку в 1С-Битрикс: чем отличаются агенты, cron и очереди, почему тяжёлые операции режут на батчи, что такое идемпотентность и как применить всё это к трём типовым задачам — импорту прайсов, генерации фидов и рассылкам. Материал технический и практический; сложные интеграции такого рода мы закрываем в рамках автоматизации на 1С.

Коротко

  • Любую тяжёлую операцию выносите в фон и запускайте через cron, а не агентами «на хитах».
  • Режьте большие задачи на батчи с сохранением прогресса, чтобы они не падали по лимитам и продолжались после сбоя.
  • Делайте задачи идемпотентными: повторный запуск не должен задваивать товары, фиды и письма.
  • Обязательны блокировки от параллельного запуска, логирование и алерты — иначе задача сломается молча.

Зачем выносить работу в фон

Веб-запрос должен отвечать быстро — за доли секунды. Всё, что занимает секунды и минуты, нельзя делать в момент захода посетителя: пользователь ждёт, соединение висит, сервер занят. Импорт прайса, сборка фида, отправка тысяч писем, пересчёт остатков — это тяжёлые операции, которым не место в цикле обработки страницы.

Решение — фоновые задачи: работа выполняется отдельно от пользовательских запросов, по расписанию или из очереди, не блокируя витрину. Правильно вынесенная в фон обработка делает две вещи: сохраняет сайт быстрым для посетителей и делает саму операцию устойчивой — её можно повторить, разбить на части, отследить. Это фундамент любой серьёзной интеграции магазина.

Агенты, cron и очереди

В 1С-Битрикс для фоновой работы есть несколько инструментов, и их важно не путать.

ИнструментЧто этоКогда применять
АгентыФункции Битрикс по расписаниюРегулярные задачи платформы, обмен
CronПланировщик ОСЧёткий запуск агентов и скриптов вне трафика
ОчередьТаблица/брокер задач с воркеромНагруженные сценарии, повторы, приоритеты

Практическая схема почти всегда одинакова: cron дёргает воркер по расписанию, воркер разбирает очередь задач батчами и обновляет их статусы. Агенты Битрикс при этом тоже запускают через cron, а не «на хитах». Выбор между простой очередью в базе и внешним брокером зависит от объёмов — не нужно тащить тяжёлую инфраструктуру туда, где хватит cron и таблицы.

Триггерная рассылка: от события к покупке Событиеброшенная корзина и др.Сегменткому и когдаПисьмоперсональноеОткрытие / кликреакцияКонверсиявозврат к покупке
Схема: рассылка запускается по событию (например, брошенная корзина), уходит нужному сегменту персональным письмом — и возвращает покупателя к заказу.

Почему агенты «на хитах» — ловушка

По умолчанию агенты в Битрикс выполняются «на хитах»: платформа запускает их при заходе посетителей на сайт. Это удобно для установки, но опасно в бою. На сайте с низким трафиком агент может не запуститься вовремя — некому «пнуть» его хитом. На нагруженном сайте, наоборот, тяжёлый агент выполнится прямо в запросе случайного посетителя и затормозит ему страницу.

Итог — непредсказуемость: задача выполняется то раньше, то позже, то в самый неподходящий момент. Поэтому первое, что делают на боевом проекте, — переводят агенты на запуск через cron, отключая выполнение на хитах. Тогда фоновая работа идёт по чёткому расписанию, независимо от посещаемости, и не мешает пользователям. Как выстроить надёжный запуск и деплой таких скриптов, мы разбираем в статье про CI/CD и деплой в Битрикс.

Батчи вместо одного большого прохода

Главная причина падения тяжёлых задач — попытка сделать всё за один проход. Импорт пятидесяти тысяч строк одним куском упирается в лимит времени выполнения, память или блокировки таблиц, падает на середине и оставляет данные в противоречивом виде. Лечение — батчи: обработка порциями с сохранением прогресса.

  1. Разбейте вход на порции. Обрабатывайте по несколько сотен-тысяч записей за один запуск воркера.
  2. Сохраняйте прогресс. Запоминайте, до какой позиции дошли, чтобы продолжить с этого места.
  3. Держите операцию короткой. Один батч укладывается в лимиты по времени и памяти с запасом.
  4. Продолжайте после сбоя. Упавшая задача возобновляется с последнего сохранённого прогресса, а не с нуля.
Правило батча: размер порции подбирают так, чтобы один проход гарантированно укладывался в лимиты сервера с запасом. Слишком крупные батчи снова упираются в память, слишком мелкие — тратят время на накладные расходы.

Идемпотентность и защита от дублей

Фоновые задачи падают и перезапускаются — это норма, а не исключение. Значит, повторный запуск не должен портить результат. Свойство «повторный запуск с теми же данными даёт тот же результат» называется идемпотентностью, и без него любой сбой рождает дубли: задвоенные товары, повторные письма, дублирующиеся строки фида.

Достигается идемпотентность через уникальные ключи и отметки состояния. Товар обновляют по внешнему коду или XML_ID, а не создают заново; перед отправкой письма проверяют отметку «уже отправлено»; перед вставкой строки проверяют её наличие. При работе с сущностями каталога и заказов это удобно делать через D7-ORM Битрикс, где обращение к данным по ключам явное и контролируемое.

Импорт прайсов и обмен с 1С

Импорт прайса — классическая тяжёлая фоновая задача. Файл может весить сотни мегабайт, содержать десятки тысяч позиций с ценами, остатками и характеристиками. Наивный импорт «в один проход на хите» здесь категорически не годится.

Правильный импорт прайса собирает вместе всё, о чём мы говорили: запуск по cron, обработка батчами с сохранением прогресса, обновление по уникальному коду для идемпотентности, блокировка от параллельного запуска. Отдельно важна валидация входных данных — битый прайс не должен обнулять цены и остатки в каталоге. Когда прайсы приходят из 1С обменом CommerceML, устойчивость импорта прямо влияет на корректность витрины; наладить это помогает аудит и оптимизация 1С, а полную настройку обмена и склада — автоматизация продаж и склада на 1С.

Генерация YML-фидов

Фиды для маркетплейсов и рекламы — вторая типовая фоновая задача. Ошибка, которую делают часто: генерировать фид на каждый запрос площадки. Маркетплейс дёргает файл регулярно, и если каждый раз собирать его заново из базы, сервер задыхается, а под пиком отдаёт то битый, то устаревший фид.

Правильно — генерировать фид фоновой задачей по расписанию и складывать готовый файл, который отдаётся статикой. Для больших каталогов сборку делают порционно во временный файл, который атомарно подменяет старый по завершении — тогда площадка всегда получает целый актуальный фид, а не «полусобранный». Логику генерации фидов под разные площадки и их форматы мы подробно разбираем в материале про разработку модуля маркетплейса на Битрикс.

Рассылки без задвоений

Массовая рассылка — задача, где идемпотентность важнее всего: отправить письмо дважды хуже, чем не отправить. Наивная рассылка «в цикле по всем адресам за один проход» падает на середине по лимитам или тайм-ауту, а перезапуск шлёт письма заново тем, кто их уже получил.

Если рассылка запускается по внешним событиям (заказ, статус, действие клиента), её удобно ставить в очередь через интеграционный слой. Как безопасно принимать такие события извне, разбираем в статье про REST, вебхуки и безопасность.

Блокировки и параллельный запуск

Cron с коротким интервалом таит подвох: если предыдущий запуск задачи ещё не завершился, cron стартует второй экземпляр. Две копии одной задачи над одними данными — это гонки, дубли и повреждение прогресса. Особенно опасно для импорта и рассылок.

Защита — блокировка (lock): перед стартом задача проверяет, не выполняется ли уже другой экземпляр, и если да — просто выходит. Блокировку реализуют через файл-флаг, запись в базе или системный механизм. Разные независимые задачи параллелить безопасно, если они не пересекаются по данным, а вот один и тот же тяжёлый процесс должен идти строго в одном экземпляре. Это одно из базовых требований к надёжной фоновой обработке.

Логирование и мониторинг

Фоновая задача опасна тем, что ломается незаметно: у неё нет пользователя, который пожалуется. Импорт молча упал — цены не обновились; фид не собрался — площадка получает старый; рассылка не ушла — акция провалилась. Всё это обнаруживают по последствиям через дни, если нет мониторинга.

Надёжность фоновых задач неотделима от надёжности площадки в целом: логи, ресурсы и стабильность окружения. Базовые вопросы инфраструктуры для этого мы разбираем в статье про хостинг и инфраструктуру BitrixVM.

Частые ошибки фоновых задач

Чек-лист внедрения

  1. Запуск через cron. Агенты и воркеры стартуют по расписанию, выполнение на хитах отключено.
  2. Батчи настроены. Тяжёлые задачи режутся на порции с сохранением прогресса.
  3. Идемпотентность обеспечена. Обновление по ключам, отметки «обработано», проверка перед действием.
  4. Фиды кэшируются. Готовый файл отдаётся статикой, генерация атомарна.
  5. Рассылки защищены. Батчи, отметки отправки, контроль темпа, возобновление после сбоя.
  6. Блокировки стоят. Один экземпляр тяжёлой задачи, защита от параллельного запуска.
  7. Мониторинг работает. Логи, отметки успеха и алерты по сбоям и просрочкам.

Вывод

Фоновые задачи — та часть проекта, которую не видно на витрине, но именно она чаще всего роняет сайт и портит данные, когда сделана наивно. Импорт прайсов, генерация фидов и рассылки подчиняются одним и тем же принципам: выносить в фон и запускать через cron, резать на батчи с сохранением прогресса, делать идемпотентными, защищать блокировками и покрывать мониторингом.

В 1С-Битрикс для этого есть всё необходимое — агенты, cron, механизмы работы с данными, — но по умолчанию платформа настроена на удобство установки, а не на боевую нагрузку. Переведите фоновую обработку на правильные рельсы, и импорты перестанут ронять сайт, фиды всегда будут актуальны, а рассылки — уходить ровно один раз.

Частые вопросы

Чем агенты отличаются от cron в 1С-Битрикс?

Агенты — штатный механизм Битрикс: функции, которые выполняются по расписанию. По умолчанию они запускаются «на хитах» — при заходе посетителей, что делает их непредсказуемыми под нагрузкой и на низком трафике. Cron — системный планировщик ОС, который запускает агенты и свои скрипты по чёткому расписанию независимо от посещаемости. Для любой серьёзной фоновой обработки агенты переводят на запуск через cron, а не «на хитах».

Почему тяжёлый импорт прайса нельзя делать одним куском?

Импорт большого прайса за один проход упирается в лимиты: время выполнения скрипта, память, блокировки таблиц. Процесс падает на середине и оставляет данные в противоречивом состоянии. Правильный подход — батчи: обрабатывать прайс порциями по несколько сотен-тысяч строк, сохраняя прогресс, чтобы задача могла продолжиться с места остановки. Так импорт устойчив к сбоям и не роняет сайт нагрузкой.

Что такое идемпотентность фоновой задачи и зачем она нужна?

Идемпотентность означает, что повторный запуск задачи с теми же данными не портит результат: импорт не задваивает товары, рассылка не отправляет письмо дважды. Это критично, потому что фоновые задачи падают и перезапускаются. Достигается через уникальные ключи (внешний код, XML_ID), отметки «уже обработано» и проверку состояния перед действием. Без идемпотентности перезапуск после сбоя создаёт дубли и хаос.

Как генерировать YML-фиды для маркетплейсов без нагрузки на сайт?

Фид генерируют фоновой задачей по расписанию и складывают готовый файл, который отдаётся статикой, а не собирается на каждый запрос площадки. Для больших каталогов генерацию делают порционно и пишут во временный файл, который атомарно подменяет старый по завершении. Тогда площадка всегда получает целый актуальный фид, а генерация не конкурирует с посетителями за ресурсы сервера.

Где хранить очередь фоновых задач в Битрикс?

Для простых сценариев хватает агентов на cron и таблиц-очередей в базе. Для нагруженных проектов заводят полноценную очередь — отдельную таблицу задач или внешний брокер, — которую разбирает воркер по расписанию. Задача помечается статусами (в очереди, в работе, готово, ошибка), что даёт повторные попытки и мониторинг. Выбор зависит от объёмов: не стоит тащить тяжёлый брокер туда, где достаточно cron.

Как не отправить рассылку дважды при сбое?

Рассылку разбивают на порции и по каждому получателю фиксируют факт отправки до или сразу после неё в рамках одной логической операции. Перед отправкой проверяют отметку: если письмо уже ушло — пропускают. Тогда перезапуск задачи после падения продолжит с неотправленных, а не начнёт заново. Плюс ограничивают темп отправки, чтобы не превысить лимиты почтового провайдера и не попасть в спам.

Как отслеживать, что фоновая задача не сломалась молча?

Каждая задача должна логировать старт, прогресс, результат и ошибки, а также обновлять отметку «последний успешный запуск». Настраивают алерты: если задача не отработала в срок или завершилась с ошибкой — приходит уведомление. Молчаливо упавший импорт или неотправленный фид обнаруживают по последствиям через дни, поэтому мониторинг и алерты — обязательная часть, а не опция.

Можно ли запускать несколько фоновых задач параллельно?

Можно, но с осторожностью. Две копии одной задачи, запущенные одновременно, конкурируют за одни данные и создают дубли или гонки. Поэтому вводят блокировку (lock), которая не даёт запустить второй экземпляр, пока работает первый. Разные независимые задачи параллелить безопасно, если они не пересекаются по данным. Контроль блокировок особенно важен при запуске агентов через cron с коротким интервалом.

Поделиться:

Фоновые задачи роняют сайт и задваивают данные?

Перестроим импорт прайсов, генерацию фидов и рассылки на 1С-Битрикс на cron, батчи и очереди с мониторингом. Рассчитаем работу по вашему проекту.

Автоматизация на 1С

Редакция B2Bsite

Команда B2Bsite. С 2014 года разрабатываем интернет-магазины и порталы на 1С-Битрикс: строим устойчивую фоновую обработку, импорты, фиды и обмен с 1С под высокие нагрузки.

← Все статьи блога