Публикация конфигурации 1С на GitHub

23.02.15

Разработка - Инструментарий разработчика

Статья показывает, как можно подготовить конфигурацию 1С к публикации в системах версионирования, отличных от хранилища конфигурации 1C. В операции задействован .Net framework и C#, позволяющий аккуратно распределить проект 1С по папкам.
Пример публикации конфигурации на основе старых обновлений БСП четырехлетней давности (с 1.0.7.5 по 1.1.3.1) можно посмотреть по адресу https://github.com/elisy/ssl . Таким же образом теоретически можно публиковать конфигурации в другие системы версионирования.

Публикация конфигурации 1С на GitHub

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

Пример публикации конфигурации на основе старых обновлений БСП четырехлетней давности (с 1.0.7.5 по 1.1.3.1) можно посмотреть по адресу https://github.com/elisy/ssl . Таким же образом теоретически можно публиковать конфигурации в другие системы версионирования.

Этап 1: выгрузка конфигурации 1С 8.3 в файлы XML

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

Делается это через Конфигурация – Выгрузить конфигурацию в файлы… Нужно указать каталог и нажать ОК. Конфигурация будет выгружена в набор файлов xml, txt, html.

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

На этом можно было бы закончить подготовку конфигурации к публикации, но возникает одна проблема. Все файлы конфигурации будут находиться в одном каталоге. Например, для УТ 11.0.7 файлов будет около 10000 (десяти тысяч) размером примерно 430 Мбайт. Удобней было бы иметь эти файлы разложенными по каталогам, где каждая папка отвечает за файлы одного типа.

Разложить файлы по каталогам поможет специально написанная программа. В данном случае на C#.

Этап 2: распределение файлов XML по папкам

Суть помещения файлов по каталогам сводится к следующему: на основании имени файла, разложенного с разделителем «точка», получается его полный путь с тем же расширением. Так первое слово до точки определяет каталог типа объекта, следующее слово определяет каталог названия объекта внутри типа. И так далее – каждое слово за точкой – новый каталог.

Есть исключения: формы, макеты и помощь. К ним дополнительно в каталог переносится xml с определением формы/макета или помощи из родительского каталога. Подсистемы отличаются тем, что внутри подсистем есть определения подчиненных подсистем. Файлы, начинающиеся на «Configuration.» помещаются в корень.

Код по получению относительного пути будет следующим:

