Git на жестких 1С:ERP-проектах: быстрое внедрение без EDT

04.09.25

Разработка - Групповая разработка (Git, хранилище)

Проектная разработка в 1С живет в условиях жестких дедлайнов, меняющихся команд и нестабильных CI/CD. В статье показываем, как быстро и без лишних затрат внедрить Git на ERP-проектах, продать идею себе и команде и избежать типичных подводных камней. Разберем ветвление, подходы к командной работе, интеграцию с таск-трекерами и особенности тяжелых конфигураций.

Меня зовут Александр Болдышев. Я представляю компанию Axenix. Вот уже 18 лет я работаю, внедряя системы 1С как архитектор, разработчик, как человек, занимающийся внутренними производственными процессами.

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

Статья будет состоять из трех частей:

  • Первая из них попытается ответить на вопрос, зачем нам Git.

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

  • И, наконец, посмотрим на все это в применении к 1С.

 

Зачем нам Git. Проблемы проектных команд

 

 

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

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

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

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

 

Хранилище как база версионирования, возможности и ограничения

 

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

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

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

 

 

И вот тут к нам врывается Git со своими тремя, на мой взгляд, ключевыми фичами:

  1. Первая – самая интересная и фактически ключевая для этой статьи – это ветвление.

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

  3. Вследствие своей распределенности Git хорошо играет роль шлюза по передаче кода в какие-то внешние инструменты, будь то трекеры задач, если мы хотим обеспечить прослеживаемость, всякие тулы CI/CD, автоматической сборки или автоматического тестирования.

 

Ветвление Git

 

Как вообще устроено ветвление в Git, и что делает его таким особенным относительно большинства систем версионирования?

 

 

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

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

Репозиторий Git – это всегда дерево с одним корнем, одним корневым коммитом, у которого появляются потомки – один или несколько потомков на один коммит.

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

 

Внутреннее устройство Git, объекты и их взаимодействие

 

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

 

 

Git состоит из нескольких видов объектов. Самый известный объект – коммит.

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

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

Блоб – это третий вид объектов. У него тоже есть хэш-имя, а в остальном он просто кусок двоичных данных, обычно представляющий собой содержимое файла (впрочем, не всегда).

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

 

Базовой устройство гита довольно простое и интересное, но при чем тут ветвление? А вот при чем – кроме объектов в репозитории есть и такая сущность, как ссылки. Видов их тоже три штуки. И самая главная – это как раз ветки.

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

Что отличает текущую ветку от всех остальных веток? Только то, что на нее указывает другой указатель – HEAD, голова. Это тоже специальный файл в репозитории Git, в котором записано имя ветки. Изредка он еще указывает сразу на коммит, а не на ветку, но это отдельная история. Кстати, текущая ветка на картинке выше – feat/01.

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

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

Закончим с этой скучной теорией и перейдем ближе к практике.

 

Слияние и перебазирование – два способа объединения веток

 

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

Первый метод – классический Merge, то есть слияние, когда две ветки смыкаются в верхней точке, и в месте склейки образуется коммит (на схеме он рыжего цвета). У него как раз два родителя, но их может быть неограниченное количество – сколько веток мы захотели за раз замкнуть, столько у него будет родителей.

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

 

 

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

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

Вообще Rebase – очень мощный и опасный инструмент, потому что он переписывает историю. С точки зрения истории ветки feat/01 на картинке выше, коммит 3 перестанет существовать, а его заменит коммит 3’. Сам репозиторий глубоко внутри еще будет некоторое время помнить об исходном коммите 3, поэтому шанс восстановить старую историю есть, но чем дальше будет развиваться репозиторий, тем сложнее будет возможный откат.

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

Rebase хорош как инструмент подготовки текущей ветки разработки к слиянию с публичной веткой. Во-первых, перед слиянием свою ветку можно (и нужно!) пересадить на самый вверх публичной ветки, решив еще до слияния все конфликты, возникшие к моменту слияния. Во-вторых, Rebase позволяет «причесать» свою локальную ветку, пересобрать коммиты определенным образом, объединив какие-то коммиты, а какие-то даже убрав.

Если вы сделали Rebase своей ветки на последний коммит целевой ветки, то вы можете спокойно ее слить с этой веткой. Как классическим образом, через merge-коммит, так и «перемоткой», fast-forward. Потому что если вы сделали Rebase, ваша ветка теперь буквально «растет» из ветки, куда вы хотите влиться, как бы продолжает ее. И Git дает возможность просто перенести указатель целевой базы на новый коммит.

