БонусБесплатный первый месяц абонентской поддержки при заказе разработки «под ключ»

Feature flags и безопасные релизы в Битрикс

Feature flags и безопасные релизы в 1С-Битрикс: постепенная раскатка на процент пользователей и мгновенный откат

Пятница, вечер, выкатили большой релиз с новой корзиной — и через десять минут в поддержку летят жалобы: у части покупателей не оформляется заказ. Дальше начинается знакомая гонка: срочный откат, пересборка, повторный деплой, потерянные заказы и нервная переписка в чате. Причина почти всегда одна: код и «включение фичи» слиты в одно событие. Стоит их разделить — и релиз перестаёт быть прыжком с обрыва. Именно это делают фиче-флаги (feature flags): код доставляется на прод в выключенном состоянии, а фича включается отдельным переключателем — сначала для 1% пользователей, потом шире, а при проблемах гасится за секунды.

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

Коротко

  • Разделяйте деплой и релиз. Код едет на прод под флагом в положении «выключено», а включение фичи — отдельное управляемое решение.
  • Раскатывайте постепенно. 1% → 5% → 25% → 100% с проверкой метрик на каждом шаге, а не «всем сразу».
  • Держите kill switch. Любую фичу под флагом можно выключить из админки мгновенно, без git revert и повторного деплоя.
  • Кэшируйте значения флагов и включайте флаг в ключ кэша компонентов, иначе сегменты получат чужой HTML.
  • Удаляйте флаги вовремя. У каждого временного флага есть владелец и срок жизни; после полной раскатки его убирают вместе со старой веткой кода.

Что такое фиче-флаги и зачем они в Битрикс

Фиче-флаг — это условие в коде, которое решает, выполнять новую ветку логики или нет. В простейшем виде это выглядит как if (Feature::isOn('new_checkout')) { /* новая корзина */ } else { /* старая корзина */ }. Обе ветки уже развёрнуты на боевом сервере, но пользователь видит одну из них в зависимости от значения флага. Само значение хранится вне кода — в опциях модуля, highload-блоке или отдельной таблице — и меняется без нового деплоя.

Ключевая идея, ради которой всё затевается, — разделение деплоя и релиза. Деплой (deploy) — это доставка кода на сервер. Релиз (release) — это момент, когда фича становится доступна пользователям. В классическом процессе эти два события совпадают: выкатили код — фича сразу «живая». Фиче-флаги их разводят: код можно деплоить хоть каждый час, накапливая изменения в выключенном виде, а включать фичи по отдельному, гораздо более осторожному сценарию.

Для 1С-Битрикс это особенно ценно. Проекты на платформе — это чаще всего живые интернет-магазины и порталы с реальными деньгами и заказами, где даже минута сломанного оформления заказа стоит дорого. При этом Битрикс — монолитная система: релиз обычно затрагивает много связанного кода сразу, и «частично выкатить» изменения сложно. Флаг возвращает эту гранулярность: даже в большом релизе каждую рискованную фичу можно включать и выключать независимо.

Важно не путать фиче-флаги с механизмами доставки кода. Ветки, теги, CI/CD-пайплайн и staging-окружение отвечают за то, как код попадает на прод; фиче-флаг отвечает за то, когда и для кого он начинает работать. Это дополняющие, а не конкурирующие инструменты: полноценный безопасный релиз использует и то, и другое.

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

Проблема «большого релиза» и как её решают флаги

Чтобы понять ценность флагов, стоит честно посмотреть на анатомию классического релиза без них. Команда неделями копит изменения в ветке, потом за один вечер выкатывает всё сразу. В этот момент одновременно меняются десятки файлов, и если что-то ломается, найти виновника трудно: подозреваемых слишком много. Откат откатывает всё, включая полезные изменения. А пользователи узнают о проблеме первыми — через сломанные заказы.

Флаги разбирают эту проблему на составляющие:

Обратная сторона честна: флаги добавляют условной логики, требуют инфраструктуры хранения и дисциплины удаления. Но на проекте, где релиз что-то приносит и что-то может сломать, эта плата почти всегда окупается. Особенно в связке с CI/CD-пайплайном для Битрикс: автоматическая доставка кода плюс ручное управление включением фич дают и скорость, и безопасность одновременно.

