От экспертов «1С‑Рарус»: Работа с EDT и Git — от миграции из Хранилища 1С до групповой разработки
От экспертов «1С‑Рарус»: Работа с EDT и Git — от миграции из Хранилища 1С до групповой разработки

От экспертов «1С‑Рарус»: Работа с EDT и Git — от миграции из Хранилища 1С до групповой разработки

27.02.2025
112 мин
98

Оглавление

  1. Введение
  2. Что такое Git
  3. Старт работы в 1C:EDT — перенос истории изменений в Git
  4. Порядок перехода в 1С:EDT для разработчиков
  5. Принципы ветвления работы
  6. Когда один разработчик работает над несколькими задачами
  7. Перенос изменений в Git
  8. Когда несколько разработчиков работает над несколькими задачами
  9. Улучшение «качества жизни» разработчиков
  10. Проверка и контроль изменений при объединении веток
  11. Обновление «боевой» базы и выпуск релиза
  12. Сложности при переходе на новые релизы платформы 1С
  13. Еще один вариант разработки — в 1С:Предприятии
  14. Послесловие

Введение

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

Помимо привычной связки Конфигуратор + Хранилище 1С теперь также полноценно используется 1C:EDT + Git. Альтернативной схемой является разработка при помощи Конфигуратора в паре с GIT. Давайте рассмотрим организацию процессов разработки решений в условиях гетерогенной среды, когда может использоваться как Конфигуратор, так и 1C:EDT.

Что такое Git

Чтобы разобраться, что такое Git, давайте для начала поймем, какие вообще существуют типы систем контроля версий:

  • Локальные системы контроля версий хранят информацию об изменениях на одном локальном компьютере разработчика.

    Локальные системы контроля версий

  • Централизованные системы контроля версий имеют единый центральный сервер, на котором хранится все версии файлов. Разработчики получают последние версии файлов из этого центрального места.

    Централизованные системы контроля версий

    К таким системам контроля версий относится Хранилище 1С:

    Хранилище 1С

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

    Распределённые системы контроля версий

К таким системам контроля версий относится GIT.

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

В качестве удаленного сервера чаще всего выступают специальные платформы для хостинга проектов, такие как GitHub/GitLab, а располагаться такой сервер может как в облаке GitLab/GitHub, так и на серверах внутри компании (в этом случае платформа, например gitlab, является отчуждаемой).

Также, один и тот же проект может синхронизироваться с несколькими удаленными серверами. Такая схема может применяться, например, для повышения уровня отказоустойчивости хранения данных.

Синхронизация с удалёнными серверами

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

В среде разработки 1С:EDT использование Git является нативным, поэтому многие проекты сейчас активно переводятся на разработку именно с ней.

Старт работы в 1C:EDT — перенос истории изменений в Git

Предположим, что мы решили перенести контроль версий проекта из Хранилища 1С в Git. Здесь существует несколько вариантов того, что нам делать с уже накопленным списком версий в Хранилище 1С.

Не переносить старые версии в Git

Это самый простой вариант и он предполагает оставить Хранилище 1С в качестве архивного. Если нам необходимо посмотреть какую-то старую версию объектов, то на этот случай необходимо будет вернуться в Конфигуратор и посмотреть/скачать нужную нам версию:

Не переносить старые версии в Git

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

Перенести всю историю изменений из хранилища в Git

Принцип переноса следующий:

  • Создать новый локальный репозиторий Git.
  • Для каждой версии из хранилища:
    • Сохранить версию в файл cf.
    • Загрузить полученный cf в информационную базу.
    • Выгрузить конфигурацию информационной базы в файлы в каталог с созданным репозиторием Git.
    • Если перенос будет производиться для дальнейшей разработки в 1C:EDT, то дополнительно еще необходимо конвертировать выгрузку в файлы в формат 1C:EDT при помощи утилиты ring. Это необходимо по причине разных форматов выгрузки Конфигуратора и 1C:EDT.
    • Сделать фиксацию изменений в локальной системе контроля версий (git commit).
  • Дополнительной задачей является сопоставление пользователей Хранилища с пользователями созданного Git‑репозитория для того, чтобы не просто видеть историю изменений, а делать это в разрезе пользователей.
  • Полученный локальный репозиторий далее отправляется на удаленный сервер.

