Если Вы разрабатываете проекты на 1С-Битрикс с привлечением двух и более программистов, то Вам сюда.Всё, всё, шо нажил непосильным трудом, всё же погибло!
Три магнитофона, три кинокамеры заграничных, три портсигара отечественных, куртка замшевая… Три. Куртки.
И они ещё борются за почётное звание «дома высокой культуры быта», а?..
При использовании нашего модуля, время на выполнение релиза и перенос изменения БД, сокращается с нескольких часов до 10-20 минут (при отсутствии конфликтов).
Среди огромного разнообразия данных в 1С-Битрикс: Управление Сайтом для первого раза мы выбрали следующие сущности.
В модуле main :
Группы пользователей (сущность group )
Типы почтовых событий (сущность eventtype )
Почтовые события (сущность event )
Языки (сущность language )
Культура (сущность culture )
Сайты (сущность site )
Правила подключения шаблонов сайтов (сущность sitetemplate )
UF-поля (сущность field )
Варианты UF-списков (сущность fieldenum )
В модуле highloadblock :
ХЛБ (сущность highloadblock )
Поля ХЛБ (сущность field )
Варианты списков полей ХЛБ (сущность fieldenum )
В модуле catalog :
Типы цен (сущность pricetype )
В модуле sale :
Типы плательщиков (сущность persontype )
Группы свойств заказа (сущность propertygroup )
Свойства заказов (сущность property )
Варианты списков свойств заказов (сущность propertyvariant )
В модуле iblock :
Типы ИБ (сущность type )
ИБ (сущность iblock )
Свойства ИБ (сущность property )
Варианты свойств ИБ (сущность enum )
Поля разделов (сущность field )
Варианты полей разделов (сущность fieldenum )
Формы редактирования элементов и разделов ИБ (сущность form )
Для сопоставления записей между несколькими БД нужно выбрать уникальный ID. Родные числовые ID не подходят на эту роль — ими нельзя управлять и они могут различаться в разных БД.
Аналогичная проблема есть при обмене товарами и заказами между сайтом и 1С. Там она решается с помощью уникального внешнего кода — XML_ID. Вот только не у всех данных в БУС предусмотрено это поле. А у тех, что есть, оно не всегда уникальное. Пришлось нам сделать “надстройку” над системным полем XML ID. В таблице ниже описаны все сущности с их XML ID миграции.
Сущность | XML ID миграции |
---|---|
Группа пользователей | STRING_ID |
Тип почтового события | LID + EVENT_NAME |
Почтовый шаблон | md5(EMAIL_FROM+EMAIL_TO+EVENT_NAME+сайты) |
Язык | LID |
Культура | NAME |
Сайт | LID |
Настройка шаблона сайта | SITE_ID+TEMPLATE+md5(CONDITION) |
UF-поле | md5(ENTITY_ID+FIELD_NAME) |
Вариант списка UF-поля | XML_ID |
highload-блок | TABLE_NAME |
Поле highload-блока | md5(highload-блок+FIELD_NAME) |
Вариант списка поля highload-блока | XML_ID |
Тип цены | XML_ID |
Тип плательщика | md5(NAME+сайты) |
Группа свойств заказа | md5(NAME+Тип плательщика) |
Свойство заказа | md5(CODE+Тип плательщика) |
Вариант свойства заказа | md5(VALUE+Свойство заказа) |
Тип инфоблока | ID |
Инфоблок | XML_ID |
Свойство инфоблока | Инфоблок+XML_ID |
Вариант свойства инфоблока | Инфоблок+XML_ID |
Право на инфоблок | md5(Инфоблок+Группа) |
Форма редактирования | Инфоблок+несколько полей формы |
Поле раздела инфоблока | md5(Инфоблок+FIELD_NAME) |
Вариант списка поля раздела инфоблока | XML_ID |
Конфигурацию можно изменить в файле /local/migrato/config.xml . Кстати, папку /local/migrato/ нужно обязательно добавить в репозиторий — помимо конфигурации здесь же будут и XML-файлы экспорта. Файл редактируется только вручную через FTP/SSH/файловый менеджер БУС. Синтаксис файла представлен в таблице:
Узел | Родительский узел | Описание |
---|---|---|
<config> | - | Корневой |
<module> | <config> | Настройки миграции модуля |
<name> | <module> | Название модуля |
<entity> | <module> | Сущность для миграции |
<name> | <entity> | Название сущности |
<options> | <config> | Мигрируемые настройки |
<exclude> | <options> | Регулярное выражение для исключения настроек из миграций |
Для устранения проблем с таймаутом сервера (и чтобы придать тёплую ламповую атмосферу) вся работа с модулем после установки вынесена в командную строку. Точка входа: <папка модуля>/intervolga.migrato/tools/run.php (в примерах для краткости будет обозначена как run.php ).
Интерфейс модуля в командной строке
Синтаксис простой:
$ php run.php команда [опции]
Доступные команды:
Служебные команды (для разработчиков новых сущностей):
Доступные опции:
Модуль читает config.xml и проверяет, чтобы у всех экземпляров сущностей были заданы корректные XML ID. Команда ничего не изменяет в БД. Критерии корректного XML ID:
Исправление ошибок XML ID — ответственный шаг, потому и вынесен в отдельную команду. Внимание: процесс может привести к модификации БД . Для всех найденных ошибок XML ID вызывается генератор XML_ID, создающий уникальный код сущности.
Если при выполнении одной из предыдущих команд произошла ошибка, увидеть их можно командой log . Использовав опцию --fails можно отфильтровать все записи, оставив только сообщения об ошибках. Если же вам удобнее работать с БД, то все ошибки сохраняются в таблице intervolga_migrato_log .
Помните, трава раньше была зеленее, мороженое вкуснее а модуль DEFA Tools был бесплатным? Его генератор демо-контента мы воспроизводить, конечно, не стали, но добавить по 2 записи в каждую сущности команда generate может. Команда полезна для разработчиков новых сущностей.
Вторая команда, полезная для разработчиков (и тестировщиков). Исполняется сценарий.
Если все сущности работают правильно, diff будет пустым. Если же нет — это значит, что в коде сущности есть ошибка и она импортируется в базу неправильно.
Узел | Родительский узел | Описание |
---|---|---|
<options> | - | Родительский узел |
<option> | <options> | Настройка |
<name> | <option> | Название настройки |
<value> | <option> | Значение настройки |
<site> | <option> | Сайт, для которого задано значение |
Узел | Родительский узел | Описание |
---|---|---|
<data> | - | Родительский узел. Атрибут deleted говорит, что данные были удалены |
<xml_id> | <data> | XML ID данных |
<dependency> | <data> | Узел зависимости |
<reference> | <data> | Узел ссылки |
<field> | <data> | Узел простого поля |
<name> |
<dependency>
<reference> <field> |
Название поля |
<value> |
<dependency>
<reference> <field> |
Значение поля |
Чтобы начать использовать модуль необходимо на боевом сайте создать оригинальный слепок БД:
Чтобы подготовить миграцию на песочнице devX после окончания работы над задачей:
Выполнить миграцию (релиз) на боевом сайте:
Пытливый читатель-программист может задать вопрос: как же теперь писать код, если использовать ID — плохо, а XML ID миграции не всегда совпадает с XML ID сущности?
Модуль предоставляет API для получения ID по XML ID:
\Intervolga\Migrato\Data\BaseData::getPublicId($xmlId)
Метод использует кеширование, так что о производительности не стоит беспокоиться.
Если вы используете константы для обращения к сущностям по ID, то вам только и нужно — сделать следующую замену.
Было
Стало
А вот второе изменение принять будет не так просто. Визуальный редактор БУСа при работе с компонентами генерирует код, в котором явно фигурируют “магические” неуникальные числовые ID.
Вот за такое хочется Битрикс от души поругать. Генерация кода зашита очень глубоко и кастомизировать её нет никакой возможности. Мы не стали придумывать хитрых способов подмены такого кода и просто ввели правило — визуальным редактором для редактирования компонентов не пользуемся. Программист один раз настраивает компонент, потом заменяет ID на XML ID миграции и никаких няш-мяш. Если знаете способ лучше — расскажите в комментариях, с радостью примем на вооружение.
И, напоследок, выполнение общего примера нашим модулем. Сразу после установки проверили все записи на наличие внешних ключей и исправили ошибки:
Теперь можно создавать dev сайты для разработчиков - клонируем prod и обязательно делаем первый снимок базы данных (выполняем команду экспорт).
После того, как каждый программист выполнит свою задачу на своем сайте, он делает экспорт. Так как изменения были произведены только в ИБ модуле, то и экспортировать другие модули нет смысла (Настройка config файла).
После программист делает коммит экспортируемых файлов, и перед тем как вытолкнуть файлы на удаленный репозиторий необходимо проверить, может другой программист выполнил задание быстрее (git pull).
На этом шаге, возможна ситуация возникновения конфликта. Что же, тут есть 2 пути, смотря как Вам удобней работать. Если у вас git на серверах разработки, при конфликте появится такое предупреждение:
Открываете файл, например с помощью vim (vi local/migato/iblock/type/...) и выбираете, кто из программистов не врет.
После этого индексируете файлы и коммитете.
Есть еще второй путь, если у вас гит только на локальной машине, и синхронизируете все файлы с помощью гита, но на локальной машине. На примере показано возникновение конфликта в IDE PHPStorm.
Как только все конфликты разрешены, программист должен вытолкнуть изменения на сервер.
После того, как все программисты вытолкнули свои изменения, версия базы данных в системе управления версий стабилизируется. Это значит, что наступило время делать релиз. После которого, чтобы обновить любой сайт (будь то сайт для разработки или prod), достаточно трех глобальный вещей:
В результате, каждый сайт имеет актуальную версию базы данных со всеми изменениями. Будь то удаление, создание или изменение записи с конфликтами или без, наш модуль превосходно справился с поставленными задачами.
Инструмент для миграции изменений БД жизненно необходим при ответственной командной работе над проектами. До сегодняшнего дня эта задача в мире 1С-Битрикс решалась очень плохо.
Мы же разработали промышленное решение этой задачи и отдаем его бесплатно всем желающим. Пользуйтесь, предлагайте улучшения, участвуйте в развитии, мы будем рады. Чтобы получить ссылку на установку модуля миграций для Битрикс, “поделитесь” статьей в соцсетях и укажите ссылку в форму под статьей. Ссылка на репозиторий с документацией придет вам на почту.