Архитектура системы фиче-флагов

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

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

Запрос пользователя Сервис оценки Feature::isOn() процент · сегмент Хранилище опции / HL-блок Managed cache значения флагов ON OFF
Схема: запрос проходит через единый сервис оценки, тот читает хранилище флагов и managed cache и возвращает включённую (ON) или выключенную (OFF) ветку кода.

Типы флагов: релизные, экспериментальные, операционные

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

Тип флагаЗачем нуженСрок жизни
Релизный (release)Отвязать выкладку кода от включения фичи, раскатать постепенноДни–недели, удаляется после полной раскатки
Экспериментальный (experiment)A/B-тест: сравнить конверсию двух вариантов на сегментахВремя эксперимента, потом остаётся победитель
Операционный (ops / kill switch)Аварийно отключить тяжёлую функцию под нагрузкойДолгоживущий, часть эксплуатации
Разрешающий (permission)Доступ к фиче для ролей, тарифов, бета-группДолгоживущий, часть бизнес-логики

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

Совет: заведите понятную схему именования: release_new_checkout_2026q1, ops_heavy_report_kill, exp_pdp_layout_b. Префикс сразу говорит о типе и ожидаемом сроке жизни, а дата в релизных флагах напоминает, что их пора убирать.

Где хранить флаги в 1С-Битрикс

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

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

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

Постепенная раскатка: canary и процент пользователей

Включить фичу «всем сразу» — почти то же самое, что релиз без флагов. Ценность флага раскрывается в постепенной раскатке (progressive delivery): фичу открывают сначала крошечной доле аудитории, следят за метриками и расширяют охват только если всё хорошо. Это и есть canary-релиз (канареечный релиз): небольшая «канарейка» проверяет, безопасен ли воздух, прежде чем в шахту спускаются все.

Типичная лестница раскатки выглядит так:

  1. Внутренние пользователи. Сначала фича видна только сотрудникам и тестировщикам — по флагу, привязанному к их аккаунтам. Ловим очевидные проблемы на реальном проде, но без риска для клиентов.
  2. 1% аудитории. Открываем крошечной случайной доле покупателей. Даже если фича сломана, страдает минимум людей, а сигнал в метриках уже виден.
  3. 5–10%. Если ошибки и конверсия в норме, расширяем. На этом объёме проявляются нагрузочные и краевые эффекты, незаметные на 1%.
  4. 25–50%. Половинная раскатка — фактически честный A/B: сравниваем поведение группы с флагом и без.
  5. 100%. Фича у всех. Флаг ещё какое-то время остаётся включённым как страховка, затем удаляется вместе со старой веткой.

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

Постепенная раскатка: от канарейки к 100% Внутренние команда 1% канарейка 10% нагрузка 50% A/B 100% все между ступенями — проверка метрик ошибок и конверсии
Схема: охват фичи растёт ступенями, и между каждой парой ступеней команда проверяет метрики — иначе раскатка не продолжается.

Таргетинг и сегментация аудитории

Процент — это простейший вид таргетинга «случайные N%». Но часто нужно тоньше: показать фичу конкретному городу, группе покупателей, оптовикам, бета-тестерам или только авторизованным. Сервис оценки флага должен уметь принимать контекст пользователя и решать по правилам.

Типичные измерения таргетинга в проектах на Битрикс:

Правила таргетинга удобно оценивать по принципу «первое совпадение»: сначала явные списки (внутренние сотрудники, поимённый allow-list), затем сегменты, затем общий процент, затем значение по умолчанию. Такой порядок делает поведение предсказуемым и позволяет, например, всегда видеть фичу самим, независимо от процента раскатки для всех остальных.

Релизы без простоя: как флаги дополняют деплой

Флаги отвечают за включение фич, но сами по себе не доставляют код. Полная картина «релиза без простоя» (zero-downtime deploy) складывается из двух слоёв: аккуратной выкладки кода и осторожного включения фич. Разберём, как они стыкуются.

