Автоматизация формирования и актуализации ветки типовых релизов для 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

См. также

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

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

3600 руб.

05.08.2024    4754    28    1    

17

DevOps и автоматизация разработки Логистика, склад и ТМЦ Системный администратор Программист Руководитель проекта 1С:Предприятие 8 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Подсистема «Управление сборкой GLI» предназначена для динамического формирования сборочных линий Gitlab и отслеживания процесса доработок систем на базе1С:Предприятия Позволяет упростить выпуск новых релизов системы, подготовить описание доработок системы. Интегрируется с GitLab API по событиям Push, Merge-request, Pipeline. Уведомляет пользователей о результатах сборки/тестирования сборочных конвейеров через СВ, либо при её недоступности или отсутствию по E-Mail. Поможет при отправке исправлений ошибок в общую базу тестирования, сформирует запросы на слияние в ветку версии только по протестированному и подтверждённому функционалу. Подсистема рассчитана исключительно на клиент - серверную архитектуру тестовых ИБ. Поддерживаемая версии СППР 2.0.4.15, платформа не ниже 8.3.17.1549, 2.0.7.3 / не ниже 8.3.21.1664, начиная с релиза 1.0.4.30 требуется платформа не ниже 8.3.23 рекомендуемый релиз 8.3.23.1997

10000 руб.

26.08.2022    15301    11    13    

37

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

Rundeck – это бесплатный и мощный оркестратор, «пульт управления», который помогает автоматизировать рутинные операции и внедрить DevOps/GitOps-подход в экосистеме 1С. Объясняем, как с его помощью упростить администрирование, отказаться от cron-скриптов и ручных SSH-подключений, централизовать управление серверами и снизить риски человеческого фактора. Показываем на практике примеры: как создать job, настроить workflow для закрытия месяца, установить платформу 1С через Jumphost и Ansible, а также запускать PowerShell-скрипты и Ansible-модули напрямую из Rundeck. Статья пригодится архитекторам, администраторам и DevOps-инженерам, которые стремятся превратить инфраструктуру 1С в управляемую, безопасную и полностью автоматизированную систему.

17.12.2025    2312    aidar_safin    0    

16

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

Как дать возможность каждому разработчику 1С вести разработку, тестирование и оптимизацию на собственной полноразмерной копии базы и при этом не тратить миллиарды рублей и тысячи часов на развертывание тестового окружения, а так же экономить дисковое пространство? Расскажем о том, как с помощью инструмента Database Lab получать полноразмерные копии базы 1C на СУБД PostgreSQL за считанные секунды (даже в случае использования многотерабайтных баз).

15.12.2025    5709    nasonkin    11    

26

Инструменты администратора БД Групповая разработка (Git, хранилище) Обновление 1С Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 2.х 1С:Библиотека стандартных подсистем Абонемент ($m)

Обработка, объединяющая в себе использование инструментов БСП по администрированию кластера серверов и запуска скриптов для автоматического обновления конфигурации из хранилища.

4 стартмани

17.11.2025    1382    6    KovrovtsevAS    0    

8

EDT Программист Стажер 1С:Предприятие 8 Россия Абонемент ($m)

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

2 стартмани

05.11.2025    5838    chuevsf    2    

9

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

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

08.10.2025    2567    komil4    12    

11

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

Вы собрали свой первый пайплайн на базе Gitlab CI? Поздравляю, вы молодец! Но что делать, когда количество проектов начинает расти? Как быть с проблемами окружения, долгим выполнением сборки и дополнительными трудозатратами по поддержке скриптов? Расскажем о подготовке образов для запуска заданий в контейнерах, оптимальных настройках gitlab-раннеров, приемах повышения скорости выполнения заданий при работе с EDT, использовании CI/CD components для дедупликации кода пайплайна и выпуске артефактов релизов, используя Gitlab Package Registry и Releases.

19.09.2025    2753    DAAbramov    5    

10
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. unichkin 1616 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 394 22.05.25 09:09 Сейчас в теме
Спасибо за статью! Только предстоит этим заняться.

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