Разработка модуля генерации фидов 1С-Битрикс
Маркетолог обнаруживает, что фид для Яндекс.Маркета обновляется раз в сутки через ручной экспорт, а цены в каталоге меняются несколько раз в день из-за выгрузки из 1С. В итоге на маркетплейсе показываются цены, которые уже неактуальны — покупатели кликают, видят другую стоимость, уходят. Стандартный модуль экспорта Битрикс (catalog.export) справляется с базовыми случаями, но при нестандартных требованиях (несколько складов, кастомные свойства, условия по регионам) быстро упирается в ограничения.
Архитектура модуля генерации фидов
Основная задача — сделать генерацию быстрой, гибкой и не зависящей от ручного запуска. Модуль строится вокруг трёх компонентов: движка шаблонов фидов, планировщика обновлений и реестра форматов.
Реестр форматов хранит конфигурации для каждого канала: Яндекс.Маркет (YML), Google Merchant (XML/CSV), ВКонтакте, Avito, Ozon, собственный формат клиента. Каждый формат описывается PHP-классом, реализующим интерфейс FeedFormatInterface:
interface FeedFormatInterface {
public function getHeader(): string;
public function renderOffer(array $element, array $prices): string;
public function getFooter(): string;
public function getMimeType(): string;
}
Это позволяет добавлять новые форматы, не трогая ядро генератора.
Генератор работает поточно: данные читаются из b_iblock_element, b_catalog_price, b_catalog_product через DataManager::getList с пагинацией (батчи по 500 элементов), немедленно пишутся в файл через fwrite — так генерация фида из 50 000 товаров не требует 512 МБ памяти. Финальный файл атомарно заменяет предыдущий (rename), поэтому краулер никогда не получает частично записанный документ.
Детальный разбор: логика цен и остатков
Это самая вариативная часть. Одному проекту нужна цена «для незарегистрированного пользователя», другому — специальная цена с учётом акции, третьему — минимальная цена среди всех складов.
Модуль реализует резолвер цен — стратегию, выбирающую итоговую цену по набору правил:
$priceResolver = new PriceResolver([
new DiscountRule($userId), // применить скидки через Sale\Discount
new RegionPriceRule($regionCode), // региональная надбавка
new MinPriceRule(), // взять минимум среди групп цен
]);
$finalPrice = $priceResolver->resolve($productId);
Остатки по складам. Для Ozon и некоторых других площадок нужно указывать остатки по конкретным складам (b_catalog_store_product). Модуль умеет агрегировать остатки по нескольким складам, применять резервы из таблицы b_sale_basket и выводить корректное доступное количество.
Фильтрация товаров. Через интерфейс модуля задаются условия включения в фид: только товары с ненулевым остатком, только определённые разделы каталога, исключение товаров с конкретным значением свойства CML2_EXPORT = N. Условия компилируются в фильтр для CIBlockElement::GetList.
Инкрементальное обновление
Полная перегенерация фида из 50 000 позиций занимает 3–5 минут. Для частого обновления цен это неприемлемо. Модуль поддерживает инкрементальный режим: через событие OnAfterCatalogPriceUpdate фиксируются изменившиеся товары, и раз в 15 минут агент перегенерирует только их строки в фиде через технику partial-update с временным файлом и патчингом.
Мониторинг и статистика
Модуль ведёт таблицу myvendor_feed_log с историей генераций: время начала/конца, количество элементов, размер файла, ошибки. В административном интерфейсе выводится дашборд: когда последний раз обновился каждый фид, сколько товаров попало в выгрузку, какие были отфильтрованы и почему.
Сроки разработки
| Объём | Состав | Срок |
|---|---|---|
| Базовый | 1 формат (YML или GMC) + планировщик | 2–3 недели |
| Средний | 3–5 форматов + резолвер цен + остатки | 4–6 недель |
| Расширенный | + инкрементальное обновление + мониторинг + регионы | 7–10 недель |
Конфигурация торгового каталога (одна или несколько цен, структура складов, наличие торговых предложений) должна быть зафиксирована до начала разработки — она напрямую влияет на архитектуру резолвера.