Есть разные мнения на счет уместности «перемотки». Некоторые стратегии ветвления отвергают ее, требуя коммит слияния как явную и конкретную точку объединения контекстов. Другие нацелены на «чистую», выпрямленную историю основной ветки разработки и приветствуют fast-forward.

 

Применение Git в 1С без EDT

 

Стоит начать с того, что EDT – это хороший инструмент, это настоящая Git-ориентированная IDE, логически развязавшая код и базы, в ней много хороших фич.

Почему же эта статья не про EDT? Дело в том, что очень большое количество разработчиков привыкли к конфигуратору, у нас железо на контуре разработки, которое далеко не всегда может потянуть ERP или подобные конфигурации, очень тяжелые с точки зрения работы в EDT. И мы хотим снизить этот порог входа как для разработчиков, так и для железа.

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

 

Процесс внедрения Git: мотивация, регламенты и поддержка

 

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

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

Кроме того, следует составить подробный регламент-шпаргалку, в котором будет написано, что делать в той или иной ситуации, потому что не все и не всё поймут сразу, это невозможно. Каждый сотрудник, каждый член команды должен знать, что после А мы идем к Б, даже если до не конца понятно, почему.

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

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

Кстати, важно выделить аппрувера, то есть человека, который одобряет перенос коммитов в основную ветку. При этом ему даже не обязательно (хотя и желательно) смотреть код детально, как на классическом код-ревью – достаточно обращать внимание на подозрительные коммиты с большим количеством удалений.

Главную ветку нужно защитить от такой вещи, как force push. Это действие, когда на сервер отправляется коммит, который переписывает историю основной ветки. Подавляющее большинство серверов умеет такую защиту ставить. Если есть аппрувер, то лучше спрятать основную ветку за Merge Request (он же Pull Request в терминологии GitHub)

 

Ежедневный релиз, цели и принципы процесса

 

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

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

Репозиторий должен быть легким и быстрым.

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

 

Реализация процесса: шаги и инструменты

 

Поговорим про принципы, а потом пробежимся по шагам.

  • Первый принцип очень простой – из конфигурации убирается все, что требует версионирования. Конфигурация хранит в себе только структуру объектов, хранящих данные, подсистемы и в некоторых случаях роли (если мы хотим создать новую роль, затрагивающую большое количество типовых объектов).

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

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

  • У вас наверняка есть какие-то миграционные обработки и отчеты – для них лучше завести отдельный репозиторий.

 

 

Теперь про шаги.

Каждый шаг начинается с подготовки контекста. Мы вытянули основную ветку, все ее последние изменения, с сервера, после чего создали ветку feat/01 – и переключились на нее. Таким образом, мы обновили и зафиксировали контекст, с которого начнется разработка по задаче. После чего загрузили этот контекст в базу разработки загрузкой файлов 1С или, например, с помощью precommit1c, который использует ту же загрузку файлов, собрали расширение (precommit1c из коробки не умеет собирать расширения, но научить его этому несложно).

 

Теперь мы поработали в конфигураторе, сделали какую-то разработку или ее часть и, допустим, хотим отдаться на тест. Или нам нужно переключиться на другую задачу. Соответственно, мы хотим «сохраниться» – положить куда-то текущий контекст, чтобы потом к нему вернуться. А это значит, что мы хотим сделать коммит. Готовим контекст для выгрузки, убедившись, что находимся на нашей ветке, выгружаем доработки из базы напрямую или, в случае использования precommit1c, выгружаем cfe, и делаем коммит. Если выгрузили cfe, precommit1c все нам разберет на файлы.

Вообще на этом инструменте хотелось бы немного остановиться. Precommit1c, на мой взгляд, замечательный инструмент, который мы используем в основном для каких-то внешний обработок и отчетов. Это скрипт, который фактически сидит на хуке (обработчике события) pre-commit (перед записью коммита) и превращает бинарные erf, epf, cfe в исходные файлы, а также при должной доработке выполняет разные манипуляции. Мы, например, научили его брать большие модули больших миграционных обработок и разрезать их по областям, а потом обратно склеивать при сборке. Это сильно облегчает коллективную работу над одной и той же обработкой. Другой вариант доработки – автоматическая сортировка дерева конфигурации.

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

 

 

Для переключения снова подготовили контекст: обновили основную ветку и на ее основе создали вторую ветку для разработки – feat/02. Переключились на нее и далее пошли работать по циклу предыдущей задачи: загрузка в конфигуратор, разработка, выгрузка, коммит.

 

 

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

  • Обновили контекст основной ветки
    git switch master && git pull --rebase
    (Можно короче, но так нагляднее)

  • Сделали rebase feat-ветки на master, чтобы «подтянуть» наши доработки к свежему состоянию основной кодовой базы и исправить возможные конфликты именно на своей ветке:
    git rebase master feat/01

  • Делаем слияние master и feat/01 (через fast-forward или merge-коммит)
    git merge feat/01

  • Отправляем master на сервер
    git push origin master

Все эти шаги может заменить обработка Merge Request в интерфейсе сервера – но только если ветка не успела устареть настолько, что появились конфликты слияния. В таком случае rebase и решение конфликтов надо будет делать локально.

 

Релиз и тегирование, завершение процесса

 

Кстати, когда мы говорим «ежедневный релиз», это не значит, что у вас уже есть прод. Вы можете работать еще до запуска и делать релизы в какой-нибудь препрод. Здесь все зависит от того, как устроен проект.

 

 

  • Получили контекст основной ветки
    git switch master && git pull --rebase
    (Можно короче, но так нагляднее)

  • Поставили на коммит тег и отправили на сервер
    git tag –a r-2024.10.10 –m “daily release 2024.10.10” && git push origin tag r-2024.10.10

 

 

  • Загрузили контекст в целевую базу:

    • обновили конфигурацию из хранилища,

    • собрали расширение скриптом сборки,

ИЛИ

  • напрямую загрузили из файлов.

 

GitLab Flow – продвинутый подход к управлению ветками

 

Выше я описал максимально простой и экстремальный процесс – в нем нет qa-процесса перед релизом, совмещены продуктивная и основная ветки. Но уже в таком виде он может выполнять задачу изоляции недоделок от основной ветки – и целевой для релиза базы.

Коротко расскажу еще об одном чуть более совершенном и распространенном процессе – GitLab Flow (не путать с GitFlow!)

 

 

Он также работает с основной веткой master (или main) и ветками feat.

Дальше идут отличия. Даже после rebase feat-ветка никогда не вливается в основную через fast-forward. Всегда создается коммит-смычка, merge-коммит, чтобы в истории навсегда остался момент, в который ветка разработки примкнула к основной ветке.

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

Если возникает необходимость в hotfix, GitLab Flow тоже с этим справляется. Часто ветка hotfix создается напрямую от продуктивной ветки, если исправлять нужно именно на копии продуктивного кода. В hotfix-ветке вносим изменения, проверяем их, выкатываем на прод (возможно, через qa-ветку), затем спускаем изменения в основную ветку master через cherry-pick (копирование коммита на новое место).

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

 

*************

Статья написана по итогам доклада (видео), прочитанного на конференции INFOSTART TECH EVENT.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

EDT Групповая разработка (Git, хранилище) Программист 1С v8.3 Бесплатно (free)

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

04.08.2025    3861    ZigRinat85    5    

33

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Программист 1С v8.3 1С:Библиотека стандартных подсистем Абонемент ($m)

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

1 стартмани

29.07.2025    2827    3    gorsheninsn    6    

27

Групповая разработка (Git, хранилище) Программист Бесплатно (free)

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

22.07.2025    5820    ktb    17    

36

Групповая разработка (Git, хранилище) Системный администратор Программист Бесплатно (free)

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

14.07.2025    2267    bborisko    0    

8

Групповая разработка (Git, хранилище) EDT OneScript Программист 1С v8.3 Бесплатно (free)

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

11.06.2025    3484    AlexF1    4    

8

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) EDT Программист 1С v8.3 Бесплатно (free)

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

21.05.2025    4762    vladimir_iclsoft    3    

20

Групповая разработка (Git, хранилище) Обновление 1С Программист 1С v8.3 Россия Бесплатно (free)

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

05.02.2025    6159    Nonik    10    

