Автоматизация формирования и актуализации ветки типовых релизов для Git-репозитория EDT

21.05.25

Разработка - EDT

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

1. Проблема

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

2. Решение

Для автоматизации процесса был разработан Jenkins-пайплайн, который берет на себя всю подготовку ветки типовых релизов в Git-репозитории.

 
 Код пайплайна (Jenkinsfile):

 

def nodeNameAgent = "ИмяСервера"
def nodeNamePost = "ИмяСервера"
def nodeNameSQL = "ИмяСервера"
def count = 0

def cf2EDT(String version, String Repository, String BranchName, String DestinyFormat, String vPlatform, String EDTversion, String SourceFolder, int releaseCount) {
    script {
        try {
            if (releaseCount == 1) {
                source_path = ""
            } else {
                source_path = readFile("$WORKSPACE\\source").trim()
                project_path = readFile("$WORKSPACE\\project").trim()
                if (DestinyFormat == "XML" && source_path.isEmpty()) {
                    source_path = "src\\cf\\"
                }
            }
            
            echo "Обрабатываем версию: ${version}" 
            
            // Подготовка
            bat encoding: 'UTF-8', script: """@echo off
                chcp 65001 > nul
                echo ---------------------------
                echo Подготавливаем ${releaseCount}й релиз...
                echo ---------------------------
                echo Исходные данные:
                echo версия платформы 1С: ${vPlatform}, версия EDT: ${EDTversion}
                echo Репозиторий: ${Repository}, ветка: ${BranchName}
                echo папка с релизами: ${SourceFolder}
                echo Обрабатываем версию: ${version}, формат исходников: ${DestinyFormat}
                rd /s /q "$WORKSPACE\\temp" > nul 2>&1 & md "$WORKSPACE\\temp" > nul 
                rd /s /q "$WORKSPACE\\db" > nul 2>&1 & md "$WORKSPACE\\db" > nul 
                rd /s /q "$WORKSPACE\\xml" > nul 2>&1 & md "$WORKSPACE\\xml" > nul 
                rd /s /q "$WORKSPACE\\ws" > nul 2>&1 & md "$WORKSPACE\\ws" > nul 
                if ${releaseCount} GTR 1 (
                    if "${source_path}"=="" exit 1
                    rd /s /q "$WORKSPACE\\${source_path}" > nul 2>&1 & md "$WORKSPACE\\${source_path}" > nul 
                    echo путь к исходникам: "$WORKSPACE\\${source_path}"
                ) 
            """    
            // sleep 5
            
            // Создаем временную базу
            bat encoding: 'UTF-8', script: """@echo off
                chcp 65001 > nul  
                echo -----------------------
                echo Создаем временную базу
                echo -----------------------
                set search_dir=${SourceFolder}\\${version}
                dir /s /b "%search_dir%" | findstr /i /e "1Cv8.cf" > temp_file.txt
                set /p CF_path=<temp_file.txt
                del /f /q temp_file.txt
                echo берем CF из: %CF_path%
                "%PROGRAMW6432%\\1cv8\\${vPlatform}\\bin\\ibcmd.exe" infobase create --data="$WORKSPACE\\temp" --db-path="$WORKSPACE\\db" --create-database --load="%CF_path%"
                if not ERRORLEVEL 0 (exit 1)
            """
            
            // Применяем изменения. иначе с поддержки база не снимется
            bat encoding: 'UTF-8', script: """@echo off
                chcp 65001 > nul
                echo -------------------------
                echo Сохраняем Конфигурацию...
                echo -------------------------
                echo [INFO] Обновление конфигурации базы данных...
                "%PROGRAMW6432%\\1cv8\\${vPlatform}\\bin\\ibcmd.exe" infobase config apply --data="$WORKSPACE\\temp" --db-path="$WORKSPACE\\db" --user="" --password="" --force > nul
                if not ERRORLEVEL 0 (exit 1)
                echo [INFO] Обновление конфигурации базы данных успешно завершено
            """
            
            // Снимаем базу с поддержки
            bat encoding: 'UTF-8', script: """@echo off
                chcp 65001 > nul
                echo -------------------------
                echo Снимаем базу с поддержки
                echo -------------------------
                "%PROGRAMW6432%\\1cv8\\${vPlatform}\\bin\\ibcmd.exe" infobase config support disable --data="$WORKSPACE\\temp" --db-path="$WORKSPACE\\db" --user="" --password="" --force
                if not ERRORLEVEL 0 (exit 1)
            """
            
            if (releaseCount == 1) {
            // Инициализируем или клонируем репозиторий
            bat encoding: 'UTF-8', script: """@echo off
                chcp 65001 > nul  
                echo -------------------------
                echo Проверяем репозиторий
                echo -------------------------
                echo [INFO] Проверяем существование репозитория: ${Repository}
                git ls-remote git@gitlab:1c/${Repository}.git > nul 2>&1
                if %ERRORLEVEL% == 0 (
                    echo [INFO] Репозиторий "${Repository}" существует. 
                    echo ----------------------
                    echo Клонируем репозиторий 
                    echo ----------------------
                    git clone git@gitlab:1c/${Repository}.git > nul 2>&1
                    robocopy "$WORKSPACE\\${Repository}" "$WORKSPACE" /MOVE /E /NFL /NDL /NJH /NJS
                    git checkout -B ${BranchName}
                ) else (
                    echo [INFO] Репозиторий "${Repository}" не найден.
                    echo -------------------------
                    echo Инициализируем репозиторий
                    echo -------------------------
                    git init
                    git branch -M ${BranchName}
                    echo . > .gitignore > nul
                    if "${DestinyFormat}"=="EDT" xcopy "\\\\%server%\\SHARE\\script\\edt_project\\*" "$WORKSPACE\\edt" /E /I /Y > nul
                )
                echo %ERRORLEVEL%
            """
            // определяем исходные папки
            if (DestinyFormat == "EDT") {
                config_name = "Configuration.mdo"  
                echo 'формат EDT'
            } else {
                config_name = "Configuration.xml"  
                echo 'формат XML'
            }
            
            bat encoding: 'UTF-8', script: """@echo off
                setlocal enabledelayedexpansion
                dir /s /b "$WORKSPACE" | findstr /i /e "${config_name}" > source
                set /p full_path=<source
                echo найден корень: %full_path%
                set base_path=$WORKSPACE\\
                set target_path=!full_path:%base_path%=!
                if "${DestinyFormat}"=="EDT" set "result=!target_path:\\Configuration\\${config_name}=!"
                if "${DestinyFormat}"=="XML" set "result=!target_path:\\${config_name}=!"
                echo %result% > source
                set target=%result%\\
                for /f "tokens=1 delims=\\ " %%A in ("%target%") do set "result=%%A"
                echo %result% > project
                endlocal
            """
            
                source_path = readFile("$WORKSPACE\\source").trim()
                project_path = readFile("$WORKSPACE\\project").trim()
                echo "путь к проекту: ${project_path}"
                echo "путь к исходникам: ${source_path}"
            }
            
            // Выгружаем исходники в xml
            bat encoding: 'UTF-8', script: """@echo off
                chcp 65001 > nul  
                echo -------------------------
                echo Выгружаем исходники в XML
                echo -------------------------
                "%PROGRAMW6432%\\1cv8\\${vPlatform}\\bin\\ibcmd.exe" infobase config export --data="$WORKSPACE\\temp" --db-path="$WORKSPACE\\db" --user="" --password="" --force "$WORKSPACE\\xml"
                if not ERRORLEVEL 0 (exit 1)
            """

            if (DestinyFormat == "EDT") {
            // Конвертируем XML в формат EDT
            bat encoding: 'UTF-8', script: """@echo off
                setlocal enabledelayedexpansion
                chcp 65001 > nul  
                echo -----------------------------
                echo Конвертируем XML в формат EDT
                echo -----------------------------
                set EDT_mask=%PROGRAMW6432%\\1C\\1CE\\components\\1c-edt-${EDTversion}*
                dir "%EDT_mask%" /B /AD > edt.txt
                set /p EDTCLI_dir=<edt.txt & del edt.txt > nul
                set EDTCLI_dir=%EDTCLI_dir: =%
                echo каталог EDT: "%EDTCLI_dir%"
                set EDTCLI_path=%PROGRAMW6432%\\1C\\1CE\\components\\%EDTCLI_dir% 
                rd /s /q "$WORKSPACE\\${source_path}"
                call "%EDTCLI_path%\\1cedtcli.exe" -data "$WORKSPACE\\ws" -command import --project "$WORKSPACE\\${project_path}" --configuration-files "$WORKSPACE\\xml" --version "%vPlatform%"
                if not ERRORLEVEL 0 (exit 1)
                echo [INFO] Конвертация в формат EDT - завершена
                rem echo [INFO] Оптимизация формата хранения данных проекта
                rem call "%EDTCLI_path%\\1cedtcli.exe" -data "$WORKSPACE\\ws" -command clean-up-source --project "$WORKSPACE\\edt"
                rem if not ERRORLEVEL 0 (
                rem     echo [ERROR] возникла ошибка при Оптимизации
                rem     endlocal
                rem     exit 1
                rem ) else (
                rem     echo [INFO] Оптимизация - завершена
                rem     endlocal
                rem )               
            """
            }            

            // Отправляем изменения в репозиторий
            bat encoding: 'UTF-8', script: """@echo off
                chcp 65001 > nul
                echo -------------------------
                echo Добавляем в репозиторий
                echo -------------------------
                echo Сохраняем релиз: "${version}" в ветку "${BranchName}"
                git add ${project_path}\\ 
                rem git add xml\\ 
                git commit -m "типовая ${version}" > nul
                git tag -a ${version} -m "${version}"
            """

        } catch (Exception e) {
            currentBuild.description = "Ошибка обработки версии ${version}"
            error("Произошла ошибка: ${e.message}")
        }
    }
}

