-15%Скидка 15% на разработку сайта или магазина при старте до конца месяца

Разработка своего модуля для Маркетплейса Битрикс

Разработка модуля для Маркетплейса 1С-Битрикс: структура каталога модуля, установщик, лицензия и обновления

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

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

Коротко

  • Модуль Маркетплейса — это стандартная структура в /bitrix/modules/partner.name/ с полным установщиком.
  • Класс установки обязан чисто ставить и удалять файлы, таблицы, события, агенты и права.
  • Версии описываются в install/version.php, обновления разъезжаются через SiteUpdate.
  • Платный модуль защищается лицензией по домену и ключу; при её отсутствии функциональность деградирует мягко.
  • Перед отправкой прогоните решение по чек-листу вендора: «грязное» удаление и прямые SQL — главные причины отказа.

Что такое модуль Маркетплейса и зачем его собирать

Модуль в 1С-Битрикс — это самостоятельная единица функциональности с собственным пространством имён, своими таблицами, событиями, правами доступа и точкой входа. Ядро само состоит из модулей (main, iblock, catalog, sale и десятки других), и ваш продукт встраивается в ту же систему на равных правах. Маркетплейс — это витрина и инфраструктура доставки таких модулей: каталог решений, механизм установки, лицензирование и автоматические обновления.

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

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

Важно: модуль Маркетплейса — это в первую очередь контракт установки и удаления, а уже потом ваша бизнес-логика. Вендор проверяет не то, насколько полезен модуль, а то, насколько корректно он ставится, обновляется и убирает за собой все следы при удалении.

Структура каталога модуля

Модуль живёт в каталоге /bitrix/modules/<идентификатор>/ и имеет строго заданную структуру служебных файлов. Минимально работоспособный и пригодный к публикации модуль состоит из следующих частей.

Важно различать два «слоя» файлов. Всё, что лежит в корне модуля (include.php, lib/, lang/), остаётся в каталоге модуля и работает оттуда. А содержимое install/components/, install/js/, install/admin/ — это шаблонные копии, которые метод установки переносит в публичные каталоги системы (/bitrix/components/, /bitrix/js/, /bitrix/admin/). Соответственно при удалении модуля их нужно так же аккуратно убрать.

/bitrix/modules/partner.name/ include.php точка входа install/ установщик index.php · класс CModule version.php · VERSION db/ · components/ · admin/ lib/ классы в неймспейсе lang/ru/ локализация options.php настройки .description.php витрина Loader::includeModule() подключает include.php → автозагрузка lib/
Схема: корень модуля содержит точку входа, классы и локализацию, а каталог install/ — установщик, версию и файлы для копирования в публичную часть.

Идентификатор, неймспейсы и партнёрский префикс

Идентификатор модуля — это имя его каталога и одновременно ключ, по которому его подключают. Для решений Маркетплейса идентификатор строится по схеме partner.modulename, где partner — уникальный префикс вашей компании, зарегистрированный в партнёрской программе. Такой префикс гарантирует, что модули разных вендоров не столкнутся именами на одном сайте.

От идентификатора зависит сразу несколько вещей: имя каталога модуля, имя каталога установленных компонентов (/bitrix/components/partner.modulename/), пространство имён PHP-классов и ключи языковых сообщений. Хорошая практика — с самого начала выбрать неймспейс, повторяющий идентификатор: например, классы модуля partner.catalogtools живут в неймспейсе Partner\CatalogTools. Это делает автозагрузку прозрачной и снимает риск конфликтов.

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

Совет: зафиксируйте идентификатор и неймспейс до первой строки кода. Переименование модуля после публикации фактически означает выпуск нового продукта и потерю установленной базы и истории обновлений.

include.php и точка входа модуля

Файл include.php подключается каждый раз, когда любой участок кода вызывает \Bitrix\Main\Loader::includeModule('partner.modulename'). Его задача — минимальна и критична: зарегистрировать автозагрузку классов модуля и, при необходимости, объявить константы и подключить процедурные помощники для обратной совместимости.