19
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. partizand 140 04.09.25 19:57 Сейчас в теме
Какой то ликбез по гиту (хоть и чувствуется глубокое понимание), но тема заголовка не раскрыта никак.
Основная проблема не в ветвления, гите и прочем, а вконфигураторе.
Сколько у вас занимает выгрузка в файлы конфигурации? И ещё интереснее, сколько загрузка?
Сколько времени программист будет вгружать ветку? А переключаться на другую?
Совсем не раскрыли тему.
user2035717; thornhiven; +2 Ответить
2. bozo 7 04.09.25 21:39 Сейчас в теме
(1) Первая часть действительно небольшой ликбез по устройству гита, который я посчитал важным, для понимания логики и работы ветвления.
Вторая часть: максимально простой, но эффективный процесс, который можно внедрить за несколько дней почти в любых условиях.

Конфигуратор же проблем не доставляет - я пишу в статье, что в основная конфигурация живёт в хранилище, но в ней нет ни логики, ни форм, строго структура объектов, хранящих данные. Загрузка же расширения на несколько сотен объектов занимает примерно секунд 30 в весьма среднем окружении.

Вообще эта статья - переложение прошлогоднего доклада, но где-то осенью планирую написать расширенное продолжение с практическими примерами развертывания и использования и процессом деплоя на тестовые и прод базы, в том числе и автоматическим. Ну и, соответственно, какую роль в этом играет гит.
user2108121; +1 Ответить
4. partizand 140 05.09.25 18:45 Сейчас в теме
(2)
Понятно
заголовок "гит на жёстких erp проектах". Содержание - "а вы erp не грузите в гит, используйте хранилище, и тормозить не будет". )))

Основная претензия у меня к заголовку, а не к содержанию.
7. bozo 7 07.09.25 22:57 Сейчас в теме
(4) Ну это вы зря, вы ведь внедряете erp, а не пишете его с нуля) Вы всю (вообще всю) бизнес-логику, разрабатываемую и дорабатываемую на проекте версионируете в гите, потому что там лежат ваши расширения, но вам нет никакого смысла тащить в него всю остальную огромную конфигурацию на несколько гигабайт исходников. Так что заголовок, считаю, все же неплохо бьется с содержанием, статья же не о том, как запихать в гит код, которые вы не трогаете.
3. YA_1854496380 05.09.25 09:26 Сейчас в теме
Полезная статья, спасибо!
5. Ks_83 263 05.09.25 22:03 Сейчас в теме
Не надо использовать конфигуратор. Ibcmd все это делает моментально
8. bozo 7 07.09.25 23:26 Сейчас в теме
(5) В целом да, но есть нюансы. Вот три наших кейса загрузки

1. Базы разработчиков. В описанной схеме для базы разработки ibcmd не нужна - разработчик уже в конфигураторе, он же постоянно в нем. Поэтому быстрее оттуда и загрузить.

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

3. Что касается, precommit1c, то мы ранее научили работать с конфигуратором в режиме агента через ssh, это уже сильно быстрее пакетного режима для сборки кучки файлов. Но мы ведь используем precommit1c именно для сборки/разборки внешних обработок/отетов (см. пункт 1), и ibcmd нам тут не помощник.
6. siamagic 07.09.25 14:02 Сейчас в теме
Человек вообще не работал в проектах и опыта у него 3 года максимум.
Потому что через гит соединять проекты в 1с это ещё один проект.
В 1с есть механизм расширений - видно кому по голове стучать и подрядчику проще поддерживать.

Пробовали гит на внешних обработках сделать - полностью бесполезная вещь.
Светлый ум; +1 Ответить
9. bozo 7 07.09.25 23:30 Сейчас в теме
(6) Вообще не понял, о чем вы - вторая половина статьи целиком посвящена процессу разработки на расширениях. Читать отсюда (цитата из статьи):


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

Все остальное – доработка типовых форм, формы новых объектов, все модули – делается только в расширении. Если вы работали с расширениями, у вас наверняка уже есть своя система, как вы эти расширения создаете, как делите код между ними.
10. Dach 388 09.09.25 09:57 Сейчас в теме
(0)

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

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

А так схема у вас рабочая вполне. Но трудности начинаются из-за самой 1С. Например, несколько раз (на совершенно разных релизах платформы) я сталкивался с тем, что если выгрузить конфу или расширение в файлы и затем загрузить - они не будут равны между собой. То какие-то свойства "поплывут", то вдруг некоторые обработчики на расширенных формах отвяжутся от своих свойств-указателей на элементах форм, то еще что-то... Ну и после смены релиза платформы надо всей команде перезагружать свои расширения (из-за смены номера версии платформы во всех xml)

Теперь, по хорошему, надо sonar настроить так, чтобы запускался на diff при оформлении merge.
Еще можно автоматизировать сборку релизов (cfe) после каждого коммита в любой ветке.
Для ветки master это позволит сразу релиз брать для обновления прода, а для фича-бранчей - можно будет автоматизировать автотесты, запускать их "на ветке" (берется эталонная ИБ, копируется, автоматом обновляется фича-бранч по ее cfe, запускаются тесты), результат тестов потом можно предъявить ревьюеру перед принятием MR
11. RustIG 1905 09.09.25 16:30 Сейчас в теме
ри этом он должен не запутаться, а в релиз не должен попасть лишний, не протестированный код.

Если ошибка проявляется в проде на сценарии, который никто не тестировал, и знать не знал, что вы делаете? Работа при этом стоит у многих пользователей. Как в таких случаях помогает ваш Гит ?
17. bozo 7 09.09.25 17:06 Сейчас в теме
(11) Вы немного путаете теплое с мягким. Ветвление на этапе разработки помогает изолировать незавершенный код от протестированного и готового к деплою. Если же баг проник в код из-за несовершенства тестирования, то гит тут может помочь только правильно провести хотфикс - если у вас продуктивный контекст изолирован в продуктивную же ветку, то от нее делается ветка хотфикса заливаемая и тестируемая в тестовой базе, после чего код вливается в продуктивную ветку, а коммит дублируется в основную ветку.
21. RustIG 1905 09.09.25 18:01 Сейчас в теме
(17)
из-за несовершенства тестирования

о чем вы говорите? какое совершенство тестирования? нет никакого отдела тестирования
вот вам рабочая ситуация - в рабочую базу попал код, который разработчик просто не мог протестировать на своей тестовой базе... Что в этом случае предлагает "ваш Гит"?
23. dhurricane 10.09.25 00:21 Сейчас в теме
(21)
разработчик просто не мог протестировать на своей тестовой базе... Что в этом случае предлагает "ваш Гит"?
GIT - это система версионирования кода. Он не решает организационные вопросы.
26. RustIG 1905 10.09.25 06:38 Сейчас в теме
(23) организационные вопросы? Вы работаете в идеальной компании. Я работал "в" и "с" разными компаниями 1с , для всех нормой было применять динамическое обновление по утрам при первых ошибках пользователей, обновление рабочей базы по ночам... Еще на это навешиваете Гит... Не правильно раставляете приоритеты: гит нужен компаниям в последнюю очередь. Гит нужен , особенно нужен тем, у кого "горячая" разработка и внедрение нескольких разработчиков, когда много версий нового кода, и базы часто восстанавливают из бэкапа, а цфшники из хранилища, когда "все" падает,...как бы с этого надо начинать....большинство не испытывают проблем связанных именно с торопливостью разработки и многолюдной разработкой приложений... В общем , всесильный Гит всего лишь упорядоченный версионификатор. Спасибо за разъяснения. Побольше бы практических кейсов от вас, коллеги, а то все голая теория.
Вспоминаю еще кейс, когда же гит жизненно необходим. Разработка одновременно нескольких версий одного приложения. Вот тут уже не получится вести разработку в одном хранилище. Нужны именно разные ветки разработки. Возможно Гит очень под это заточен. И получается, что Гит узкоспециализированный и для обычных компаний (не занимающихся коммерческой разработкой) не нужен. Спрашивается тогда, при внедрении Ерп, кому он нужен больше? Заказчику или Исполнителю? Ответ, имхо, - только Исполнителю. Смотрите заголовок статьи! Если Ерп внедряется собственными силами совместно силами сторонних исполнителей? Как делится Гит между участниками? Легко ли подключать сторонних участников к определенным веткам гит? Полагаю, что легко... Да, парни, не умеете вы продавать гит... Пришлось во всем разобраться самостоятельно, исходя из собственного опыта и логических рассуждений....
22. RustIG 1905 09.09.25 18:03 Сейчас в теме
(17) пока вы занимаетесь заливкой , у вас пользователи что делают? бумаги перебирают? или все-таки работают в 1С с ошибками?
24. dhurricane 10.09.25 00:22 Сейчас в теме
(22) Все так, да. Ждут, пока разработчики подготовят хотфикс и протестируют его.
25. RustIG 1905 10.09.25 06:24 Сейчас в теме
(24) ужас, не продумано совершенно. И вы еще не ответили, как вы исправлять это будете в рабочей? Выгонять пользователей? Или через динамич. обновление?
12. RustIG 1905 09.09.25 16:42 Сейчас в теме
Тестирование будет проходить на другой базе, и передача происходит через хранилище – ветка у нас одна, код пошел в хранилище и его получили все. В коде есть ошибки – их тоже получили все.