На уровне доставки безотказность обеспечивают атомарное переключение релиза (симлинк на новую сборку, которую переключают одним движением), прогретый кэш и совместимость с базой. Подробно этот слой мы разбираем в материале про staging-окружение и деплой Битрикс: там про то, как прогонять релиз через промежуточную среду, чтобы прод получал только проверенный код.

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

Есть два стиля «безотказного» релиза, и флаги хорошо вписываются в оба:

ПодходКак работаетРоль флагов
Blue-greenДве одинаковые среды, трафик переключают с «синей» на «зелёную» целикомФлаги дают гранулярность внутри среды: не всё сразу, а фича за фичей
Canary (инфраструктурный)Новую сборку получает часть серверов/подов, трафик растят постепенноФлаги делают то же на уровне фич, не требуя дублировать инфраструктуру
RollingСерверы обновляются по одному, без общего простояФлаги гарантируют, что новая логика не включится, пока не обновились все

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

Флаги и миграции БД: expand → contract

Самое опасное место безопасных релизов — изменения схемы базы данных. Код можно откатить симлинком, а вот структуру таблиц — куда сложнее, особенно если новая версия уже успела записать данные в новом формате. Здесь флаги работают в связке с паттерном expand → contract (расширение и сжатие), он же параллельное изменение.

Идея в том, чтобы никогда не менять схему «на месте», а проходить через промежуточное состояние, совместимое и со старым, и с новым кодом:

  1. Expand (расширение). Добавляем новое поле/таблицу, не трогая старое. На этом шаге база совместима с обеими версиями кода. Деплоим этот шаг отдельно, флаг новой логики пока выключен.
  2. Двойная запись. Под флагом код начинает писать и в старое, и в новое место. Читает пока из старого. Так новые данные накапливаются в новой структуре без риска.
  3. Бэкофилл. Фоновым агентом переносим исторические данные в новую структуру, чтобы она стала полной.
  4. Переключение чтения. Постепенно раскатываем флаг «читать из нового». Если что-то не так — гасим флаг, чтение возвращается к старому источнику мгновенно.
  5. Contract (сжатие). Когда всё стабильно и флаг раскатан на 100%, отдельным релизом убираем двойную запись, старое поле и сам флаг.

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

Expand → Contract под управлением флага Expand + поле Двойная запись старое+новое Бэкофилл агент Читаем новое под флагом Contract − старое ↑ рискованный шаг — обратим переключателем
Схема: схему базы меняют через совместимое промежуточное состояние, а самый рискованный переход «читать из нового» управляется флагом и потому обратим.

Быстрый откат: kill switch за секунды

Откат — момент истины любой стратегии релизов. Без флагов откат означает git revert, повторную сборку, повторный деплой и прогрев кэша: в лучшем случае минуты, в худшем — с осложнениями, если релиз успел изменить данные. С флагами откат фичи — это выключение переключателя в админке, и он действует мгновенно для всех пользователей.

Такое выключение называют kill switch — аварийный рубильник. Чтобы он реально спасал, соблюдают несколько условий:

Отдельно стоит различать откат фичи и откат кода. Флаг отменяет поведение фичи, но код обеих веток остаётся на сервере. Это почти всегда достаточно и гораздо быстрее. Полный откат кода (revert + деплой) нужен реже — например, когда проблема не в фиче под флагом, а в общем изменении, затронувшем весь релиз. Комбинация «флаги для быстрого гашения фич + git-workflow для редких полных откатов» покрывает оба сценария.

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

Реализация в 1С-Битрикс: код и компоненты

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

Служебный модуль. Заведите небольшой собственный модуль (например, company.features) — он станет домом для сервиса оценки, страницы настроек и хранилища опций. Модуль подключается штатно и обновляется вместе с проектом. О разработке своих модулей у нас есть отдельный подробный материал в этой же рубрике.