Современный подход — не тянуть в include.php тяжёлую логику, а ограничиться регистрацией неймспейса в автозагрузчике ядра. Тогда классы из каталога lib/ подгружаются лениво, только когда действительно нужны. Это ускоряет старт и не нагружает страницы, где модуль не используется.

  1. Регистрация автозагрузки. Свяжите неймспейс модуля с каталогом lib/ через Loader::registerAutoLoadClasses() или PSR-совместимую карту, чтобы классы находились по имени.
  2. Константы окружения. Объявите служебные константы (идентификатор модуля, версия API), если они нужны коду в разных местах.
  3. Процедурные обёртки. При необходимости подключите файлы с функциями-хелперами для старого кода, который ещё не переведён на классы.
  4. Никаких побочных эффектов. Не выполняйте в include.php запросов к базе, регистрации событий или проверок лицензии «на каждом хите» — это замедлит весь сайт.

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

Класс установки: install/index.php

Сердце любого маркетплейсного модуля — класс установки в файле install/index.php. Он наследует CModule, объявляет свойства модуля (идентификатор, название, версию, автора) и реализует методы, которые вызывает мастер установки в админке. По этому классу вендор в первую очередь и оценивает качество упаковки.

Свойства класса берутся из version.php: конструктор считывает файл версии и заполняет MODULE_VERSION и MODULE_VERSION_DATE. Название, описание, имя партнёра и ссылку на сайт вы задаёте прямо в конструкторе, обычно через языковые сообщения, чтобы модуль был локализуемым.

Обязательный набор методов класса установки удобно разложить по зонам ответственности — так код читаемее и его проще проверять:

МетодОтвечает заПарный метод удаления
DoInstallСценарий мастера установки в админкеDoUninstall
InstallFilesКопирование компонентов, JS, админ-страниц в публичную частьUnInstallFiles
InstallDBСоздание таблиц, регистрацию модуля, праваUnInstallDB
InstallEventsРегистрацию обработчиков событий ядраUnInstallEvents
InstallAgents / InstallTasksАгенты по расписанию и операции прав доступаUnInstallAgents / UnInstallTasks

Метод DoInstall обычно проверяет совместимость (версию ядра и наличие нужных модулей-зависимостей), затем последовательно вызывает установку БД, файлов и событий, регистрирует модуль через RegisterModule() и показывает финальный шаг мастера. DoUninstall делает обратное — предлагает сохранить или удалить данные, снимает регистрацию модуля через UnRegisterModule() и вызывает парные методы удаления.

Важно: установка обязана проверять окружение до внесения изменений. Если модулю нужен catalog, а его нет, установщик должен вежливо сообщить об этом и не оставить систему в наполовину установленном состоянии.

Жизненный цикл установки и удаления

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

  1. Проверка совместимости. Установщик убеждается, что версия ядра и набор модулей позволяют работать, иначе прерывается с понятным сообщением.
  2. Установка базы данных. Выполняются SQL-скрипты из install/db/, создаются таблицы, регистрируется модуль, назначаются права доступа.
  3. Копирование файлов. Компоненты, скрипты и админ-страницы переносятся из install/ в публичные каталоги системы.
  4. Регистрация событий и агентов. Обработчики событий ядра и агенты по расписанию прописываются в системные таблицы.
  5. Активная работа. Модуль подключается через Loader::includeModule(), обслуживает свою логику, обновляется поверх себя новыми версиями.
  6. Удаление. Пользователь запускает деинсталляцию: снимаются события и агенты, удаляются файлы, по желанию — таблицы и данные, снимается регистрация модуля.

Отдельно про удаление данных. Хорошая практика — на шаге DoUninstall спросить у администратора, удалять ли таблицы с данными. Кто-то переустанавливает модуль и хочет сохранить накопленное; кто-то уходит навсегда и хочет чистую систему. Оба сценария должны отрабатывать корректно, без осиротевших таблиц, записей в системных списках событий и «висящих» прав доступа.