это вообще нормально? помещать непроверенный код в хранилище? ребята, вы о чем тут говорите?
13. bozo 7 09.09.25 16:51 Сейчас в теме
(12) Нет, конечно, это ненормально, и для обхода этого 1с придумала технологию разветленной разработки, не совсем совместимую с расширениями. И получается, что без гита есть два способа - отдельные несвязанные хранилища или перенос кода в тестовые базы руками. Статья же предлагает работать иначе - с гитом и его ветвлением, вы почитайте все же)
15. RustIG 1905 09.09.25 16:54 Сейчас в теме
(13) я тону в болоте чужих терминов, без привязки к 1с - ничего не понятно
16. RustIG 1905 09.09.25 16:57 Сейчас в теме
(13)
технологию разветленной разработки

о чем речь?

(13)
перенос кода в тестовые базы руками

вот это - "да" - реалистично и практично, удобно и контролируемо
берем бэкап базы - заливаем в тестовую базу, можно последний цфшник накатить и работать дальше, тестить.
в любом случае некоторые процессы можно тестить только в рабочей базе.
хорошо, когда рабочих баз несколько.
ну и тестовый контур тоже иногда нужно создавать для крупных проектов.
18. bozo 7 09.09.25 17:11 Сейчас в теме
(16)
о чем речь?


https://its.1c.ru/db/v8std/content/709/hdoc

вот это - "да" - реалистично и практично, удобно и контролируемо


если вы работаете один. А если у вас 10-15 разработчиков делают одновременно столько же задач, да еще и в пересекающихся объектах, а в релизе таких задач 40-60 штук, то нет - непрактично, неудобно и практически неконтролируемо.
14. RustIG 1905 09.09.25 16:52 Сейчас в теме
Первый метод – классический Merge, то есть слияние, когда две ветки смыкаются в верхней точке, и в месте склейки образуется коммит (на схеме он рыжего цвета). У него как раз два родителя, но их может быть неограниченное количество – сколько веток мы захотели за раз замкнуть, столько у него будет родителей.

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


первый абзац по русски расшифруйте и простыми словами на примере 1с-терминов

второй абазц - просто занавес - разработчик который объединяет не знает какой функционал и для чего был разработан, он должен собрать вокруг себя еще двух разработчиков каждой версии конфигурации и втроем решить как приоритетно объединить цфшники... это так?
19. bozo 7 09.09.25 17:14 Сейчас в теме
(14) Логически происходит точно так же, как происходит обновление конфигураций - трехстороннее сравнение. Погуглите его, в том числе и применительно к 1С.
20. RustIG 1905 09.09.25 17:58 Сейчас в теме
(19) ну вы совсем путаете.
трехстороннее обновление типовых -
1) обычно занимается один и тот же человек, чтобы сохранить преемственность накопленного опыта: после двух-трех обновлений, специалист уже понимает где больше всего изменений, на что обратить внимание.
2) есть ваши доработки основной базы, есть изменения поставщика - мы не берем в расчет ситуации, когда клиент новый и вам не известны причины доработок. Я в таких случаях половину доработок выкидываю, половину переношу в расширения, оставшуюся половину оптимизирую - переношу повторные вызовы в общий модуль. Короче, сравниваем только ситуацию, в которых вам известны причины собственных доработок и они на этапе трехстороннего сравнения оптимальны. Новые механизмы поставщика - наглядно видно, что изменили, это протестировано более-менее. И все равно, можно допустить конфликт и ошибку. Здесь не нужно ни с кем обсуждать изменения. За ночь можно обновить...

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

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

Поправьте меня, если что.
Для отправки сообщения требуется регистрация/авторизация