Для автоматизации подобного сценария можно воспользоваться собственными скриптами или сценариями, используя запуск 1С в пакетном режиме или в режиме автономного сервера (ibcmd). Подробней о запуске 1С в пакетном режиме можно почитать на ИТС (its.1c.ru/db/v838doc#bookmark:adm:TI000000493), про автономный сервер и утилиту ibcmd можно почитать тут its.1c.ru/db/v8314doc#bookmark:adm:TI000000894.

Похожий сценарий мы реализовывали в нашем разработческом контуре при помощи решения «1С‑Рарус: Сценарный обработчик конфигураций» (сокращенно просто СОК):

Интерфейс переноса истории изменений в Git

Сценарий умеет перегружать историю изменений из Хранилища конфигураций 1С в Git, а также запускать проверку новых изменений в SonarQube. Однако, сценарий можно использовать также и для стартового переноса изменений при переходе на 1С:EDT. В основном шаге «Выполнить алгоритмы» написан код, который автоматизирует все вышеописанные действия по итерационному сохранению версий из Хранилища и фиксацию изменений в Git:

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

Помимо самописных сценариев и скриптов также можно воспользоваться специальной конфигурацией, которую предоставляет фирма 1С под названием «1С:ГитКонвертер». Подробней можно почитать на ИТС (its.1c.ru/db/metod8dev/content/5937/hdoc).

После переноса истории всех изменений проекта в новую систему контроля версий получим следующую схему:

Схема переноса истории изменений в Git

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

Сокращение версий Хранилища

Этот вариант является вариацией предыдущего. Когда версий в Хранилище очень много и перенос занимает огромное количество времени (несколько тысяч версий 1С:ERP запросто могут переносится месяц), то мы можем принять управленческое решение о сокращении версий Хранилища перед переносом, чтобы уменьшить количество версий. Полную версию Хранилища до сокращения при этом можно забэкапировать и оставить доступ на чтение:

>Сокращение версий Хранилища

Итак, предположим, что мы перевели систему контроля версий с хранилища на Git. Как теперь быть разработчикам?

Для начала, создать проект в 1С:EDT и подключиться к репозиторию Git. Далее мы будем рассматривать именно этот вариант работы, т. к. сами им пользуемся, но есть и варианты вести разработку в Git без использования 1C:EDT о чем было подробно рассказано в статье «Интеграция СППР и Git для учёта клиентских требований и управления разработкой 1С».

Порядок перехода в 1С:EDT для разработчиков

Далее будет показан процесс перехода разработки на 1C:EDT на примере разработки проекта «1С-Рарус: Сценарный обработчик конфигурации», которая происходила у нас в команде. В качестве платформы для управления удаленными репозиториями будет использоваться GitLab. Нижеописанные действия производятся каждым разработчиком на своей локальной станции. Также, если команда уже ведет разработку на 1C:EDT и необходимо перейти на новую версию платформы 1С, то порядок действий для рядовых разработчиков (за исключением ведущего разработчика, которому необходимо подготовить репозиторий к переходу на новую версию платформы) будет идентичен.

Версии 1C:EDT и платформы

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

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

  • 1C:EDT, за обновлениями и последними версиями можно следить на releases.1c.ru/project/DevelopmentTools10.
  • Git с официального сайта проекта git-scm.com/downloads.
  • Платформа 1С необходимой версии скачивается с releases.1c.ru/project/Platform83.

Далее необходимо получить доступы к аккаунту на платформе GitLab/GitHub, на которой размещается репозиторий Git:

Интерфейс GitLab для работы с репозиториями

В показанном примере рассматривается GitLab, т. к. мы используем именно эту платформу для разработки в нашей команде — у нас сервер GitLab развернут на мощностях нашей компании, однако можно использовать и облачное решение от вендора.

На платформе GitLab есть система прав доступа, поэтому необходимо убедиться, что к проекту есть доступ:

Интерфейс управления правами доступа в GitLab

Разворачивание проекта 1C:EDT из Git

После установки всех необходимых инструментов, создаём новый проект через программу 1C:EDT start (устанавливается вместе с дистрибутивом 1C:EDT) и запускаем его:

Создание нового проекта в 1C:EDT

Интерфейс программы 1C:EDT после её запуска

Интерфейс для настройки проекта 1C:EDT

Далее в редакторе проекта надо выбрать импорт конфигурации из Git и клонировать существующий URL:

Импорт конфигурации из Git в 1C:EDT

Ввод URL репозитория Git для клонирования

Вводим адрес удаленного репозитория и информацию для аутентификации пользователя:

Настройка аутентификации для Git репозитория

На экране выбора веток необходимо оставить ветки, которые используются в качестве базовых для разработки. На начальном этапе происходит клонирование только выбранных веток, но потом можно подключить и любые другие ветки:

Выбор веток для клонирования из Git

На экране выбора каталога проекта необходимо создать подкаталог в каталоге проекта:

Выбор каталога для проекта в 1C:EDT

Далее будет произведено клонирование проекта из репозитория Git:

Клонирование проекта из репозитория Git

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

На остальных шагах необходимо оставить настройки по умолчанию. В результате получим проект в 1C:EDT, импортированный из репозитория Git:

Проект в 1C:EDT после клонирования из Git

Получение демо-базы для ведения разработки

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

Для ведения полноценной разработки в 1C:EDT нам также необходима подключенная к проекту информационная база.

В случае с разработкой «1С-Рарус: Сценарный обработчик конфигураций» в качестве демо-базы будет выступать актуальная копия клиент-серверной базы со всеми нашими сценариями. Чтобы ее получить без необходимости «выгонять» всех работающих в ней пользователей, был написан специальный сценарий, который умеет восстанавливать файл формата dt из бэкапа MSSQL, который формируется регламентно средствами MSSQL сервера:

Восстановление базы данных из бэкапа MSSQL

Полученную демо-базу необходимо загрузить в информационную базу на локальном компьютере разработчика. Для этого в проекте 1C:EDT в панели информационных баз добавляем новую информационную базу:

Добавление новой информационной базы в 1C:EDT

После чего загружаем информационную базу из файла dt, полученного на предыдущем шаге:

Загрузка информационной базы из файла dt

Связывание проекта 1C:EDT с информационной базой

В общем случае, схема связывания проекта 1C:EDT с информационными базами 1С будет иметь следующий вид:

Схема связывания проекта 1C:EDT с информационными базами 1С

На схеме видим, что приложения являются промежуточной сущностью между проектом 1C:EDT и информационными базами 1С. Синхронизация данных при этом может происходить в обе стороны, как из информационной базы в проект, так и наоборот. Однако при схеме работы через 1C:EDT мы фиксируем изменения в системе контроля версий именно через файлы проекта, поэтому проект 1C:EDT является главным.

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

Для связывания проекта 1C:EDT с приложением необходимо воспользоваться специальной панелью приложений. Сначала включаем ее видимость:

Включение видимости панели приложений в 1C:EDT

Затем создаем новое приложение с флагом «Загрузить конфигурацию полностью»:

Создание нового приложения с флагом 'Загрузить конфигурацию полностью'

В результате в панели приложений можно будет увидеть все связанные с проектом 1C:EDT информационные базы:

Панель приложений с привязанными информационными базами 1C:EDT

После связывания проекта и информационной базы необходимо настроить конфигурацию запуска на используемую версию платформы 1С. В данный момент это 8.3.25. Перейти к конфигурациям запуска можно из подменю запуск:

Конфигурация запуска проекта 1C:EDT с указанной версией платформы

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

Настройка конфигурации запуска с деталями подключения к информационной базе

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

Обновление информационной базы в контекстном меню приложения

Для одновременной синхронизации всех связанных приложений можно нажать соответствующую кнопку в панели инструментов:

Синхронизация всех связанных приложений в панели инструментов

Альтернативный путь разработки

Существует и альтернативный вариант внесения изменений. Когда основной средой разработки все еще остается Конфигуратор. В этом случае разработка ведется в одной из связанных информационной баз:

Альтернативный путь разработки через Конфигуратор с использованием связанной информационной базы

После внесения всех изменений и их отладки необходимо вернуться в проект 1C:EDT и обновить его из связанного приложения. Для этого в контекстном меню приложения необходимо выбрать импорт конфигурации:

Импорт конфигурации в проект 1C:EDT через контекстное меню приложения

1C:EDT выдаст окно сравнения, где можно будет посмотреть, какие объекты будут затянуты из конфигурации в проект, а также разрешить возникшие конфликты:

Окно сравнения объектов конфигурации при импорте в проект 1C:EDT

После этого объединяем и проверяем, что все внесенные изменения перенеслись в 1C:EDT:

Проверка изменений, внесенных в проект 1C:EDT после импорта конфигурации

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

Обновление всех связанных приложений для распространения изменений на все базы

Принципы ветвления работы

Итак, у нас есть проект 1C:EDT подключенный к репозиторию Git и связанный с информационной базой 1С через приложение. Достаточно ли этого для старта разработки? Для полноценной разработки нам необходимо также разобраться с особенностями системы контроля версий, такими как ветвление и объединение изменений. Git предоставляет возможности ветвления разработки, чем мы и пользуемся в рамках разработки проекта «1С‑Рарус: Сценарный обработчик конфигураций». Давайте попробуем подробней разобраться, что это такое.

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

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

Механизм ветвления в Git, показывающий создание новой ветки от базовой версии

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

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

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

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

Когда один разработчик работает над несколькими задачами

Предположим, что у нас есть репозиторий Git, разработчик подключился к нему в базовую ветку. На схеме базовой веткой будет ветка common. Стоит отметить, что в общем случае базовая ветка вовсе не обязательно должна иметь имя master, main и т. д.

В момент подключения к удаленному репозиторию в определенную ветку, репозиторий скопировался на локальный компьютер разработчика, ветка common указывает на версию «Версия 3»:

Схема подключения к удаленному репозиторию

Продемонстрируем это также в реальном репозитории на тестовой ветке common. Внесем туда 3 изменения в 3 разных версиях. В 1C:EDT для этого есть специальная перспектива, которая так и называется — GIT:

Просмотр изменений в перспективе GIT

В выбранной перспективе можем просматривать список отслеживаемых веток Git и управлять ими, смотреть историю выбранной ветки, фиксировать изменения и отправлять их в удаленный репозиторий и так далее:

Управление ветками в GIT

Изменим одну из функций общего модуля проекта для демонстрационного примера:

Редактирование кода модуля

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

Индексирование изменений в GIT

Далее необходимо написать сообщение коммита и нажать «Фиксировать», если хотим внести изменения только в локальную ветку Git или же «Фиксировать и отправить», если хотим внести изменения и в удаленную ветку:

Фиксация изменений в GIT

Аналогично внесем еще 2 изменения, чтобы история версий проекта выглядела следующим образом:

История версий проекта

Предположим, разработчик работает над задачей, он внес новое изменение на своей локальной станции и зафиксировал его:

Фиксация новой версии

В этом случае на его локальном компьютере создается версия 4:

Создание версии 4

Граф изменений в 1C:EDT будет следующим:

Граф изменений в версии 4

Далее разработчика просят выполнить срочную задачу и выпустить патч, но он не должен в себя включать изменения версии 4. Без механизма ветвления нам нужна была бы еще одна информационная база или проект 1C:EDT, куда мы бы загрузили версию 3 и так решили бы задачу, выпустив патч. И в будущем изменения из этой копии базы необходимо было бы переносить вручную в основной проект.

При использовании ветвления мы можем создать отдельную ветку от версии 3. В общем случае ветка будет называться номером задачи из учетной базы задач. Для демонстрационного примера назовем ветку task_1. Внесем изменения в код и зафиксируем версию «Версия 5»:

Создание ветки task_1

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

Схема изменений с веткой task_1

Граф изменений в 1C:EDT будет следующим:

Граф изменений в версии 5

Теперь у нас есть отдельная ветка, в которой мы решили задачу «Задача 1» (ветка task_1), на базе «Версии 3», а также ветка common, в которой мы тоже вносили изменения и создали «Версию 4».

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

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

Контекстное меню с пунктом слияния веток

В нашем случае такой родительской версией будет «Версия 3». Таким образом, мы можем произвести трехстороннее объединение ветки task_1 в ветку common, объединив все изменения из «Версии 5» и «Версии 4». В этом случае Git создаст специальный коммит слияния, который и отобразит данную операцию:

Пример коммита слияния в Git

Граф истории изменений в 1C:EDT будет выглядеть следующим образом:

Граф истории изменений в 1C:EDT

Все изменения в коде перенеслись автоматически, так как мы меняли разные участки кода:

Перенесенные изменения в коде 1C:EDT

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

Перенос изменений в Git

Перед тем как перейти к более сложным случаям групповой разработки рассмотрим подробнее основные механизмы переноса изменений в Git. Перенос изменений из одной ветки в другую может понадобиться в нескольких случаях:

  1. Когда мы разрабатываем в позадачной ветке какую-то большую задачу и хотим актуализировать позадачную ветку всеми изменениями, которые были внесены за время разработки задачи в базовой ветке другими разработчиками. В этом случае мы переносим изменения из базовой ветки в позадачную.
  2. При завершении разработки в позадачной ветке мы наоборот переносим изменения из позадачной ветки в базовую, то есть ту ветку, от которой мы начали разработку задачи.

Сделать это можно следующими способами:

  • перемотка (fast-forward);
  • слияние (merge);
  • перебазирование (rebase).

Перемотка (fast-forward)

Перемотка применяется автоматически тогда, когда мы пытаемся слить изменения в ветку, в которой не было других изменений. Предположим, что разработчик фиксирует изменения в позадачной ветке и создается версия 4. При этом в базовой ветке common никаких новых изменений не появляется:

Графическое изображение перемотки изменений в ветку

Это самый простой случай, никаких дополнительных действий нам выполнять не потребуется, указатель ветки просто перейдет на версию 4:

Переход указателя ветки на версию 4

В 1С:EDT, когда разработчик переключится на базовую ветку common и выполнит операцию объединения веток, к примеру, слиянием, он увидит сообщение о том, что произошло автоматическое объединение методом перемотки:

Сообщение об автоматическом объединении веток

Окно с результатом перемотки ветки

Слияние (merge)

Если же все-таки произошла ситуация, когда в базовой ветке были внесены изменения по сравнению с веткой, изменения из которой мы хотим объединить, то возникнет ситуация, при которой перемотки указателя ветки вперед будет недостаточно:

Изменения в базовой ветке и ветке слияния

В этом случае самым популярным вариантом переноса изменений будет применение механизма слияния. При этом будет создана специальная версия слияния, которая зафиксирует объединение веток:

Создание версии слияния

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

Разрешение конфликтов

Представим, что изменения и в ветке-источнике, и в ветке-приемнике затрагивают один и тот же объект вплоть до строк кода. Для схемы выше, предположим, что изменения в версии 4 будут выглядеть так:

Изменения в версии 4

А в версии 5 так:

Изменения в версии 5

Получается, что изменена одна и та же строка кода. Система при этом не сможет применить слияние автоматически. В 1C:EDT будет выдано специальное окно сравнения объединения ветки common с веткой task_1:

Окно сравнения веток для разрешения конфликтов

Будет установлен фильтр «Показывать потенциальные проблемы», то есть нам необходимо будет пройти по всем объектам в окне сравнения и произвести их объединение вручную. В приведенном примере был изменен общий модуль br_ОбщегоНазначения. При нажатии на иконку с шестеренкой 1C:EDT выдаст окно объединения модуля:

Окно объединения модуля в 1С:EDT

Средняя часть окошка это результат ручного труда разработчика.

Безусловно, большим преимуществом 1С:EDT является удобный интерфейс для объединения форм, макетов и других сложных сущностей. Для демонстрации внесем изменения в ветке task_1 в синоним команды формы:

Изменения в синониме команды формы

В ветке common также изменим этот же синоним:

Изменения синонима команды формы в ветке common

При объединении изменений возникнет конфликт. На форме сравнения объединения мы увидим удобный интерфейс с детализацией вплоть до конкретного элемента формы:

Интерфейс с деталями конфликта при объединении изменений

Это выгодно отличает процесс объединения изменений в 1C:EDT для форм и других сложных сущностях от Конфигуратора 1С, или же от объединения исходных xml файлов при помощи сторонних программ.

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

Версия слияния веток после объединения изменений

Перебазирование (rebase)

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

Вернемся к ситуации, которая была описана для слияния веток. У нас есть изменения, которые мы внесли в позадачную ветку task_1, а также изменения, которые были внесены в базовую ветку common:

Слияние ветки task_1 с веткой common

Суть перебазирования заключается в том, что мы меняем родительскую версию ветки на новую и Git пытается применить все изменения, которые были сделаны от момента старого родителя до нового родителя в позадачной ветке. Давайте попробуем применить перебазирование ветки task_1 на актуальную версию ветки common. Для этого в ветке task_1 выберем в контекстном меню ветки common соответствующий пункт:

Выбор ветки common для перебазирования ветки task_1

Схематично мы увидим изменения родителя для версии 4:

Схема изменений родительской версии ветки task_1

Граф изменений в 1C:EDT будет выглядеть следующим образом:

Граф изменений в 1C:EDT для ветки task_1

При этом, если возникнут конфликты переноса, их можно будет точно также разрешить из окна сравнения-объединения, как в случае со слиянием.

Таким образом разработчики могут объединять изменения из разных веток, разрешая все возникающие конфликты.

Когда несколько разработчиков работает над несколькими задачами

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

Изменения, внесенные первым разработчиком в локальной ветке

Возникнет новая версия (на схеме это «Версия 4»):

Создание версии 4 после изменений первого разработчика

При этом одновременно с ним второй разработчик также внес изменения в код и зафиксировал их. Возникнет «Версия 5»:

Изменения, внесенные вторым разработчиком

Далее разработчик 2 отправил изменения в удаленный репозиторий:

Отправка изменений второго разработчика в удаленный репозиторий

С точки зрения разработчика 1, в его локальном репозитории от версии 3 была создана версия 4, а вот с точки зрения удаленного репозитория теперь от версии 3 создана версия 5. Поэтому при попытке отправить изменения в версии 4 в удаленный репозиторий первым разработчиком, он не сможет этого сделать. Будет выдано сообщение об ошибке отправки данных:

Ошибка отправки изменений в удаленный репозиторий

Схематично можем себе представить вышеописанную ситуацию следующим образом:

Схема конфликта между локальной и удаленной версиями

Граф изменений в 1C:EDT для разрабочика 1 будет выглядеть следующим образом:

Граф изменений для разработчика 1

Такого конфликта в рамках одной и той же ветки можно избежать, если заводить отдельные ветки для каждой задачи, выполняемой разработчиками. Позадачные ветки позволяют избежать конфликтов, по крайней мере до того момента, когда нам необходимо будет перенести изменения из ветки разработчика в базовую ветку. Для этого в Git есть такие механизмы как слияние и перебазирование. В позадачных ветках разрабочики могут не бояться делать «лишние» коммиты, так как они не помешают другим разрабочикам в команде, перед слиянием в базовую ветку лишние коммиты всегда можно объединить в один, также можно откатиться на одно из предыдущих зафиксированных состояний и т. д.

Итак, представим, что разрабочик 1 и разработчик 2 теперь начали вносить и фиксировать изменения каждый в своей позадачной ветке. У разработчика 1 в его локальном репозитории теперь есть ветка task_1, в которой он зафиксировал версию 4, а у разработчика 2 есть ветка task_2, в которой он зафиксировал версию 5:

Схема веток task_1 и task_2

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

Отправка изменений в репозиторий

При окончании разработки каждый из разработчиков отправляет и объединяет свои изменения в базовую ветку. При этом тот, кто первый отправит изменения в удаленный репозиторий не увидит никаких различий в ветках и изменения просто перенесутся из позадачной ветки в базовую быстрой перемоткой, то есть указатель ветки common переместится на Версию 4:

Перенос изменений в базовую ветку

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

Коммит слияния веток

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

Ветвление для релиза и разработки

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

Улучшение «качества жизни» разработчиков

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

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

Создание коммита с изменениями

Однако потом вспоминаем, что добавили в индекс не все измененные файлы, или же не дописали несколько важных строк кода. В этом случае мы можем не создавать новую версию, а изменить последний коммит, добавив в него новые изменения (операция git amend). Для этого в панели «Индексирование Git» мы как обычно добавляем файлы с изменениями в индекс, однако выбираем опцию «дополнить». В этот момент в поле сообщения коммита выведется сообщение последнего зафиксированного изменения, мы можем дополнить его и зафиксировать:

Дополнение последнего коммита

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

Новый коммит с дополнениями

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

Иногда возникает ситуация, когда мы вовсе хотим полностью отменить одно или несколько изменений и «откатить» все что мы сделали (операция git reset). Для этого в 1C:EDT на панели «История» мы можем выбрать соответствующий пункт в контекстном меню той версии, до которой мы хотим откатиться:

Отмена изменений и откат

Здесь главное разобраться в «степени жесткости» отмены изменений:

  • Мягко. Это вариант, когда изменения отменяются только в системе контроля версий, в локальных же файлах проекта все останется как было. Все измененные файлы при этом будут добавлены в индекс:

    Мягкая отмена изменений

  • Средне. Этот вариант похож на предыдущий с тем лишь отличием, что измененные файлы не будут проиндексированы:

    Средняя отмена изменений

  • Жестко. В данном варианте изменения полностью удалятся, как из истории версий, так и из локальных файлов проекта:

    Жесткая отмена изменений

Проверка и контроль изменений при объединении веток

Как уже говорилось ранее, в качестве удаленного сервера для хостинга репозитория Git мы используем GitLab, развернутый на сервере компании. Важной функциональностью, которой мы пользуемся, является возможность вносить изменения в базовую ветку только после верификации от ведущего разработчика. Для этого применяется «запрос на слияние» или же «merge request». Идея в том, чтобы не просто слить изменения из позадачной ветки в базовую, а пройти верификацию изменений ведущим разработчиком проекта. При таком подходе стоит вопрос, кто будет заниматься объединении изменений, ведущий разработчик или же разработчик, который закрыл задачу? В нашем случае за объединение и разрешение конфликтов отвечает последний, на плечи же ведущего разработчика ложится необходимость проверить правильность объединения.

Интерфейс GitLab позволяет разрешать конфликты непосредственно в момент создания merge request. Однако это не очень удобно из-за озвученной выше проблемы с объединением таких сложных сущностей как формы, макеты и т. д. Продемонстрируем на примере, который мы показывали в разделе о разрешении конфликтов, а именно в одновременном изменении одного и того же элемента формы в позадачной ветке и в базовой. Изменения в позадачной ветке будут следующими:

Изменения в позадачной ветке

В базовой ветке изменим синоним этого же элемента формы:

Изменения в базовой ветке

Перенесем изменения в удаленный репозиторий. Схематично это будет выглядеть следующим образом:

Перенос изменений в удаленный репозиторий

В интерфейсе GitLab в панели проекта можно перейти в меню merge request и создать новый запрос на слияние:

Создание merge request в GitLab

В качестве ветки-источника выберем ветку task_1, в качестве ветки-приемника выберем ветку common и нажмем кнопку сравнения:

Сравнение веток в GitLab

Перед запросом на слияние есть возможность установить флажок удаления ветки-источника (delete source branch), что полезно в случае с позадачной веткой, так как она нам больше не нужна, а также флажок сворачивания всех версий (squash commits), на которой ветка-источник отличается от ветки-приемника в один коммит. Это может быть полезно, опять же, в позадачной ветке, когда разрабочик фиксирует изменения «для себя», а уже при помещений изменений в базовую ветку все «сжимается» в один коммит с красивым и емким сообщением:

Сжатие изменений в один коммит

После нажатия на кнопку создания запроса на слияние система проверит возможность автоматического слияния, найдет конфликт и выдаст соответствующее сообщение. Можно попытаться разрешить конфликты прямо в интерфейсе GitLab, это может быть полезно, когда изменения небольшие. Для этого нажимаем Resolve conflicts:

Разрешение конфликтов в GitLab

Откроется окно разрешения конфликтов, но можно заметить, что для объектов 1С, которые хранятся как xml файлы, не всегда можно будет понять, как правильно разрешить тот или иной конфликт, а также провести валидацию:

Окно разрешения конфликтов

Если же все-таки конфликт не сложный, то можно воспользоваться кнопками Use theirs или Use ours для того, чтобы оставить в результате одну из версий строки с конфликтом, или же нажать Edit inline для ручного редактирования кода файла. После разрешения конфликта жмем Commit to source branch:

Решение конфликта в GitLab

В том же случае, если конфликтов много и все они в сложных сущностях, то гораздо проще будет разрешить их непосредственно в IDE. Однако прав на редактирование базовой ветки у обычного линейного разработчика, как правило нет. Как же тогда поступить, чтобы правильно сделать слияние веток? Правильный ответ будет следующим: перед созданием merge request необходимо в 1C:EDT слить или перебазировать изменения из базовой ветки в позадачную, а не наоборот. Если мы использовали перебазирование, то для примера выше мы должны получить историю версий, как на следующей схеме:

История версий после перебазирования

Таким образом, мы сможем разрешить все конфликты еще до проверки в GitLab способом, описанным в разделе о разрешении конфликтов в удобном интерфейсе 1C:EDT.

После того, как запрос на слияние отправлен, ведущий разработчик получает уведомление, находит merge request в списке и может просмотреть список внесенных версий (вкладка commits), список изменений по файлам (вкладка changes). Если все изменения верифицированы, то нажать на merge. Или же не спешить с подтверждением и оставить комментарий для разработчика, который создал запрос:

Просмотр merge request в GitLab

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

Обновление «боевой» базы и выпуск релиза

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

  1. Подключить «боевую» базу к проекту 1C:EDT.

В этом случае все что нам необходимо будет сделать — это обновиться из Git, то есть получить и слить все изменения из базовой ветки:

Обновление из Git

Если мы все делали правильно, то при обновлении базовой ветки конфликтов не должно быть. Далее необходимо обновить информационную базу новыми изменениями непосредственно через 1C:EDT:

Обновление информационной базы через 1C:EDT

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

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

Режим конфигуратора 1C

И далее сформировать файл поставки:

Формирование файла поставки

Подробней про формирование файлов поставки можно почитать на ИТС (its.1c.ru/db/metod8dev/content/2296/hdoc).

На базе cf поставки происходит сборка дистрибутива. Для этого в «1С‑Рарус: Сценарный обработчик конфигураций» мы разработали специальный сценарий сборки, который на верхнем уровне состоит из выполнения различных проверок перед сборкой, создания каталогов, подготовки всех необходимых файлов, включая файл документации, файл «Новое в версии», readme, файлы сервера защиты и т. д., а также непосредственно создания файлов поставки и копирования всех подготовленных файлов и копирования дистрибутива на сервер для публикации. Можно сказать, что сценарный обработчик конфигураций умеет «собирать сам себя»:

Сценарный обработчик конфигураций

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

Сценарий автообновления в макете

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

Процесс выполнения процедур обновления

Сложности при переходе на новые релизы платформы 1С

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

Все дело в том, что каждый новый релиз платформы может менять формат выгрузки конфигурации 1С в файлы, а значит, что в проекте 1C:EDT мы увидим большое количество изменений:

Изменения в проекте при переходе на новый релиз

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

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

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

Создание нового проекта после перехода на новую версию платформы

После чего необходимо запустить новый проект 1C:EDT и выбрать «Импорт конфигурации и расширений из информационной базы»:

Импорт конфигурации и расширений

В окне выбора информационной базы выбираем базу, подключенную к старому проекту 1C:EDT:

Выбор информационной базы для импорта

Убеждаемся, что версия платформы указана новая. То есть, если ранее информационная база работала на версии 8.3.25, а потом мы перевели ее на версию 8.3.26, то указываем 8.3.26:

Проверка версии платформы при импорте

После импорта у нас есть новый проект, созданный не из Git, а из информационной базы, соответствующей последней версии проекта в Git и переведенной на новый релиз платформы 1С:

Новый проект после импорта из информационной базы

Осталось подключить проект к репозиторию и зафиксировать все изменения в файлах проекта. То есть, с точки зрения конфигурации 1С мы ничего не изменили, но вот с точки зрения проекта 1C:EDT в файлах выгрузки будут содержаться изменения, связанные с тем, что поменялся формат выгрузки.

Для этого сначала необходимо скопировать каталог .git и файлы .gitignore, .gitattributes из каталога старого проекта 1C:EDT в каталог нового проекта 1C:EDT:

Копирование файлов репозитория в новый проект

Таким образом мы скопировали файлы локального репозитория из старого проекта 1C:EDT в новый проект. Теперь подключаем новый проект к скопированному репозиторию Git. Для этого в контекстном меню проекта выбираем «Групповая разработка — Общий проект»:

Подключение нового проекта к репозиторию

Если все сделано правильно, то система сама найдет каталог репозитория и предложит его подключить:

Автоматическое подключение репозитория

В панели «Индексирование Git» увидим большое количество изменений. В основном это изменения формата выгрузки сложных объектов в xml файлы:

Изменения в индексе Git

Добавляем все файлы в индекс, в сообщение коммита пишем, что произошло обновление на новую версию платформы и фиксируем:

Фиксация изменений после обновления на новую версию

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

Еще один вариант разработки — в 1С:Предприятии

Есть еще один интересный случай для проекта «1С‑Рарус: Сценарный обработчик конфигураций», когда разработка ведется в режиме 1С:Предприятия. Ведь разработка сценариев автоматизации предполагает написание кода шагов непосредственно в СОК:

Интерфейс редактора 1С:Предприятия для написания кода сценариев

Здесь мы можем поступить двумя способами:

  1. Напрямую редактировать шаги «боевой» базы «1С‑Рарус: Сценарный обработчик конфигураций»:
    1. Плюсы: не нужно переносить данные, они уже в «боевой» базе.
    2. Минусы: может быть неудобно отлаживать, не подходит для исправления сценариев, с которыми ведется активная работа пользователей. Наша «боевая» база СОК помимо сценария автообновления, который входит в поставку релиза «1С-Рарус: Сценарный обработчик конфигураций», содержит также множество других сценариев, таких как сборка релизов, выпуск патчей, декларативное обновление конфигураций и т. д. Более подробно мы уже рассказывали об этом в одном из докладов в рамках 1C‑Рарус Tech Day 2024.
  2. Редактирование копии базы и дальнейшее внесение изменений в «боевую» базу:
    1. Плюсы: можно отладить сценарий не помешав другим пользователям, а также комбинировать изменения в конфигурации и в информационной базе.
    2. Минусы: Необходимость переноса внесенных в копию изменению в «боевую» базу.

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

Выгрузка обработки для отладки в 1С:Предприятии

Выгрузка обработки для отладки происходит специальным служебным сценарием, система попросит указать окружение сценария, где должно быть заполнен путь к 1С и каталог для выгрузки:

Параметры выгрузки для отладки в 1С:Предприятии

Данные шага будут выгружены в специальную обработку, она содержит имя шага в своем названии:

Имя шага в выгруженной обработке

В форме обработки будет заполнена функция «Выполнение шага»:

Заполнение функции 'Выполнение шага' в обработке

Теперь мы можем редактировать код шага в Конфигураторе и отлаживать его используя все функции отладки:

Редактирование кода шага в Конфигураторе

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

Обратная загрузка изменений в шаг сценария

Код доработки автоматически загрузится обратно в шаг сценария:

Автоматическая загрузка кода в шаг сценария

После внесения всех изменений в копию базы перенос в «боевую» базу можно осуществить двумя способами:

  1. Ручное копирование сценариев, шагов сценариев, диаграмм мониторинга. Заходим в добавленный/измененный шаг, копируем его текст и вставляем в такой же шаг в «боевой» базе:

    Ручное копирование шагов сценариев

  2. Второй способ заключается в переносе изменений обработкой «Выгрузка загрузка XML»:

    Перенос изменений через обработку выгрузки и загрузки XML

Далее на стороне копии базы в случае нового сценария отмечаем:

  • Справочник «Сценарий» с отбором по ссылке в списке добавленный сценарий и все его родители:

    Справочник сценариев с отбором по ссылке

  • Справочники «Шаги сборки» и «Параметры» с отбором по владельцу:

    Справочники шагов сборки и параметров с отбором по владельцу

  • В случае изменения только шагов сценария, отмечаем только шаги с отбором по ссылке в списке добавленных/измененных шагов и отбором по владельцу.

    Далее жмем «Выгрузить данные» и сохраняем файл как xml:

    Выгрузка данных для изменения шагов сценария

На стороне «боевой» базы СОК открываем ту же обработку, в окне «Загрузка» жмем «Загрузить данные» и выбираем выгруженный из копии xml:

Загрузка данных из XML в боевую базу

В конце мы должны увидеть сообщение об успешной синхронизации, далее необходимо зайти непосредственно в загруженный сценарий и шаги и убедиться в правильности переноса, а также произвести тестирование сценария на «боевой» базе.

Послесловие

Прежде всего надо понять, что для эффективного перехода разработки в 1C:EDT необходимо проникнуться идеей работы с Git: все эти версии, ветки, слияния, перемотки, перебазирования. Проникнуться и понимать, в каком случае какая тактика лучше, в идеале прописать на уровне внутреннего регламента. В противном случае столь гибкие возможности непременно приведут к путанице и далее из этого ветвистого леса выбраться будет сложно.

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

Вы читаете статью из рубрики:
От экспертов «1С-Рарус»

Есть вопросы по статье? Задайте их нам!

Рассылка «Новости компании»: узнавайте о новых продуктах, услугах и спецпредложениях

Посмотреть все рассылки «1С‑Рарус»

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

Посмотреть все рассылки «1С-Рарус»

Иконка «Предупреждение» Отправляя эту форму, Вы соглашаетесь с Политикой конфидециальности и даете согласие на обработку персональных данных компанией «1С-Рарус»

Заинтересованы в сотрудничестве?
Нужна консультация?
Свяжитесь с нами!