Проверка совместимости Установка БД и файлов События и агенты Активная работа Чистое удаление: события → файлы → БД снятие регистрации модуля, без «хвостов»
Схема: установка идёт слева направо через проверку, БД, файлы и события; удаление разворачивает всё в обратном порядке до чистой системы.

version.php и обновления через SiteUpdate

Версионирование — обязательная часть маркетплейсного модуля. Файл install/version.php возвращает массив с двумя ключами: VERSION (строка вида 1.2.3) и VERSION_DATE (дата сборки). По этим значениям система понимает, какая версия установлена, а какая доступна к обновлению.

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

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

Разряд версииКогда увеличиватьПример
Мажорный (X.0.0)Несовместимые изменения, смена структуры данных1.9.4 → 2.0.0
Минорный (0.X.0)Новая функциональность без слома совместимости2.0.0 → 2.1.0
Патч (0.0.X)Исправления ошибок, мелкие правки2.1.0 → 2.1.1

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

Важно: дата в VERSION_DATE — не косметика. Система обновлений сравнивает версии и даты, и рассинхрон между реальной сборкой и объявленной датой приводит к тому, что обновление либо не предлагается, либо предлагается некорректно.

Миграции данных между версиями

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

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

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

Сборка версии version.php: 2.1.0 Партнёрский кабинет Сервер обновлений SiteUpdate на сайтах Миграции: идемпотентно, только вперёд проверка схемы → донастройка данных
Схема: собранная версия уезжает в партнёрский кабинет и на сервер обновлений, откуда SiteUpdate доставляет её на сайты, где применяются идемпотентные миграции.

Лицензирование и защита тиражирования

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

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

Важно найти баланс между защитой и удобством. Слишком агрессивная проверка (жёсткие блокировки, частые обращения, зависимость от сети) бьёт по добросовестным покупателям и вызывает поток обращений в поддержку. Разумная защита незаметна для честного пользователя и лишь усложняет неправомерное тиражирование.

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

Требования вендора и подготовка к модерации

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

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

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

Установленные и доступные решения Маркетплейса управляются из раздела «Marketplace» в административной части. Там же виден установленный модуль, его версия и доступные обновления. Схематично карточка установленного модуля с мастером установки выглядит так:

Marketplace · Установка решения Идентификатор partner.catalogtools Версия 2.1.0 от 11.07.2024 Совместимость Ядро и модуль catalog найдены Мастер установки Шаг 1 из 2 · чтение прав и зависимостей Установить
Схема: карточка установки показывает идентификатор, версию из version.php и статус совместимости; кнопка запускает DoInstall. Реальные подписи зависят от версии платформы.

На стороне кода мастеру соответствуют методы класса установки. Когда администратор жмёт «Установить», ядро вызывает DoInstall; когда «Удалить» — DoUninstall. Между шагами мастер может показывать промежуточные экраны (например, вопрос об удалении данных), которые вы формируете внутри этих методов. Настройки модуля после установки открываются на странице options.php в разделе «Настройки — Настройки продукта — Настройки модулей».

Публикация в партнёрском кабинете

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

  1. Регистрация решения. Заводите карточку продукта: название, категория, описание, скриншоты, цена или бесплатная модель распространения.
  2. Загрузка дистрибутива. Пакуете модуль в дистрибутив нужного формата и заливаете его в кабинет; версия берётся из version.php.
  3. Отправка на модерацию. Вендор проверяет структуру, установку, удаление, безопасность и оформление по своему регламенту.
  4. Доработка по замечаниям. Если есть замечания, вы исправляете и отправляете повторно; первая итерация редко проходит без правок.
  5. Публикация. После одобрения решение появляется на витрине и становится доступно к установке и покупке.
  6. Выпуск обновлений. Новые версии загружаете так же; они разъезжаются по установленным сайтам через SiteUpdate.

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

Безопасность и совместимость

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

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

Частые ошибки

Мини-FAQ. Нужно ли перепубликовывать модуль ради мелкого патча? Нет — патч выкладывается как новая версия в том же решении и доставляется через SiteUpdate. Новая карточка на витрине нужна только для принципиально другого продукта, а не для очередной версии.

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