Сервис оценки. Ядро системы — класс-фасад с одним публичным методом. Схематично он делает следующее:

  1. Читает определение флага из хранилища (опция модуля или highload-блок), беря значение из managed cache, а при промахе — из базы с последующим кэшированием.
  2. Проверяет явные правила: глобальный «выключен» (kill switch имеет приоритет), поимённый allow-list, принадлежность к группам пользователя через CUser/контекст.
  3. Применяет процент раскатки детерминированно: хэширует стабильный идентификатор пользователя вместе с именем флага и сравнивает с порогом. Один пользователь — всегда один и тот же ответ.
  4. Возвращает булево и при необходимости пишет в лог/метрику, в какую ветку попал пользователь.

Точки ветвления. В коде проверка выглядит как обычное условие: в компоненте, в обработчике события, в контроллере ajax. Держите проверку как можно ближе к месту, где ветвление реально нужно, и не «протаскивайте» булев флаг через десять слоёв — лучше спросить сервис локально.

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

Флаги и события. Обработчики событий ядра (например, OnSaleOrderBeforeSaved для нового расчёта заказа) — частое место фич под флагом. Оберните новую логику проверкой флага, оставив старую как ветку по умолчанию: так поведение оформления заказа переключается безопасно.

Флаги и агенты/очереди. Для фоновых процессов (агенты, cron, очереди) флаг читается так же, но контекст пользователя там часто отсутствует — тогда работают глобальные и процентные правила по сущностям (например, «обрабатывать новым способом 10% заказов»), а не по пользователю.

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

Как это выглядит в админке 1С-Битрикс

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

Фиче-флаг: release_new_checkout_2026q1 Состояние Включён Раскатка, % 25% Сегменты Бета-группа Оптовики Владелец: команда чекаута · Тип: release · Удалить после раскатки Выключить всё
Схема: тумблер состояния, ползунок процента раскатки, выбор сегментов и красная кнопка аварийного выключения. Реальные подписи зависят от реализации модуля.

Три элемента здесь принципиальны. Тумблер «Включён/Выключен» — это глобальный переключатель и одновременно kill switch: выключение здесь гасит фичу независимо от процентов и сегментов. Ползунок процента задаёт долю раскатки. Красная кнопка «Выключить всё» дублирует аварийное гашение крупно и заметно, чтобы дежурный не искал нужный тумблер в стрессовой ситуации. Полезно также логировать каждое изменение состояния с указанием, кто и когда переключил, — это и аудит, и помощь при разборе инцидентов.

Флаги, кэширование и композит

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

Правила совместной работы:

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

Тестирование при работе с флагами

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

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

Метрики, наблюдаемость и авто-откат

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

Что стоит мерить при раскатке:

МетрикаЧто показываетРеакция при отклонении
Частота ошибок в ветке фичиТехнические сбои новой логикиРост → откат флага, разбор
Конверсия / оформление заказаВлияние фичи на бизнес-результатПадение → откат, даже без ошибок
Время ответа и нагрузкаНе тяжелее ли новая веткаРост под нагрузкой → сузить раскатку
Доля пользователей в каждой веткеКорректность назначения по процентуРасхождение с настройкой → баг в оценке
Жалобы в поддержку по фичеКачественный сигналВсплеск → приостановить раскатку

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

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

Технический долг: удаление устаревших флагов

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

Дисциплина, которая не даёт флагам накапливаться:

Хороший ориентир: релизный флаг, проживший дольше пары месяцев, — это красный флаг (в прямом смысле). Либо фичу давно пора признать состоявшейся и убрать переключатель, либо раскатка застряла и надо разобраться почему. Регулярная чистка флагов — такая же часть здоровья кодовой базы, как обновление зависимостей.

Частые ошибки при работе с флагами

Мини-FAQ. Нужен ли флаг для каждой мелкой правки? Нет. Флаг оправдан там, где есть реальный риск и ценность обратимости: новая логика оформления заказа, интеграция, смена алгоритма, изменение схемы БД. Опечатку в тексте флагом закрывать не нужно.

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

