Туториал 31.10.2025 15 мин чтения

CLI-автоматизация в 1C-Битрикс: от ручной работы к DevOps-подходу

С версии 25.0 в 1C-Битрикс появилась встроенная поддержка консольных команд через Symfony Console. Рассматриваем, как создать расширенный набор CLI-команд в своём модуле, а также забираем на вооружение готовое решение bxmax.cli

Кирилл Новожилов

Кирилл Новожилов

Автор

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

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

Штатные команды Битрикс и возможности расширения

С версии 25.0 в 1C-Битрикс появилась встроенная поддержка консольных команд через Symfony Console. Для этого нужно подключить composer-bx.json по официальной документации.

Все консольные команды в Битрикс запускаются через файл bitrix.php, который находится в директории bitrix вашего проекта:

        cd /path/to/document_root/bitrix
php bitrix.php [команда] [аргументы] [опции]

    

Просмотр всех доступных команд:

        php bitrix.php list

    

Эта команда выведет список всех зарегистрированных команд, включая встроенные команды Битрикс и команды из установленных модулей.

Получение справки по конкретной команде:

        php bitrix.php help [имя-команды]

    

Справка покажет описание команды, список доступных аргументов и опций с их описанием.

Что есть из коробки

Штатный функционал Битрикс включает такие команды как:

  • orm:annotate — сканирует проект на наличие ORM-сущностей и генерирует аннотации для улучшения автодополнения в IDE
  • make:component — создаёт компонент с базовой структурой
  • make:controller — генерирует REST-контроллер для API
  • make:tablet — создаёт ORM-класс (DataManager) для таблицы базы данных

Они, конечно, полезны при разработке, но не покрывают такие операционные задачи, как например, управление кешем, резервное копирование, работу с поисковым индексом и фасетными индексами.

Однако, мы можем создавать в своих модулях все необходимые нам команды.

Базовая структура команды

Консольная команда в Битрикс — это PHP-класс, который наследуется от Symfony\Component\Console\Command\Command и реализует два основных метода:

  • configure() — определение имени команды, описания и параметров
  • execute() — логика выполнения команды

Рассмотрим пример команды для пересоздания фасетного индекса инфоблока. Эта команда демонстрирует работу с аргументами и опциями:

        <?php

declare(strict_types=1);

namespace Bxmax\Cli\Command\Iblock;

use Bitrix\Iblock\PropertyIndex\Manager;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

class FacetIndexRebuildCommand extends Command
{
    protected function configure(): void
    {
        $this
            ->setName('iblock:facet-rebuild')
            ->setDescription('Пересоздание фасетного индекса для инфоблока')
            // Аргумент
            ->addArgument(
                'iblock_id',
                InputArgument::OPTIONAL,
                'ID инфоблока для пересоздания индекса'
            )
            // Опции
            ->addOption(
                'all',
                'a',
                InputOption::VALUE_NONE,
                'Пересоздать индексы для всех инфоблоков'
            )
            ->addOption(
                'force',
                'f',
                InputOption::VALUE_NONE,
                'Пропустить подтверждение'
            );
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $io = new SymfonyStyle($input, $output);
        
        // Получение значений аргументов и опций
        $iblockId = $input->getArgument('iblock_id');
        $all = $input->getOption('all');
        $force = $input->getOption('force');
        
        // Валидация: либо ID, либо флаг --all
        if (!$iblockId && !$all) {
            $io->error('Укажите ID инфоблока или используйте опцию --all');
            return self::FAILURE;
        }
        
        if ($iblockId && $all) {
            $io->error('Нельзя использовать ID и --all одновременно');
            return self::FAILURE;
        }
        
        // Запрос подтверждения (если не указан --force)
        if (!$force && !$io->confirm('Продолжить пересоздание индекса?', false)) {
            $io->note('Операция отменена');
            return self::SUCCESS;
        }
        
        try {
            $io->title('Пересоздание фасетного индекса');
            
            if ($all) {
                $io->writeln('Пересоздание индексов для всех инфоблоков...');
                // Логика для всех инфоблоков
                $manager = Manager::getInstance();
                // ... код пересоздания
            } else {
                $io->writeln(sprintf('Пересоздание индекса для инфоблока ID: %d', $iblockId));
                $manager = Manager::getInstance()->delete((int)$iblockId);
                $manager->build((int)$iblockId);
            }
            
            $io->success('Фасетный индекс успешно пересоздан!');
            return self::SUCCESS;
            
        } catch (\Throwable $e) {
            $io->error(sprintf('Ошибка: %s', $e->getMessage()));
            return self::FAILURE;
        }
    }
}

    