Сведём всё в практический список, по которому удобно принимать готовность модуля перед отправкой на модерацию:

  1. Структура на месте. Есть include.php, install/index.php, install/version.php, каталоги lib/, lang/ и файлы описания.
  2. Идентификатор зафиксирован. Префикс партнёра и неймспейс выбраны, стабильны и совпадают между каталогом, классами и языковыми ключами.
  3. Установка симметрична удалению. Все Install* имеют парные UnInstall*; после удаления система чистая.
  4. Совместимость проверяется. Установщик проверяет версию ядра и зависимости, не оставляя систему в полуустановленном состоянии.
  5. Версионирование корректно. VERSION и VERSION_DATE заполнены, семантика версий соблюдена, версия только растёт.
  6. Миграции идемпотентны. Обновления проверяют состояние схемы, безопасны к повторному запуску и к прыжкам через релизы.
  7. Лицензирование мягкое. Статус кэшируется, при недоступности сервера модуль работает, при отсутствии лицензии деградирует без падения.
  8. Безопасность и локализация. Вывод экранирован, права проверяются, тексты в языковых файлах, отладочный мусор убран.

Вывод

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

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

Чем модуль для Маркетплейса отличается от обычного локального модуля?

Технически это тот же модуль в каталоге /bitrix/modules/, но с идентификатором вида partner.modulename и полным набором служебных файлов: include.php, install/index.php с классом установки, version.php, описанием и правами. Главное отличие — модуль обязан устанавливаться и удаляться «чисто» на любой совместимой редакции, обновляться через систему обновлений Маркетплейса и проходить проверку вендором. Локальный модуль вы пишете под один проект, а маркетплейсный — под сотни неизвестных вам конфигураций.

Что обязательно должно быть в install-классе модуля?

Класс установки (наследник CModule) должен корректно отрабатывать четыре сценария: DoInstall и DoUninstall для мастера в админке, а также методы установки и удаления файлов, событий, агентов, прав и данных в базе. Хорошая практика — разнести логику на InstallDB/UnInstallDB, InstallFiles/UnInstallFiles, InstallEvents/UnInstallEvents. Удаление должно полностью убирать за собой всё, что модуль создал, иначе вендор вернёт публикацию на доработку.

Как работают обновления модуля в Маркетплейсе?

Каждая версия описывается в файле install/version.php с константами VERSION и VERSION_DATE. Пакеты обновлений выкладываются через партнёрский кабинет и разъезжаются по сайтам через модуль «Обновление системы» (SiteUpdate). Обновление применяется поверх установленного модуля, поэтому важно писать миграции идемпотентно и не ломать структуру данных предыдущих версий. Понижение версии не поддерживается, планируйте изменения только вперёд.

Нужно ли лицензировать модуль и как это устроено?

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

Какие требования вендора чаще всего заваливают модерацию?

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

Можно ли обойтись без публикации в Маркетплейсе и распространять модуль самому?

Да, модуль в стандартной структуре можно ставить и вручную — копированием в /bitrix/modules/ и установкой через «Marketplace → Установленные решения». Но тогда вы теряете автоматические обновления через SiteUpdate, витрину и защиту тиражирования. Для коробочного продукта, который вы продаёте многим клиентам, публикация в Маркетплейсе почти всегда выгоднее: это канал продаж, лицензирование и доставка обновлений «из коробки».

Поделиться:

Нужен свой модуль для 1С-Битрикс или публикация в Маркетплейсе?

Спроектируем архитектуру, соберём установщик и версионирование, настроим лицензирование и подготовим решение к модерации вендора. Оценим объём по вашей задаче.

Услуга «Разработка»

Редакция B2Bsite

Редакция студии B2Bsite. С 2014 года команда разрабатывает и поддерживает интернет-магазины и корпоративные сайты на 1С-Битрикс, создаёт модули и тиражные решения, настраивает обмен с 1С и сопровождает проекты среднего и крупного бизнеса.

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