Сведём всё в практический список, по которому удобно принимать готовность системы флагов и конкретной раскатки.

  1. Единый сервис оценки. Все проверки флагов идут через один класс-фасад, прямых обращений к хранилищу из бизнес-кода нет.
  2. Хранилище и панель. Флаги правятся из админки человеком без доступа к серверу; каждое изменение логируется с автором и временем.
  3. Кэш настроен. Значения флагов в managed cache, флаг включён в ключ кэша зависимых компонентов, при переключении кэш сбрасывается.
  4. Детерминированный процент. Назначение в ветку стабильно для пользователя между запросами; kill switch имеет приоритет над процентом и сегментами.
  5. Безопасный дефолт. При недоступности хранилища флаг считается выключенным; сервис оценки не падает и не тормозит.
  6. Обе ветки под тестами. Автотесты гоняются и с включённым, и с выключенным флагом; критичные сценарии проверены в обоих состояниях.
  7. Метрики раскатки. К флагу привязаны ошибки, конверсия и нагрузка по веткам; настроены алерты на отклонения.
  8. Миграции через expand-contract. Изменения схемы БД проходят через совместимое промежуточное состояние, рискованный переход управляется флагом.
  9. План удаления. У флага есть владелец, тип и срок жизни; после полной раскатки заведена задача на удаление флага и проигравшей ветки.

Вывод

Фиче-флаги превращают релиз из разового прыжка в управляемый процесс. Главная идея проста: разделите доставку кода и включение фичи. Тогда код едет на прод спокойно и часто, а рискованные функции включаются постепенно — сначала для канарейки, с оглядкой на метрики, — и гасятся одним переключателем, если что-то пошло не так. В связке с CI/CD, staging и паттерном expand-contract для базы это даёт релизы без простоя и откат за секунды вместо ночных авралов. Плата — дисциплина: единый сервис оценки, аккуратный кэш и своевременное удаление отработавших флагов. На живом магазине под нагрузкой эта плата окупается уже на первом предотвращённом инциденте.

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

Что такое фиче-флаг простыми словами?

Фиче-флаг (feature flag, флаг функциональности) — это условие в коде, которое включает или выключает новую возможность без нового деплоя. Код фичи уже развёрнут на боевом сервере, но выполняется только тогда, когда флаг включён. Управляют флагом из настроек или админки, поэтому включить фичу для части пользователей или мгновенно её отключить можно за секунды, а не за релиз-цикл.

Зачем фиче-флаги, если в Битриксе есть staging и обычные релизы?

Staging и релизы отвечают на вопрос «как безопасно доставить код на прод», а фиче-флаги — на вопрос «как безопасно включить фичу для живых пользователей». Это разные уровни. Даже с идеальным staging новая функция может повести себя иначе под реальной нагрузкой и на реальных данных. Флаг позволяет раскатать её на 1% аудитории, посмотреть метрики и либо продолжить, либо выключить одним переключателем без отката кода.

Где хранить значения флагов в 1С-Битрикс?

Есть несколько вариантов. Простейший — константы или опции модуля через Bitrix\Main\Config\Option, они кэшируются и меняются в админке. Для процентной раскатки и сегментов удобнее highload-блок или отдельная таблица через D7 ORM с кэшем. Значения флагов обязательно кэшируйте в managed cache, чтобы не дёргать базу на каждом запросе, и сбрасывайте кэш при изменении флага.

Как фиче-флаги помогают откатываться без деплоя?

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

Не превратятся ли флаги в свалку мёртвого кода?

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

Совместимы ли фиче-флаги с кэшированием и композитом Битрикса?

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

Поделиться:

Нужны безопасные релизы без ночных авралов?

Настроим CI/CD, staging и систему фиче-флагов под ваш проект на 1С-Битрикс: постепенная раскатка на процент пользователей, мгновенный откат и релизы без простоя. Оценим текущий процесс и предложим план внедрения.

Услуга «DevOps»

Игорь Воскресенский

Основатель студии B2Bsite. С 2014 года команда разрабатывает и поддерживает интернет-магазины и корпоративные сайты на 1С-Битрикс, выстраивает процессы релизов, CI/CD и фиче-флаги для среднего и крупного бизнеса под реальной нагрузкой.

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