pipeline {
    agent {
        label "${nodeNameAgent}"  
    }
    parameters {
        string(name: 'Репозиторий', defaultValue: 'MyRepos', description: '''Укажите репозиторий в Гитлаб, в него будет выгружен результат (если репозиторий отсутствует в Гитлаб, то он будет создан)''')
        string(name: 'Ветка', defaultValue: 'Vendor1C', description: '''Укажите ветку, в которую будут отправлены релизы (по умолчанию будет использована ветка  Vendor1C)''')
        choice(name: 'Формат', choices: ['EDT', 'XML'], description: '''Выберите формат, в который будут преобразованы исходники конфигурации базы 1С''')
        string(name: 'Платформа 1С', defaultValue: '8.3.25.1394', description: '''Укажите версию платформы 1С. Если указанная версия платформы не установлена на сервере – получим ошибку''')
        string(name: 'Версия EDT', defaultValue: '2024.2.3', description: '''Укажите версию EDT. Если указанная версия EDT не установлена на сервере – получим ошибку ''')
        string(name: 'Папка с релизами', defaultValue: '\\\\server\\Install\\1C\\Релизы\\83\\ERP Управление предприятием', description: Версия релиза должна совпадать с названием каталога, а внутри должен быть файл 1cv8.cf.''')
        text(name: 'Релизы', defaultValue: '2.5.20.75', description: '''Введите версии релизов 1С - через запятую или каждый релиз в новой строке.  (например: 8.3.20.75, 8.3.20.91, 8.3.20.101)''')
    }
    environment {
        fileserver = '192.168.ххх.ххх'
//        vPlatform = '8.3.25.1394'
//        EDTversion = '2024.2.3'
        YA_MESSENDGER = credentials('Y_Messenger_token')
    }
    stages {
        stage('Подготовка релиза') {
            steps {
                script {
                    def processedVersions = [] 
                    def versions = params["Релизы"].split(/[\s,]+/) 
                    versions = versions.findAll { it != null && !it.isEmpty() }
                    if (versions.size() == 0) {
                        currentBuild.description = "Ошибка: Список версий релизов пуст!"
                        error "Внимание: Список версий релизов пуст!"
                    }
                    bat encoding: 'UTF-8', script: """@echo off
                        chcp 65001 > nul
                        type \\\\%server%\\SHARE\\script\\devops
                        rd /s /q $WORKSPACE\\ > nul 2>&1
                        exit 0
                    """
                    for (version in versions) {
                        count++ 
                        cf2EDT(version.trim(), params["Репозиторий"], params["Ветка"], params["Формат"], params["Платформа 1С"], params["Версия EDT"], params["Папка с релизами"], count) 
                        processedVersions.add(version.trim()) 
                    }
                    currentBuild.description = "Обработанные версии: " + processedVersions.join(", ")
                }
            }
        }
        stage('Отправка репозитория в Gitlab') {
            steps {
                script {
                    bat encoding: 'UTF-8', script: """@echo off
                        chcp 65001
                        rem set git_name=EDT-update-%DATE:~0,2%%DATE:~3,2%%DATE:~6,4%
                        echo ---------------------------------
                        echo Отправка в удаленный репозиторий ${params.Репозиторий}
                        echo ---------------------------------
                        git ls-remote git@gitlab:1c/${Repository}.git > nul 2>&1
                        if %ERRORLEVEL% NEQ 0 (
                            git remote add origin git@gitlab:1c/${params.Репозиторий}.git
                        )
                        git remote -v
                        echo [INFO] отправка данных в репозиторий
                        rem git push --mirror origin // затираем репозиторий
                        git push --all origin
                        echo [INFO] данные в Gitlab отправлены
                    """
                }
            }
        }

    }
}

 

 Этот пайплайн включает в себя несколько ключевых этапов:

  • Использование скрипта cf2EDT: Все операции по подготовке исходных файлов конфигурации (например, создание временной базы, загрузка файлов .cf, выгрузка в XML) выполняются с помощью скрипта cf2EDT, который использует командную утилиту ibcmd.
  • Параметризация пайплайна: Пользователи задают параметры для пайплайна через интерфейс, при этом система автоматически проверяет корректность введенных данных и предупреждает о возможных ошибках (например, отсутствие версии платформы или EDT).
 
 Внешний вид веб-интерфейса для запуска пайплайна:

 

 

  • Конвертация файлов в формат EDT: Получаем из CF конфигурационные файлы, затем они конвертируются в формат EDT с помощью команды -import из командной строки EDT (1C:EDT CLI).
  • Автоматическая работа с Git: Если репозиторий с нужным именем отсутствует в GitLab, он создается автоматически, если существует, то изменения добавляются в ветку Vendor1C. Далее скрипт выгружает подготовленные файлы в удаленную ветку "Vendor1C", выполняя все необходимые Git-операции (add, commit, push).

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

3. Что получили

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

На скрине - пример результата работы пайплайна при подготовке ветки "Vendor1C" репозитория с версиями типовой конфигурации 1С:ERP Управление предприятием 2.5.20.75, 2.5.20.91, 2.5.20.101, 2.5.21.99,  2.5.21.106 и 2.5.21.111:

Плюсы от использования пайплайна:

  • Экономия времени: автоматизация процесса загрузки и подготовки типовых конфигураций позволила существенно сократить время на выполнение рутинных операций. Подготовка одного релиза конфигурации 1С:ERP УХ с помощью задания Jenkins занимает в 2,5 раза меньше времени, чем выполнение аналогичных операций вручную.
  • Уменьшение вероятности ошибок: исключение человеческого фактора при выполнении однотипных операций значительно снизило вероятность ошибок, которые могут происходить при ручной загрузке файлов.
  • Повышение эффективности работы специалистов: пайплайн берет на себя все задачи по подготовке и загрузке конфигураций, позволяя специалистам сосредоточиться на более сложных и требующих внимательности задачах, а не на рутинной подготовке веток.

 

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

Git EDT обновление конфигурация автоматизация devops

См. также

Тестирование QA DevOps и автоматизация разработки Программист Пользователь 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Платные (руб)

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Бухгалтерия предприятие 3.0 и версии КОРП: 3.0.178.26.

4800 руб.

20.01.2022    9942    36    1    

18

Тестирование QA DevOps и автоматизация разработки Программист 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Налоговый учет Платные (руб)

Готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарии возможно использовать как для vanessa-automation, так и для СППР. Поддерживаемые версии конфигураций ERP2 и КА2: 2.5.17.168.

2400 руб.

04.07.2022    10240    42    1    

33

DevOps и автоматизация разработки Тестирование QA Программист Пользователь 1С v8.3 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Зарплата и Управление Персоналом 3 и версии КОРП: 3.1.30.230.

3360 руб.

05.08.2024    3160    18    1    

12

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

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

04.08.2025    2010    ZigRinat85    3    

30

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

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

1 стартмани

29.07.2025    2317    2    gorsheninsn    6    

24

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

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

22.07.2025    4539    ktb    17    

34

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

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

14.07.2025    1294    bborisko    0    

8

DevOps и автоматизация разработки EDT Программист Бесплатно (free)

Цель статьи – показать, что DevOps можно внедрять в проектах любого масштаба, даже с ограниченными ресурсами. Автор делится личным опытом: рассказывает, как начиналось внедрение, какие ресурсы потребовались, какие задачи удалось решить и как организован текущий рабочий процесс. Вы узнаете, как DevOps-практики помогают участникам разработки и чем DevOps-инженеры полезны для всех, кто участвует в создании решений. В статье подробно разбираются преимущества, которые дал переход на EDT, его влияние на процессы сборки, а также анализируется опыт внедрения Kubernetes – что это уже принесло и что принесет в будущем.

11.07.2025    1371    ptica    0    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. unichkin 1609 21.05.25 19:35 Сейчас в теме
Жесть) Не представляю, как вы это все умудрились отладить, снимаю шляпу.
Если серьезнее - грув + бат в одном файле, без точки останова - довольно тяжкое наследство. Лучше вынести все из jenkins-файла на внешние скрипты - я все в итоге сделал через OneScript, см. скрин.
Прикрепленные файлы:
Viktor_Ermakov; +1 Ответить
2. user1857906 22.05.25 00:18 Сейчас в теме
(1) Согласен, что у каждого решения, могут быть разные подходы.
И каждый подход имеет право на жизнь.
Мне удобнее все держать под контролем в одном месте.
Если что-то надо добавить или подправить я открываю задание и корректирую.
Мне не удобно править скрипты в разных местах, имхо.

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

P.S. отладка много времени не заняла ))
Viktor_Ermakov; +1 Ответить
3. Viktor_Ermakov 377 22.05.25 09:09 Сейчас в теме
Спасибо за статью! Только предстоит этим заняться.

(1) Напишите тоже статейку как это сделали Вы, я тоже планировал OneScript юзать.
Оставьте свое сообщение