Gitter (Хранилище 1С => Git)


Gitter — это конфигурация для автоматизации процесса выгрузки изменений из хранилища 1С в систему версионирования Git.

Введение

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

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

Gitter

Gitter — это конфигурация для автоматизации процесса выгрузки изменений из хранилища 1С в систему версионирования Git. Gitter призван повысить надежность хранения истории ваших изменений.

Gitter Gitter2

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

Не знаете что такое Git? Начните с официального сайта http://git-scm.com, там вы найдете программы-клиенты, книгу на русском языке (http://git-scm.com/book/ru), а так же много другой информации.

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

Плюсы

— Повышение надежности.
Помимо локального репозитория Git, в который выгружаются изменения из хранилища, есть возможность выгрузки в удаленные репозитории Git. Например, можно использовать такие ресурсы как github.com или bitbucket.org. Последний имеет возможность бесплатного размещения приватных репозиториев. В свою очередь с удаленных репозиториев можно синхронизировать изменения в любое количество локальных репозиториев. При правильной организации процесса потерять историю изменений просто невозможно.

— Аналитические возможности.
Очень часто для того, чтобы оставить след в истории разработки конфигурации, мы указываем в коде комментарии, содержащие автора, дату, номер задачи. Так или иначе это снижает «чистоту» кода, заставляет вводить регламенты, описывающие то, как следует комментировать код, т.е. в целом усложняет процесс разработки.
Git blame, по моему мнению, позволяет забыть о лишних комментариях. Достаточно оставлять содержательный комментарий при помещении изменений в хранилище. Я создал небольшую демонстрационную конфигурацию, которую выгрузил с помощью Gitter в публичный репозиторий GitterDemo. Здесь видно кто и что добавлял в модуле менеджера справочника «Номенклатура». А здесь видно кто и каким commit-ом добавил в справочник «Номенклатура» реквизит «Цена».

— Простота внедрения.
У вас много разработчиков в команде? Вы используете хранилище для разработки?
Ничего не меняйте, продолжайте использовать хранилище, но дополнительно организуйте выгрузку изменений в репозитории Git.

— Открытость.
Gitter является открытым инструментом. Вы всегда можете реализовать недобходимые для вас доработки.

Особенности текущей реализации

Особенностей сейчас на самом деле много, все и не осознать. Из очевидных мне:
— Проверка работоспособности под linux не производилась
— Не было попыток проверки работоспособности в клиент-серверном варианте с использованием регламентных заданий
— Работает только с версией 1С 8.3

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

Пошаговая инструкция

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

Заключение

Надеюсь, Gitter будет вам полезен.

Спасибо за внимание.