private string GetRelativePath(string id)
{
    var nameParts = Path.GetFileNameWithoutExtension(id).Split('.');
    string newPath = id;
    if (String.Compare(nameParts[0], "Configuration", true) == 0)
        //Configuration.ManagedApplicationModule.txt
        newPath = id;
    else if (nameParts.Length == 2)
        //AccumulationRegister.ВыручкаИСебестоимостьПродаж.xml
        newPath = Path.Combine(nameParts[0], nameParts[1], nameParts[1] + Path.GetExtension(id));
    else if (nameParts.Length == 4 && String.Compare(nameParts[0], "CommonPicture", true) == 0 && String.Compare(nameParts[2], "Picture", true) == 0 && String.Compare(nameParts[3], "Picture", true) == 0)
    {
        //CommonPicture.BCGВопросы.Picture.Picture.png
        newPath = Path.Combine(nameParts[0], nameParts[1], nameParts[3] + Path.GetExtension(id));
    }
    else if (nameParts.Length == 4 && String.Compare(nameParts[0], "CommonForm", true) == 0 && String.Compare(nameParts[2], "form", true) == 0 && String.Compare(nameParts[3], "module", true) == 0)
    {
        //CommonForm.АвтоматическийОбменСПодключаемымОборудованиемOffline.Form.Module.txt
        newPath = Path.Combine(nameParts[0], nameParts[1], nameParts[3] + Path.GetExtension(id));
    }
    else if (nameParts.Length == 4 && String.Compare(nameParts[2], "form", true) == 0)
    {
        //AccumulationRegister.ДенежныеСредстваБезналичные.Form.ФормаСписка.xml
        newPath = Path.Combine(nameParts[0], nameParts[1], nameParts[2], nameParts[3], nameParts[3] + Path.GetExtension(id));
    }
    else if (nameParts.Length == 6 && String.Compare(nameParts[4], "form", true) == 0 && String.Compare(nameParts[5], "module", true) == 0)
    {
        //Catalog.АвансовыйОтчетПрисоединенныеФайлы.Form.ФормаСписка.Form.Module.txt
        newPath = Path.Combine(nameParts[0], nameParts[1], nameParts[2], nameParts[3], nameParts[5] + Path.GetExtension(id));
    }
    else if (nameParts.Length == 4 && String.Compare(nameParts[2], "template", true) == 0)
    {
        //Catalog.Банки.Template.КлассификаторБанков.xml
        newPath = Path.Combine(nameParts[0], nameParts[1], nameParts[2], nameParts[3], nameParts[3] + Path.GetExtension(id));
    }
    else if (String.Compare(nameParts[nameParts.Length - 1], "help", true) == 0)
    {
        //AccumulationRegister.ТоварыПереданныеНаКомиссию.Help.xml
        //SettingsStorage.ХранилищеВариантовОтчетов.Form.ФормаЗагрузки.Help.xml
        //Subsystem.Маркетинг.Subsystem.МаркетинговыеМероприятия.Help.xml
        List<string> pathParts = new List<string>();
        pathParts.AddRange(nameParts.Take(nameParts.Length));
        pathParts.Add(nameParts[nameParts.Length - 1] + Path.GetExtension(id));
        newPath = Path.Combine(pathParts.ToArray());
    }
    else if (nameParts.Length > 3 && String.Compare(nameParts[nameParts.Length - 2], "Subsystem", true) == 0)
    {
        //Subsystem.Маркетинг.Subsystem.МаркетинговыеМероприятия.xml
        List<string> pathParts = new List<string>();
        pathParts.AddRange(nameParts.Take(nameParts.Length));
        pathParts.Add(nameParts[nameParts.Length - 1] + Path.GetExtension(id));
        newPath = Path.Combine(pathParts.ToArray());
    }
    else if (nameParts.Length > 2)
    {
        List<string> pathParts = new List<string>();
        pathParts.AddRange(nameParts.Take(nameParts.Length - 1));
        pathParts.Add(nameParts[nameParts.Length - 1] + Path.GetExtension(id));
        newPath = Path.Combine(pathParts.ToArray());
    }
    return newPath;
}
 
 

Копирование файла сопровождается проверкой на наличие каталога, куда он копируется (если каталога нет - создается) и проверкой наличия конечного файла (если файл есть – перед копированием удаляется).

string fullPath = Path.Combine(destinationDirectory, file.Path);
if (File.Exists(fullPath))
    File.Delete(fullPath);
string fullPathDirectory = Path.GetDirectoryName(fullPath);
if (!Directory.Exists(fullPathDirectory))
    Directory.CreateDirectory(fullPathDirectory);
File.Copy(Path.Combine(sourceDirectory, file.Id), fullPath);
Этап 3: публикация на GitHub

После регистрации на GitHub нужно создать репозитарий. В данном случае репозитарий называется ssl.

Для синхронизации локального каталога с сайтом GitHub нужно скачать Windows-клиент с веб-сайта github.com. После установки приложения запускается файл GitHub.exe.

Через настройки (плюс сверху слева приложения) локальный каталог необходимо связать с репозитарием. После этого запущенный клиент GitHub.exe начнет отслеживать изменения каталога автоматически. Выдаст добавленные или измененные файлы.

Отсылка изменений на сервер или получение измененных файлов выполняется через команду Sync – кнопка справа сверху приложения.

Выводы

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

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

Не смотря на кажущуюся привлекательность, только практика работы сможет доказать жизнеспособность методики. Хранилище 1С, не смотря на критику, худо-бедно работает годами. Какие сложности скрывает переход на другие системы версионирования можно только догадываться. Возможно, в версиях может быть неудобно отслеживать изменения XML файлов из-за специфики этого формата (см. макет).

.net framework xml выгрузка xml elisy .net bridge

См. также.

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    135381    744    391    

777

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

18000 руб.

06.10.2023    10683    25    6    

55

Инструментарий разработчика Программист Платформа 1С v8.3 Платные (руб)

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

5400 руб.

17.05.2024    7634    20    12    

51

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 руб.

10.11.2023    6611    18    2    

43

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

3600 руб.

14.01.2013    180819    1101    0    

873

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 руб.

07.10.2021    15705    3    12    

38

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    100749    241    97    

300

Инструментарий разработчика Перенос данных 1C Программист Платформа 1С v8.3 Платные (руб)

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

2400 руб.

24.09.2019    24227    17    15    

34
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. izidavld 111 24.02.15 00:14 Сейчас в теме
Вообще инструментария для методологии CI, работы с тем же github, а тем более применение unittest-ов в 1С сильно не хватает. Нашелся бы умелец... )
6. pumbaE 24.02.15 09:33 Сейчас в теме
(1) izidavld, про тестирование здесь http://infostart.ru/public/326820/ , http://infostart.ru/public/328695/
Для ci использую jenkins, можно teamcity, некоторые даже bamboo(но сложнее).
2. jobkostya1c_ERP 100 24.02.15 08:05 Сейчас в теме
Посмотрел реализацию альтернативного механизма. Так полагаю, "подсад" на разработчика? В чем получается практическое преимущество в отличие от стандартного механизма хранилища?
Если только большая надежность хранения данных (выгрузка текстов в XML пишут даже помогает увидеть глюки стандартного сравнения и объединения при обновлениях)?
Путешествовать по веб-каталогу еще затруднительнее. В конфигураторе то сразу видно где что и как?
Прикрепленные файлы:
3. minimajack 80 24.02.15 08:32 Сейчас в теме
(2) kostyaomsk, вы смотрите не туда
в гите смотреть сюда
12. Elisy 951 24.02.15 12:50 Сейчас в теме
(2) kostyaomsk,
В чем получается практическое преимущество в отличие от стандартного механизма хранилища?

Преимущества GitHub по сравнению с хранилищем конфигураций 1С: ветвления, встроенный багтрэккер, возможность ревизии и обсуждения кода, исправление кода в браузере, отчеты и графики, открытый API.
4. pumbaE 24.02.15 09:20 Сейчас в теме
1. Нет разбора толстых форм, которые не так просто раскладываются.
2. Нет сборки обратно, я поменял текст в файле модуля, как мне обратно загрузить это все в cf файл?
3. При загрузке обратно из исходников поведение и результат сборки отличаются от ручного варианта и автоматического.
4. Для макетов и сейчас нет никакой возможности нормально смержить результат, а для просмотра различий можно этот xml преобразовать в табличный документ и рассматривать различия с помощью стандартных средств 1с.
5. Для кириллицы необходимы специфичные настройки git.
6. В некоторых случаях длина пути для git не должна превышать 260 символов (в windows) - для длинных наименований метаданных это часто встречается.

Итого: Как концепт - плюс, реализация - минус(велосипед).
ya.Avoronov; ojiojiowka; jobkostya1c_ERP; +3 Ответить
5. jobkostya1c_ERP 100 24.02.15 09:30 Сейчас в теме
Посмотрел. Вижу структурированный каталог с описанием объектов 1С 8 на одной странице в *.txt и *.xml. В чем удобство? Только если это корпоративный стандарт работы. Видно, правда что все на одной странице и проще найти что-то в модулях, но зачем?!
7. pumbaE 24.02.15 09:39 Сейчас в теме
(5) kostyaomsk, все ради этого , и этого . Скорость сравнения значительно быстрее чем у хранилища, скорость сравнения 3х веток значительно лучше чем у 1с(у 1с даже нет сравнения 3х cf файлов(от вендора, вашего измененого, от вендора нового)), в git есть возможность частичного объединения (когда вы объединили 2 или 3 подиситемы, разрешели конфликты и вечером сохранили промежуточный результат), в 1с такого нет.
kote; jobkostya1c_ERP; +2 Ответить
8. jobkostya1c_ERP 100 24.02.15 09:44 Сейчас в теме
(7) pumbaE, может быть для таких специфических задач и нужны сторонние решения, но, чувствую этот самый "гит" платный?
9. minimajack 80 24.02.15 10:17 Сейчас в теме
(8) kostyaomsk, Git свободный продукт, распространяется бесплатно. Можно поднять свой приватный сервер.
Публичные популярные репозитории:
на гитхабе публичные бесплатные, приватные - платные
на битбакете бесплатные и публичные и приватные
10. awk 743 24.02.15 11:49 Сейчас в теме
(7) pumbaE, gradle скрипт для сборок-разборок. тебе должно понравиться.


// Очистить директории
task clean {
    delete 'src'
    mkdir 'src'
}

// Выгрузить конфигурацию в текстовые файлы
task dumpSrc(type:Exec) {
	workingDir './'
 	standardOutput = new ByteArrayOutputStream()
	args = ['DESIGNER', '/F"./db"', '/DumpConfigToFiles"./target"'];
	executable = 'C:/Program Files (x86)/1cv8/8.3.5.1443/bin/1cv8.exe'
	
 	ext.output = {
    	return standardOutput.toString()
  	}
}

// Запуск конфигуратора
task conf(type:Exec) {
	workingDir './'
 	standardOutput = new ByteArrayOutputStream()
	args = ['DESIGNER', '/F"./db"'];
	executable = 'C:/Program Files (x86)/1cv8/8.3.5.1443/bin/1cv8.exe'
	
 	ext.output = {
    	return standardOutput.toString()
  	}
}

// Загрузка конфигурации из исходников
task loadSrc(type:Exec) {
	workingDir './'
 	standardOutput = new ByteArrayOutputStream()
	args = ['DESIGNER', '/F"./db"', '/LoadConfigFromFiles"./target"'];
	executable = 'C:/Program Files (x86)/1cv8/8.3.5.1443/bin/1cv8.exe'
	
 	ext.output = {
    	return standardOutput.toString()
  	}
}

// Построить каталоги
task imp(type: Copy) {
    from 'target'
    into 'src'
    // Исключено из-за непонятных ошибок
    exclude '**/*.cf'
    rename { String fileName ->
        fileName = fileName.replace('.','/')
        if(fileName.toLowerCase().endsWith('txt')) {
        	fileName = fileName.replace('/txt','.oneC')
        } else { 
    		fileName = fileName.replaceAll('(/[^/]+)/([^/]+)$','$1/$1.$2')
    	}
    	fileName
    }

}
Показать
11. Elisy 951 24.02.15 12:43 Сейчас в теме
Кстати, впервые статью публиковал на Хабре. На нем можно найти много хороших и дельных комментариев
http://habrahabr.ru/post/248303/
13. Serg82 24.02.15 13:41 Сейчас в теме
Идея интересная. Теперь осталось написать open IDE для 1с с кучу плагинами. )
14. Elisy 951 24.02.15 15:09 Сейчас в теме
(13) Serg82,
Эта идея идет в комплекте ))), только за основу предлагается взять готовую IDE:
Миниконфигуратор 1С на Visual Studio
http://infostart.ru/public/324382/
15. awk 743 24.02.15 15:18 Сейчас в теме
(14) Есть другое предложение. Взять эклипс.
16. Elisy 951 24.02.15 15:29 Сейчас в теме
(15) awk,
Проект из (14) на уровне фантазий пока. Сейчас в нем нет привязки к конкретной IDE. На вход ему поступает C# csproj-проект. А сам проект не важно в какой IDE сформирован.
17. Serg82 03.03.15 06:53 Сейчас в теме
http://www.pcweek.ru/business/article/detail.php?ID=164640
«1С» большое внимание уделяет развитию отношений с независимыми разработчиками прикладных решения на базе своей платформы, и здесь важная роль отводится совершенствованию инструментальных средств. Как сообщил руководитель отделения разработки ПО фирмы «1С» Сергей Нуралиев, начата работа по созданию качественно новой версии средств разработки на базе открытой платформы Eclipse с возможностью использования Java-технологий.

Ждем Eclipse)
18. lustin 04.03.15 08:36 Сейчас в теме
(17) Serg82, около 2-ух месяцев до превью осталось. Вроде как.
19. Elisy 951 10.03.15 06:41 Сейчас в теме
Обработка Xml-выгрузки будет доступна здесь после модерации:
http://infostart.ru/public/335018/
Оставьте свое сообщение