Ключевые моменты:

Аргументы (InputArgument) — обязательные или опциональные позиционные параметры

  • InputArgument::REQUIRED — обязательный аргумент
  • InputArgument::OPTIONAL — необязательный аргумент

Опции (InputOption) — именованные параметры с двойным дефисом

  • InputOption::VALUE_NONE — флаг без значения (например, --all, --force)
  • InputOption::VALUE_REQUIRED — опция с обязательным значением (например, --name=value)
  • InputOption::VALUE_OPTIONAL — опция с необязательным значением
  • Второй параметр — короткий вариант (например, -a для --all)

Получение значений:

  • $input->getArgument('имя') — получить значение аргумента
  • $input->getOption('имя') — получить значение опции

Интерактивность:

  • $io->confirm() — запрос подтверждения у пользователя
  • $io->ask() — запрос ввода данных

Форматированный вывод:

  • $io->title() — заголовок
  • $io->success() — сообщение об успехе
  • $io->error() — сообщение об ошибке
  • $io->note() — информационное сообщение

Примеры использования команды:

        # Пересоздать индекс для инфоблока с ID 5
php bitrix.php iblock:facet-rebuild 5

# Пересоздать индексы для всех инфоблоков
php bitrix.php iblock:facet-rebuild --all

# Пересоздать без запроса подтверждения (для автоматизации)
php bitrix.php iblock:facet-rebuild 5 --force

# Использование коротких опций
php bitrix.php iblock:facet-rebuild --all -f

    

Регистрация команды в .settings.php

Важно! Создания класса команды недостаточно. Команду необходимо зарегистрировать в файле .settings.php в корне вашего модуля:

        <?php

return [
    'console' => [
        'value' => [
            'commands' => [
                // Регистрация команды кеша
                \Bxmax\Cli\Command\Cache\CacheClearCommand::class,
            ],
        ],
        'readonly' => true,
    ],
];

    

Без регистрации в .settings.php команда не появится в списке доступных команд при выполнении php bitrix.php list.

Размещение файлов

Структура модуля с командами должна выглядеть следующим образом:

        /local/modules/your.module/
├── .settings.php          # Регистрация команд
├── install/
│   └── index.php
└── lib/
    └── Command/
        └── YourCommand.php # Ваша команда

    

После создания команды и регистрации в .settings.php она станет доступна через консоль Битрикс.

Готовое решение: BXMax CLI

Теперь, когда мы понимаем, как создавать собственные команды, рассмотрим практическое применение готового модуля BXMax CLI, который предоставляет расширенный набор команд для типовых задач:

  • Управление кешем: полная или выборочная очистка кеша
  • Резервное копирование: создание, восстановление и управление бэкапами
  • Поисковый индекс: переиндексация поиска с гибкими настройками
  • Фасетные индексы: оптимизация умных фильтров
  • Модули: управление модулями
  • Пользователи: работа с пользователями
  • База данных: информация о БД
  • Отладка: диагностика системы

Основное преимущество — возможность интеграции всех операций в скрипты деплоя, cron-задачи и CI/CD пайплайны.

Рассмотрим кейс, с которым постоянно сталкиваются разработчики при эксплуатации.

Автоматизация резервного копирования с ротацией

Проблема

На площадке необходимо создавать ежедневные резервные копии.

Требования:

  • Исключить статистику и поисковый индекс для уменьшения размера архива
  • Исключить временные файлы и кеш
  • Автоматически удалять архивы старше 7 дней, но оставлять минимум 3 последних копии
  • Процесс должен быть полностью автоматизирован

Решение: команды backup:create и backup:clean

Команда backup:create позволяет создавать резервные копии с детальным контролем содержимого:

        #!/bin/bash
# /usr/local/bin/daily_backup.sh

cd /var/www/bitrix

# Создание бэкапа с исключениями
php bitrix.php backup:create \
  --name="daily_$(date +%Y%m%d)" \
  --skip-stat \
  --skip-search \
  --skip-log \
  --exclude-dir=/bitrix/cache \
  --exclude-dir=/bitrix/managed_cache \
  --exclude-dir=/upload/tmp \
  --exclude-mask="*.log"

# Проверка успешности создания
if [ $? -eq 0 ]; then
    echo "Бэкап создан успешно: $(date)"
    
    # Автоматическая ротация: удалить старше 7 дней, оставить минимум 3
    php bitrix.php backup:clean --days=7 --keep=3 --force
    
    echo "Ротация выполнена"
else
    echo "Ошибка создания бэкапа" >&2
    exit 1
fi

    

Добавляем в crontab:

        # Ежедневный бэкап в 3:00
0 3 * * * /usr/local/bin/daily_backup.sh >> /var/log/bitrix_backup.log 2>&1

    

Что еще умеет BXMax CLI

Помимо описанных выше команд, модуль предоставляет инструменты для работы с другими компонентами системы:

Кеш

  • Очистка и управление кешем различных типов

Модули

  • Установка, удаление и управление модулями через CLI

Пользователи

  • Создание пользователей, управление паролями, просмотр списка

Инфоблоки

  • Просмотр списка инфоблоков, элементов, работа с фасетными индексами

Поиск

  • Переиндексация поискового индекса с различными опциями

Агенты

  • Ручной запуск агентов, управление очередью

Сайты

  • Просмотр информации о сайтах, управление настройками

Отладка

  • Диагностика системы, проверка конфигурации, вывод информации о среде

База данных

  • Получение информации о БД, оптимизация таблиц, проверка целостности

Резервное копирование

  • Полный набор команд для создания, восстановления, просмотра и управления резервными копиями

Полный список команд можно посмотреть выполнив:

        cd /path/to/bitrix
php bitrix.php list

    

Справка по любой команде:

        php bitrix.php help [команда]

    

Установка и начало работы

Подробная инструкция по установке модуля, требованиям к системе и первым шагам доступна в официальной документации:

👉 Руководство по установке

После установки вы получите доступ ко всем командам модуля. Полная документация с примерами использования каждой команды находится на сайте cli.bxmax.ru.

Заключение

В этой статье мы рассмотрели два подхода к CLI-автоматизации в 1C-Битрикс:

Создание собственных команд

Вы можете разрабатывать консольные команды под специфические задачи вашего проекта. Symfony Console предоставляет мощную основу для создания удобных инструментов автоматизации. Достаточно создать класс, унаследованный от Command, зарегистрировать его в .settings.php вашего модуля — и команда готова к использованию.

Использование готового решения

Модуль BXMax CLI предоставляет набор типовых команд для эксплуатации проектов: управление кешем, резервное копирование, работа с поиском и фасетными индексами, управление пользователями и модулями. Это экономит время на разработку и позволяет сосредоточиться на бизнес-логике проекта.

Ключевые преимущества CLI-подхода

Автоматизация и надежность

Скрипты выполняются одинаково каждый раз, исключая человеческий фактор.

Интеграция в DevOps-процессы

CLI-команды легко встраиваются в CI/CD пайплайны, cron-задачи и скрипты деплоя. Это позволяет построить полноценную инфраструктуру для автоматизации всего жизненного цикла приложения.

Масштабируемость и переиспользование

Написанные команды и скрипты можно использовать на всех проектах компании, что снижает накладные расходы и стандартизирует процессы.

Полезные ссылки

Теги:

Похожие статьи