44 Comments

  1. nixel

    Уж коли пользуетесь гитом, позволю себе задать вопрос.

    Реально ли изменить одну и ту же, например, форму двумя разными разработчиками (без использования хранилища) и, используя только выгрузку в файлы, после обычного текстового мерджа загрузить из файла готовую форму с изменениями?

    Поясню — данные об объектах/формах/etc выгружаются в XML. Соответственно, когда два разработчика что-то меняют в форме, их измененные формы тоже выгружаются в XML. После push’а мы либо получим валидную XML, которую можем обратно свернуть в форму, либо полную кашу в случае, если 1с выгружает формы «каждый раз по-разному».

    Хочу глобально изучить вопрос перевода контроля версий и групповой разработки на git, но как-то постоянно не нахожу на это времени 🙂

    Reply ↓
  2. rtnm

    (1) nixel, Gitter никак не расчитан на использование без хранилища 1С. При использовании Gitter описанной проблемы быть не может.

    Отвечая на ваш вопрос могу сказать, что отказ от хранилища в пользу других систем версионирования, таких как git, это достаточно серьезный и сложный шаг. У меня нет такого опыта использования Git. В вашем примере, второй разработчик, который выполняет push, вначале будет обязан выполнить pull, при этом он может получить коллизию при объединении файлов форм, которую сам и должен будет разрешить. При условии что Git ничего не знает о форматах, таких например как xml, то я бы не стал исключать вероятности получения невалидного файла формы после объединения, хотя если посмотреть форматирование xml файла формы, который формирует платформа 1С, то кажется, что эта вероятность сведена к минимуму.

    Reply ↓
  3. pumbaE

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

    2. на маленьких конфигурациях этого не видно, но на больших, такие как упп, УТ11 вся конфигурация в одной папке, очень не удобно. При выгрузке не поддерживается того дерева, которое есть в том же конфигураторе. Очень долго искать простейшее «Документ.Реализация…. »

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

    p.s.: у меня как-то так организован процесс разработки redmine+git+1C , тоже использую синхронизацию хранилища с git.

    Reply ↓
  4. pumbaE

    (1) nixel, для модулей все без проблем, для всяких внутренних объектов, разработчику в случаи конфликта, необходимо собрать из исходников cf (тот cf который пришел из мастер ветки), объединить его со свое кофнигурацией, при этом объединять подглядывая в diff между ветками, где оставлять свой вариант, где чужой. Конфликты самому решать, для модулей подойдет штатное трехстороннее сравннеи, для форм, ролей как повезет.

    После этого разбирает получившийся cf в папку с merge и коммитит.

    Reply ↓
  5. rtnm

    (3) pumbaE,

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

    2. Полностью с вами согласен. Я не понимаю почему 1С реализовала выгрузку именно так, и я надеюсь что они это переделают. В принципе, после выгрузки файлов конфигурации в каталог репозитория их можно «перекидать» по каталогам. Мысль о такой доработке для Gitter у меня имеется.

    3. Да, такая особенность имеется. С ней я не собирался бороться. Хочется использовать только штатные средства.

    Reply ↓
  6. russinow

    век живи, век учись

    в упор не видел эту выгрузку в файлики пока не наткнулся на статью )))

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

    в общем спасибо за наводку )

    Reply ↓
  7. mikhailovaew
    Начиная с версии 1С 8.3 появилась возможность выгружать конфигурацию в набор файлов

    а в 8.2 пункт меню «Конфигурация — Выгрузить файлы конфигурации…» делает не то же самое?

    Reply ↓
  8. rtnm

    (7) mikhailovaew, нет, в 8.2 имелась возможность выгрузить только программные модули, справочную информацию и макеты, а в 8.3 в файлы выгружается вся конфигурация

    Reply ↓
  9. mikhailv

    Спасибо автору за разработку!

    Начали с использования git для внешних обработок + Redmine. Понравилось.

    Решили перетащить историю хранилища также в git, ибо скорость сравнения версий в хранилище не сопоставима с таковой в git. Также после выгрузки файлов конфигурации в git сравнение ролей и списков предопределенных доступно «из коробки» (xml). Плюс blame. Плюс авто-подкрепление коммитов к задаче в Redmine.

    Ваше решение подошло практически полностью. Что изменили:

    • Убрали папку «Конфигурация», в которую сгружались все файлы. В итоге папки/файлы располагаются сразу в корневой папке репозитория.
    • По мелочи: увеличили размер реквизита «Комментарий»; в коммит вставляется номер версии из хранилища; сделали подмену имени пользователя из хранилища в имя пользователя git.

    (3) pumbaE, п.2: решили выделением всего до первой точки в папку (Document, Catalog). Получилась структура, более-менее привычная. И Explorer/GitExtensions перестали тормозить от 10000+ файлов в одном каталоге. Если нужно, python-скрипт могу выслать.

    (3) pumbaE, п.3: распаковываем, извлекаем только модуль. Раньше еще «декомпилировали» обычные формы, но поняли, что то, что получается, смотреть тоже не ахти как удобно, да и не все аспекты декомпилируются. Кроме того, на некоторых формах платформа вываливалась в дамп (если интересно, тест для воспроизведения ошибки есть).

    Для распаковки большого количества форм написали обработку-обертку для обработки-декомпилятора, чтобы 1С запускалась 1 раз, а не столько, сколько форм/обработок нужно распаковать. Работает на порядок быстрее.

    В качестве обработки-декомпилятора и precommit-скриптов используем помеси Ваших (pumbaE, Infostart, GitHub), и этих наработок: PBazelyuk, Infostart BitBucket, за что Вам, Евгений, и Петру также отдельное спасибо.

    Reply ↓
  10. rtnm

    (9) mikhailv, пожалуйста!

    Reply ↓
  11. pumbaE

    (9) mikhailv, я в основном использую вот этот инструментарий https://github.com/xDrivenDevelopment/ .

    Для распаковки большого количества форм написали обработку-обертку для обработки-декомпилятора, чтобы 1С запускалась 1 раз, а не столько, сколько форм/обработок нужно распаковать. Работает на порядок быстрее.

    если есть возможность, прошу pull-request.

    Reply ↓
  12. bambr1975

    (9) mikhailv,

    на некоторых формах платформа вываливалась в дамп (если интересно, тест для воспроизведения ошибки есть).

    Вы последнюю версию V8Reader-а используете? Можете ссылку на форму, которая не декомпилируется прислать в личку?

    Reply ↓
  13. artbear

    Присоединюсь к (11) и (12)

    Ждем.

    Reply ↓
  14. Armando

    В соседней теме я как раз про такую штуку говорил http://infostart.ru/public/310640/

    А тут как говорится «Все уже украдено до нас»)

    Кажется я смогу сэкономить себе времени. Спасибо.

    Reply ↓
  15. artbear

    (14) Тут мало автоматизации, много кнопок нужно нажимать.

    Выгрузка в Гит должна быть автоматической и фоновой.

    Подобная фоновая выгрузка реализована в разных проектах.

    Например, у нас в https://github.com/xDrivenDevelopment/v83unpack

    Reply ↓
  16. Armando

    (15)

    Выгрузка в Гит должна быть автоматической и фоновой.

    Согласен. Мне так и надо.

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

    Reply ↓
  17. pumbaE

    (16) все течет, все меняется.

    Reply ↓
  18. ekaruk

    Интересная разработка.

    Спасибо.

    Работает вполне корректно.

    Пришлось подправить формат номера при получении версии из хранилища. Номер более 1000 передавался как 1 000. Думаю, не хватает еще регламентного задания. Чтобы настроить и больше не трогать.

    (9) mikhailv, Тоже увеличила ширину поля комментария и добавила номер версии.

    Структуру не трогали. В ней очень удобно ищутся данные поиском по Ctrl+F в Gif Extensions. С папками, возможно, будет хуже.

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

    diff —git a/Конфигурация/Catalog.Номенклатура.Form.ФормаЭлемента.Form b/Конфигурация/Catalog.Номенклатура.Form.ФормаЭлемента.Form
    index 83c2a4c..962f1a1 100644
    Binary files a/Конфигурация/Catalog.Номенклатура.Form.ФормаЭлемента.Form and b/Конфигурация/Catalog.Номенклатура.Form.ФормаЭлемента.Form differ

    Подскажите какое-то простое решение. Либо как распаковать перед соммитом, либо может есть какой-то вариант сравнения чем-то другим (использую kdiff3).

    Reply ↓
  19. pumbaE

    (18) ekaruk, вопрос в том, какие различия вы хотите получить.

    1. Если только модуль, тогда дополнительно используете v8unpack.exe для форм https://github.com/xDrivenDevelopment/v83unpack/blob/develop/src/oscript/un­pack.os#L1759

    2. Если хотите посмотреть различия форм, в виде иерархии, тогда вам необходимо для просмотра различий использовать другие инструменты, например v8reader.epf .

    Reply ↓
  20. ekaruk

    (19) pumbaE, cпасибо.

    Покопалась в Вашем ГитХабе. Остановилась на v8Reader.epr + diff-1c-cf.js.

    Правда, не разобралась, как подключить произвольную программу сравнения к GitExtensions.

    Пришлось параллельно поставить TortoiseGit.

    Обработки, формы, конфигурации сравнивает вполне корректно.

    upd. Разобралась с GitExtensions.

    По аналогии с http://infostart.ru/public/118207/ подключила DiffMerge

    Reply ↓
  21. artbear

    (20) Для подобного у нас используется целый проект v8diff https://github.com/xDrivenDevelopment/v8Diff , его базовая версия описана у Жени в http://infostart.ru/public/118207/

    Сам постоянно пользуюсь и для Гита, и для Фара, командной строки.

    Reply ↓
  22. artbear

    (20) Мы сейчас активно юзаем SourceTree (бесплатно, только нужно зарегистрироваться на сайте). Очень удобно.

    ЗЫ а у меня и SourceTree установлен, и TortoiseGit 🙂 Но SourceTree намного чаще

    Reply ↓
  23. artbear

    (20) ИМХО kdiff3 помощнее, чем DiffMerge

    Reply ↓
  24. ekaruk

    (23) artbear, kdiff3 мощнее, но я не нашла, как в нем настроить вызов 1С для просмотра форм из GifExtensions.

    TortoiseGit как-то меньше понравился.

    (21) artbear, Да, видела v8diff на ГитХабе. Собственно, из него и взяла diff-1c-cf.js

    Насколько я понимаю, v8diff это и есть v8reader + diff-1c-cf.js + ИР.

    Или он чем-то еще отличается? В чем смысл отдельного проекта, зачем ИР для сравнения?

    Reply ↓
  25. artbear

    (24) весь смысл v8diff и есть в связке v8reader + diff.js + ИБ_1С

    ИМХО ИР в ИБ не нужен, реально нужен простейший код конфигурации

    Я не понимаю, зачем ты юзаешь GifExtensions ? в чем прелесть/преимущество?

    ИМХО SourceTree и черепаха и Kdiff3 перекрывают практически все сценарии.

    У меня анализ/сравнение используется как для бинарника/epf через v8reader, так и напрямую для текстовых представлений модулей и форм, разобранных через проект precommit1C https://github.com/xDrivenDevelopment/precommit1C

    Поясни, что подразумевается под «настроить вызов 1С для просмотра форм из GifExtensions.» ?

    ЗЫ написал в личку, можно ускорить общение 🙂

    Reply ↓
  26. Redokov

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

    Reply ↓
  27. rtnm

    (26) Redokov, пожалуйста. Ссылку на репозиторий bitbucket я ненавязчиво указывал в пункте про открытость. По поводу pull request — Gitter так не работает, он выгружает только в одном направлении, из хранилища 1С в git репозиторий

    Reply ↓
  28. Elisy

    Вы не могли бы дать ссылку на пример выгрузки? Сейчас спрашивают про ваш инструмент в аналогичной статье http://habrahabr.ru/post/248303/

    Reply ↓
  29. rtnm

    (28) Elisy, Читал вчера вашу статью, у меня тоже возникало естественное желание раскидать все по папкам, я думаю что разработчики 1С придут к пониманию необходимости этого. В качестве примера можно посмотреть исходники Gitter — https://bitbucket.org/rtnm/gitter/src

    Reply ↓
  30. pumbaE

    (29) можете встроить обработку из (14) и у вас тоже будет раскидывать по папкам.

    Reply ↓
  31. rtnm

    (30) pumbaE, спасибо, буду иметь в виду

    Reply ↓
  32. cmd_vasec

    Добрый день.

    У меня возникла ошибка

    {ОбщийМодуль.Git.Модуль(81)}: Неизвестная ошибка при совершении комита(git commit -m «Добавить функционал, как в предварительном контакте» —date 2014-09-24T10:11:03)

    ВызватьИсключение ИсключениеОшибкаПриВыполненииКоманды(ОписаниеОшибки, ТекстКоманды);

    что не так?

    Reply ↓
  33. rtnm

    (32) cmd_vasec, проблема в том что ВыполнитьКоманду(«Путь/до/репозитория», «git commit -m «»Добавить функционал, как в предварительном контакте»» —date 2014-09-24T10:11:03″) возвращает ненулевое значение, а значит есть ошибка. Можно запустить туже самую команду в командной строке (cmd.exe) и всего скорее будет видно более внятное описание проблемы. Так же можно доработать само решение (gitter) — перенаправить вывод программы git из стандартного потока ввода-вывода в файл, тогда можно будет получать более внятное описание проблемы. Еще можно в описании ошибки указывать используемый ПутьДоРепозитория при запуске ВыполнитьКоманду — хуже не будет.

    Reply ↓
  34. cmd_vasec

    (33)

    Получил:

    On branch master

    nothing to commit (working directory clean)

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

    У меня первый коммит прошел, а второй нет.

    Т.о. получается, что первая версия хранилища равна второй, но это не так.

    Что делаю не так?

    Reply ↓
  35. rtnm

    (34) cmd_vasec, сложно понять где пошел сбой, нужно проанализировать, что именно прошло первым коммитом, посмотреть что именно сейчас находится в рабочем каталоге и какой версии хранилища соответствует, посмотреть на состояние записей справочника ВыгруженаВЛокальныйРепозиторий и в частности на флажок ВыгруженаВЛокальныйРепозиторий, возможно нужно этот флажок сбросить, чтобы еще раз попытаться выгрузить в рабочий каталог проблемную версию хранилища.

    Не исключаю, что каким-то образом первым коммитом ушла последняя версия хранилища. Какая версия платформы?

    Reply ↓
  36. cmd_vasec

    (35)

    Почему то выгрузилось последняя версия хранилища. Версия платформы 8.3.5.1482.

    Думаю, что не происходит обновление основной конфигурации конфигурацией из хранилища.

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

    Reply ↓
  37. cmd_vasec

    (35)

    Разобрался. Надо внимательно читать инструкцию. 🙂

    Reply ↓
  38. rtnm

    (37) cmd_vasec, вот и замечательно 🙂

    Reply ↓
  39. Artem-B

    В инструкции все скриншоты битые(

    Reply ↓
  40. rtnm

    (39) Исправлено

    Reply ↓
  41. cmd_vasec

    Сегодня столкнулся с ошибкой выгрузки хранилища с номером 1000. Автор так и не исправил это.

    В Общем модуле ПакетныйРежим в Процедуре ЗагрузитьКонфигурациюИзХанилища() строку

    ДобавитьВКомандуКлючЗначение(ТекстКоманды, «-v», НомерВерсии);

    заменил на

    ДобавитьВКомандуКлючЗначение(ТекстКоманды, «-v», СтрЗаменить(СокрЛП(НомерВерсии),Символы.НПП,»»));

    Reply ↓
  42. nicxxx

    (41)

    ДобавитьВКомандуКлючЗначение(ТекстКоманды, «-v», СтрЗаменить(СокрЛП(НомерВерсии),Символы.НПП,»»));

    Если это выполнить с английскими региональным установками, то СтрЗаменить не сработает, т.к. у них разделитель разрядов — запятая.

    Надо Формат(НомерВерсии, «ЧГ=»)

    Reply ↓
  43. Stepa86

    (41) (42) Можно использовать мою версию гиттера https://infostart.ru/public/583152/

    А можно взять Гиттер от 1С — ГитКонвертер https://github.com/1C-Company/GitConverter

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

    Но самым популярным проектом для выгрузки хранилище в гит сейчас является гитсинх https://github.com/oscript-library/gitsync

    Reply ↓
  44. milanse

    (43) На мой взгляд с конфой работать гораздо нагляднее и удобнее, если она заточена тупо на выгрузку в гит.

    Если используешь гитфлоу, то командная строка в виде gitsync рулит.

    1С гит конвертер попробовал, тоже работает, но создает мусор в виде транзитных конфигураций в списке баз, ну и я уже как-то привык к gitter-у, допилил под себя, запустил на сервере.

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *