1
0
mirror of https://github.com/1C-Company/GitConverter.git synced 2025-01-12 01:22:25 +02:00

Merge pull request #12 from 1C-Company/features/issue-11

Features/issue #11
This commit is contained in:
Dmitriy Marmyshev 2018-01-17 12:36:15 +03:00 committed by GitHub
commit bd642a0f37
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 2232 additions and 22 deletions

View File

@ -21,7 +21,7 @@
<defaultRoles>Role.АдминистраторСистемы</defaultRoles> <defaultRoles>Role.АдминистраторСистемы</defaultRoles>
<defaultRoles>Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок</defaultRoles> <defaultRoles>Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок</defaultRoles>
<vendor>Фирма &quot;1С&quot;</vendor> <vendor>Фирма &quot;1С&quot;</vendor>
<version>1.0.3.1</version> <version>1.0.4.1</version>
<updateCatalogAddress>http://downloads.v8.1c.ru/tmplts/</updateCatalogAddress> <updateCatalogAddress>http://downloads.v8.1c.ru/tmplts/</updateCatalogAddress>
<help> <help>
<pages> <pages>
@ -97,6 +97,7 @@
<enums>Enum.СостоянияВерсии</enums> <enums>Enum.СостоянияВерсии</enums>
<reports>Report.СкоростьКонвертации</reports> <reports>Report.СкоростьКонвертации</reports>
<dataProcessors>DataProcessor.РегламентныеИФоновыеЗадания</dataProcessors> <dataProcessors>DataProcessor.РегламентныеИФоновыеЗадания</dataProcessors>
<dataProcessors>DataProcessor.КонвертацияВФорматEDT</dataProcessors>
<informationRegisters>InformationRegister.ИнформацияПользователей</informationRegisters> <informationRegisters>InformationRegister.ИнформацияПользователей</informationRegisters>
<informationRegisters>InformationRegister.СостоянияВерсии</informationRegisters> <informationRegisters>InformationRegister.СостоянияВерсии</informationRegisters>
</mdclass:Configuration> </mdclass:Configuration>

View File

@ -0,0 +1,766 @@
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ОтключитьРегламентныеЗадания = Истина;
ОтключитьКоммиты = Истина;
ОтключитьОчереди = Истина;
email = "anonimous@localhost";
ИмяПользователя = "Anonimous";
Комментарий = НСтр("ru = 'Конвертация в формат EDT'");
КонецПроцедуры
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
МассивНеПроверяемыхРеквизитов = Новый Массив;
СегментыПути = СтрРазделить(СокрЛП(ПутьКФайламEDT), ПолучитьРазделительПути());
Если СегментыПути.Количество() > 0 И НЕ ЗначениеЗаполнено(СегментыПути[СегментыПути.ВГраница()]) Тогда
СегментыПути.Удалить(СегментыПути.ВГраница());
КонецЕсли;
Путь = Новый Файл(ПутьКФайламEDT);
Если СегментыПути.Количество() = 0 ИЛИ НЕ Путь.Существует() ИЛИ НЕ Путь.ЭтоКаталог() Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр("ru = 'Не верный путь к файлам EDT';");
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если СегментыПути.Количество() > 0 И СегментыПути[СегментыПути.ВГраница()] <> "src" Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр("ru = 'Необходимо указать каталог к исходным файлам src';");
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если НЕ Отказ И ЗначениеЗаполнено(Хранилище) Тогда
КаталогВыгрузкиВРепозитории = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Хранилище, "КаталогВыгрузкиВРепозитории");
СегментыПутиВРепозитории = СтрРазделить(СокрЛП(КаталогВыгрузкиВРепозитории), ПолучитьРазделительПути());
Если ЗначениеЗаполнено(КаталогВыгрузкиВРепозитории)
И СегментыПути.Количество() = 0 Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр("ru = 'Не корректный путь к каталога выгрузки в репозитории';");
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если НЕ Отказ И ЗначениеЗаполнено(КаталогВыгрузкиВРепозитории)
И СегментыПутиВРепозитории.Количество() > 0 И СегментыПути.Количество() > 2
И СегментыПути[СегментыПути.ВГраница()
- 1] <> СегментыПутиВРепозитории[СегментыПутиВРепозитории.ВГраница()] Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр("ru = 'Каталог проекта EDT не совпадает с каталогом выгрузки';");
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЕсли;
ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНеПроверяемыхРеквизитов);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура ХранилищеПриИзменении(Элемент)
ХранилищеПриИзмененииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ИмяФайлаКомандыGitОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если Не ЗначениеЗаполнено(ИмяФайлаКомандыGit) Тогда
Возврат;
КонецЕсли;
Текст = Новый ТекстовыйДокумент();
ИмяФайла = "";
ПрочитатьТекстовыйФайлНаСервере(ИмяФайлаКомандыGit, Текст, ИмяФайла, Истина);
Текст.Показать(ИмяФайла, ИмяФайла);
КонецПроцедуры
&НаКлиенте
Процедура ИмяФайлаКомментарияОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если Не ЗначениеЗаполнено(ИмяФайлаКомментария) Тогда
Возврат;
КонецЕсли;
Текст = Новый ТекстовыйДокумент();
ИмяФайла = "";
ПрочитатьТекстовыйФайлНаСервере(ИмяФайлаКомментария, Текст, ИмяФайла);
Текст.Показать(ИмяФайла, ИмяФайла);
КонецПроцедуры
&НаКлиенте
Процедура ИмяФайлаЛогаОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если Не ЗначениеЗаполнено(ИмяФайлаЛога) Тогда
Возврат;
КонецЕсли;
Текст = Новый ТекстовыйДокумент();
ИмяФайла = "";
ПрочитатьТекстовыйФайлНаСервере(ИмяФайлаЛога, Текст, ИмяФайла);
Текст.Показать(ИмяФайла, ИмяФайла);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура КонвертироватьВФорматEDT(Команда)
Если НЕ ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
КонвертироватьВФорматEDTНаСервере();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура КонвертироватьВФорматEDTНаСервере()
ОтключитьХранилище();
РеквизитыХранилища = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Хранилище, "КаталогВыгрузкиВерсий, ЛокальныйКаталогGit, КаталогВыгрузкиВРепозитории, АдресРепозиторияGit, ИмяВетки");
ПутьКИсходнымФайлам = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(РеквизитыХранилища.ЛокальныйКаталогGit);
ПутьКИсходнымФайлам = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьКИсходнымФайлам
+ КонвертацияХранилища.КаталогВыгрузкиВРепозитории(РеквизитыХранилища));
Файл = Новый Файл(ПутьКИсходнымФайлам);
Если Не Файл.Существует() Тогда
Возврат;
КонецЕсли;
СистемнаяИнформация = Новый СистемнаяИнформация;
ЭтоWindowsСервер = (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86
Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64);
СформироватьИменаФайлов(РеквизитыХранилища, ЭтоWindowsСервер);
ЗаписатьФайлыКонвертации(РеквизитыХранилища, ЭтоWindowsСервер);
ЗапуститьПриложение(?(ЭтоWindowsСервер, "", "bash ")
+ ИмяФайлаКомандыGit, РеквизитыХранилища.ЛокальныйКаталогGit, Истина);
КонецПроцедуры
// Формирует имена файлов для конвертации
//
// Параметры:
// КаталогВыгрузкиВерсий - Строка - Каталог выгрузки версий проекта
// ЭтоWindowsСервер - Булево - признак ОС Windows
&НаСервере
Процедура СформироватьИменаФайлов(КаталогВыгрузкиВерсий, ЭтоWindowsСервер)
ИмяФайлаЛога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогВыгрузкиВерсий)
+ "git_convert_to_edt_log" + ".txt";
ИмяФайлаКомандыGit = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогВыгрузкиВерсий)
+ "git_convert_to_edt" + ?(ЭтоWindowsСервер, ".bat", ".sh");
ИмяФайлаКомментария = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогВыгрузкиВерсий)
+ "git_convert_to_edt_comment" + ".txt";
КонецПроцедуры
&НаСервере
Процедура ХранилищеПриИзмененииНаСервере()
Если ЗначениеЗаполнено(Хранилище) Тогда
СистемнаяИнформация = Новый СистемнаяИнформация;
ЭтоWindowsСервер = (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86
Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64);
КаталогВыгрузкиВерсий = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Хранилище, "КаталогВыгрузкиВерсий");
СформироватьИменаФайлов(КаталогВыгрузкиВерсий, ЭтоWindowsСервер);
Иначе
ИмяФайлаКомандыGit = "";
ИмяФайлаКомментария = "";
ИмяФайлаЛога = "";
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОтключитьХранилище()
ХранилищеОбъект = Хранилище.ПолучитьОбъект();
Если ОтключитьКоммиты Тогда
ХранилищеОбъект.ВыполнятьКоммиты = Ложь;
КонецЕсли;
Если ОтключитьОчереди Тогда
ХранилищеОбъект.ОбрабатыватьВсеОчереди = Ложь;
ХранилищеОбъект.ЗапретитьИспользованиеОбщихОчередей = Истина;
КонецЕсли;
Если ОтключитьРегламентныеЗадания Тогда
ХранилищеОбъект.ДополнительныеСвойства.Вставить("Использование", Ложь);
КонецЕсли;
ХранилищеОбъект.Записать();
Если ОтключитьРегламентныеЗадания Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КопииХранилищКонфигурации.Ссылка
|ИЗ
| Справочник.КопииХранилищКонфигурации КАК КопииХранилищКонфигурации
|ГДЕ
| КопииХранилищКонфигурации.Владелец = &Хранилище
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ
| ОчередиВыполнения.Ссылка
|ИЗ
| Справочник.ОчередиВыполнения КАК ОчередиВыполнения
|ГДЕ
| ОчередиВыполнения.Хранилище = &Хранилище";
Запрос.УстановитьПараметр("Хранилище", Хранилище);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ЗаданиеОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
ЗаданиеОбъект.ДополнительныеСвойства.Вставить("Использование", Ложь);
ЗаданиеОбъект.Записать();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаписатьФайлыКонвертации(РеквизитыХранилища, ЭтоWindowsСервер)
ПутьКФайламEDT = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(СокрЛП(ПутьКФайламEDT));
ЛокальныйКаталогGit = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(РеквизитыХранилища.ЛокальныйКаталогGit);
ДлиннаПути = СтрДлина(ЛокальныйКаталогGit);
ПутьКИсходнымФайлам = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ЛокальныйКаталогGit
+ КонвертацияХранилища.КаталогВыгрузкиВРепозитории(РеквизитыХранилища));
Файл = Новый Файл(ПутьКИсходнымФайлам);
Если Не Файл.Существует() Тогда
Возврат;
КонецЕсли;
ФайлКоманды = Новый ТекстовыйДокумент;
Если ЭтоWindowsСервер Тогда
ТекстКоманды = "@ECHO OFF";
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
Иначе
ТекстКоманды = "#!/bin/bash";
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
КонецЕсли;
ТекстКоманды = ?(ЭтоWindowsСервер, "set ", "") + "LOGFILE=""%ФайлЛога%""";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%ФайлЛога%", ИмяФайлаЛога);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
Если ЭтоWindowsСервер Тогда
ТекстКомандыУстановкиКаталога = "cd /D ""%ЛокальныйКаталогGit%"" >> %LOGFILE%";
Иначе
ТекстКомандыУстановкиКаталога = "cd ""%ЛокальныйКаталогGit%"" >> %LOGFILE%";
КонецЕсли;
ТекстКомандыУстановкиКаталога = СтрЗаменить(ТекстКомандыУстановкиКаталога, "%ЛокальныйКаталогGit%",
РеквизитыХранилища.ЛокальныйКаталогGit);
ФайлКоманды.ДобавитьСтроку(ТекстКомандыУстановкиКаталога);
Если ВыполнитьPushПослеКонвертации И ЗначениеЗаполнено(РеквизитыХранилища.АдресРепозиторияGit) Тогда
ТекстКоманды = "git pull >> %LOGFILE%";
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
КонецЕсли;
Переименования = Новый ТаблицаЗначений();
Переименования.Колонки.Добавить("Источник");
Переименования.Колонки.Добавить("Приемник");
РазделительПути = ПолучитьРазделительПути();
ШаблонExt = РазделительПути + "Ext" + РазделительПути;
// Перемещение файлов корня конфигурации
ПутьПоиска = ПутьКИсходнымФайлам + "Ext" + РазделительПути;
Файлы = НайтиФайлы(ПутьПоиска, "*", Истина);
Для Каждого Файл Из Файлы Цикл
Если Файл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
Источник = Сред(Файл.ПолноеИмя, ДлиннаПути);
Приемник = СтрЗаменить(Источник, ШаблонExt, РазделительПути + "Configuration" + РазделительПути);
Если Файл.Имя = "ClientApplicationInterface.xml" Тогда
Приемник = СтрЗаменить(Приемник, "ClientApplicationInterface.xml", "ClientApplicationInterface.cai");
ИначеЕсли Файл.Имя = "CommandInterface.xml" Тогда
Приемник = СтрЗаменить(Приемник, "CommandInterface.xml", "CommandInterface.cmi");
ИначеЕсли Файл.Имя = "HomePageWorkArea.xml" Тогда
Приемник = СтрЗаменить(Приемник, "HomePageWorkArea.xml", "HomePageWorkArea.hpwa");
ИначеЕсли Файл.Имя = "MainSectionCommandInterface.xml" Тогда
Приемник = СтрЗаменить(Приемник, "MainSectionCommandInterface.xml", "MainSectionCommandInterface.cmi");
ИначеЕсли Файл.Имя = "Picture.png" И (СтрНайти(Приемник, "MainSectionPicture") > 0 ИЛИ СтрНайти(Приемник, "Splash") > 0) Тогда
Приемник = СтрЗаменить(Приемник, РазделительПути + "Picture", "");
КонецЕсли;
НоваяСтрока = Переименования.Добавить();
НоваяСтрока.Источник = Источник;
НоваяСтрока.Приемник = Приемник;
КонецЦикла;
Файл = Новый Файл(ПутьКИсходнымФайлам + "Configuration.xml");
Если Файл.Существует() Тогда
НоваяСтрока = Переименования.Добавить();
НоваяСтрока.Источник = Сред(Файл.ПолноеИмя, ДлиннаПути);
НоваяСтрока.Приемник = СтрЗаменить(НоваяСтрока.Источник, "Configuration.xml", "Configuration" + РазделительПути + "Configuration.mdo");
КонецЕсли;
СоответствиеТиповМакетов = СоответствиеТиповМакетов();
// Перемещение всех поддерживаемых типов
Для Каждого Контейнер Из ПоддерживаемыеКонтейнеры() Цикл
ПутьПоиска = ПутьКИсходнымФайлам + Контейнер + РазделительПути;
Файлы = НайтиФайлы(ПутьПоиска, "*", Истина);
Для Каждого Файл Из Файлы Цикл
Если Файл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
Источник = Сред(Файл.ПолноеИмя, ДлиннаПути);
Приемник = СтрЗаменить(Источник, ШаблонExt, РазделительПути);
Если Файл.Имя = "Form.xml" Тогда
Приемник = СтрЗаменить(Приемник, Файл.Имя, "Form.form");
ИначеЕсли Файл.Имя = "Module.bsl" И СтрНайти(Приемник, РазделительПути + "Form" + РазделительПути + Файл.Имя) > 0 Тогда
Приемник = СтрЗаменить(Приемник, РазделительПути + "Form" + РазделительПути + Файл.Имя, РазделительПути + Файл.Имя);
ИначеЕсли Файл.Имя = "Template.xml" Тогда
ИмяФайлаМакета = Файл.ПолноеИмя;
СегментыИмени = СтрРазделить(ИмяФайлаМакета, РазделительПути);
Если СегментыИмени.Количество() > 3 Тогда
СегментыИмени.Удалить(СегментыИмени.ВГраница()); // Имя файла Template.xml
СегментыИмени.Удалить(СегментыИмени.ВГраница()); // Каталог Ext
ИмяФайлаМакета = СтрСоединить(СегментыИмени, РазделительПути) + ".xml";
ТипМакета = ПрочитатьТипМакета(ИмяФайлаМакета);
Расширение = "";
Если ЗначениеЗаполнено(ТипМакета) И СоответствиеТиповМакетов.Свойство(ТипМакета, Расширение) Тогда
Приемник = СтрЗаменить(Приемник, Файл.Имя, "Template." + Расширение);
КонецЕсли;
КонецЕсли;
ИначеЕсли Файл.Имя = "Package.bin" И Контейнер = "XDTOPackages" Тогда
Приемник = СтрЗаменить(Приемник, Файл.Имя, "Package.xdto");
ИначеЕсли Файл.Имя = "WSDefinition.xml" И Контейнер = "WSReferences" Тогда
Приемник = СтрЗаменить(Приемник, Файл.Имя, "WsDefinitions.wsdl");
ИначеЕсли Файл.Имя = "Flowchart.xml" И Контейнер = "BusinessProcesses" Тогда
Приемник = СтрЗаменить(Приемник, Файл.Имя, "Flowchart.scheme");
ИначеЕсли Файл.Имя = "Rights.xml" И Контейнер = "Roles" Тогда
Приемник = СтрЗаменить(Приемник, Файл.Имя, "Rights.rights");
ИначеЕсли Файл.Расширение = ".xml" И Файл.ПолноеИмя = ПутьПоиска + Файл.Имя Тогда
Приемник = СтрЗаменить(Приемник, Файл.Имя, Файл.ИмяБезРасширения + РазделительПути + Файл.ИмяБезРасширения + ".mdo");
ИначеЕсли Файл.ИмяБезРасширения = "Picture" И Контейнер = "CommonPictures"
И СтрНайти(Приемник, РазделительПути + Файл.ИмяБезРасширения + РазделительПути + Файл.ИмяБезРасширения) > 0 Тогда
Приемник = СтрЗаменить(Приемник, РазделительПути + Файл.ИмяБезРасширения + РазделительПути + Файл.ИмяБезРасширения, РазделительПути + Файл.ИмяБезРасширения + "." + Файл.ИмяБезРасширения);
ИначеЕсли Файл.Имя = "Schedule.xml" И Контейнер = "ScheduledJobs" Тогда
Приемник = СтрЗаменить(Приемник, Файл.Имя, "Schedule.schedule");
КонецЕсли;
Если Источник <> Приемник Тогда
НоваяСтрока = Переименования.Добавить();
НоваяСтрока.Источник = Источник;
НоваяСтрока.Приемник = Приемник;
КонецЕсли;
КонецЦикла;
КонецЦикла;
// Перемещение подсистем
ПутьПоиска = ПутьКИсходнымФайлам + "Subsystems" + РазделительПути;
Файлы = НайтиФайлы(ПутьПоиска, "*", Истина);
Для Каждого Файл Из Файлы Цикл
Если Файл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
Источник = Сред(Файл.ПолноеИмя, ДлиннаПути);
Приемник = СтрЗаменить(Источник, ШаблонExt, РазделительПути);
Если Файл.Расширение = ".xml" И Файл.Имя <> "CommandInterface.xml" И Файл.Имя <> "Help.xml" Тогда
Приемник = СтрЗаменить(Приемник, Файл.Имя, Файл.ИмяБезРасширения + РазделительПути + Файл.ИмяБезРасширения + ".mdo");
ИначеЕсли Файл.Имя = "CommandInterface.xml" Тогда
Приемник = СтрЗаменить(Приемник, "CommandInterface.xml", "CommandInterface.cmi");
КонецЕсли;
Если Источник <> Приемник Тогда
НоваяСтрока = Переименования.Добавить();
НоваяСтрока.Источник = Источник;
НоваяСтрока.Приемник = Приемник;
КонецЕсли;
КонецЦикла;
// Перемещение неподдерживаемых метаданных в директорию unknown
ШаблонSRC = РазделительПути + "src" + РазделительПути;
ЗаменаSRC = РазделительПути + "unknown" + РазделительПути;
Для Каждого Контейнер Из НеПоддерживаемыеКонтейнеры() Цикл
ПутьПоиска = ПутьКИсходнымФайлам + Контейнер + РазделительПути;
Файлы = НайтиФайлы(ПутьПоиска, "*", Истина);
Для Каждого Файл Из Файлы Цикл
Если Файл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
Источник = Сред(Файл.ПолноеИмя, ДлиннаПути);
Приемник = СтрЗаменить(Источник, ШаблонSRC, ЗаменаSRC);
Если Источник <> Приемник Тогда
НоваяСтрока = Переименования.Добавить();
НоваяСтрока.Источник = Источник;
НоваяСтрока.Приемник = Приемник;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Каталоги = Новый Соответствие();
Для Каждого Переименование Из Переименования Цикл
ТекстКоманды = "git mv -f "".%Источник%"" "".%Приемник%"" >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Источник%", Переименование.Источник);
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Приемник%", Переименование.Приемник);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
Сегменты = СтрРазделить(Переименование.Приемник, РазделительПути);
Если Сегменты.Количество() > 2 Тогда
Сегменты.Удалить(Сегменты.ВГраница());
Каталоги.Вставить(СтрСоединить(Сегменты, РазделительПути), Сегменты);
КонецЕсли;
КонецЦикла;
// Создать все отсутствующие директории в src
Для Каждого КлючИЗначение Из Каталоги Цикл
Каталог = Новый Файл(ЛокальныйКаталогGit + КлючИЗначение.Ключ);
Если НЕ Каталог.Существует() Тогда
СоздатьКаталогиРекурсивно(ЛокальныйКаталогGit, КлючИЗначение.Значение, РазделительПути);
КонецЕсли;
КонецЦикла;
ТекстКоманды = "git commit -F ""%ИмяФайлаКомментария%"" --allow-empty-message --cleanup=verbatim >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%ИмяФайлаКомментария%", ИмяФайлаКомментария);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
// Удаляем исходную директорию src и копируем все файлы из EDT
Если ЭтоWindowsСервер Тогда
ТекстКоманды = "rmdir /S /Q ""%Приемник%"" >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Приемник%", ПутьКИсходнымФайлам);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ТекстКоманды = "mkdir ""%Приемник%"" >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Приемник%", ПутьКИсходнымФайлам);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
Источник = СокрЛП(ПутьКФайламEDT);
Если Прав(Источник, 1) = ПолучитьРазделительПути() Тогда
Источник = Лев(Источник, СтрДлина(Источник) - 1);
КонецЕсли;
Приемник = СокрЛП(ПутьКИсходнымФайлам);
Если Прав(Приемник, 1) = ПолучитьРазделительПути() Тогда
Приемник = Лев(Приемник, СтрДлина(Приемник) - 1);
КонецЕсли;
ТекстКоманды = "robocopy ""%Источник%"" ""%Приемник%"" /E /NFL /NDL /NJH /NJS /NC /NS /NP >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Источник%", Источник);
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Приемник%", Приемник);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
Иначе
ТекстКоманды = "rm -rf ""%Приемник%"" >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Приемник%", ПутьКИсходнымФайлам);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ТекстКоманды = "cp -Rf ""%Источник%"" ""%Приемник%"" >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Источник%", ПутьКФайламEDT);
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Приемник%", ПутьКИсходнымФайлам);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
КонецЕсли;
// Копирование файла проекта, DT-INF и настроек
Если ЗначениеЗаполнено(РеквизитыХранилища.КаталогВыгрузкиВРепозитории) Тогда
ПутьКПроектуEDT = СтрЗаменить(ПутьКФайламEDT, ШаблонSRC, РазделительПути);
ПутьКПроекту = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(РеквизитыХранилища.ЛокальныйКаталогGit);
ПутьКПроекту = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьКПроекту
+ РеквизитыХранилища.КаталогВыгрузкиВРепозитории);
Если ЭтоWindowsСервер Тогда
ТекстКоманды = "copy /Y ""%Источник%"" ""%Приемник%"" >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Источник%", ПутьКПроектуEDT + ".project");
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Приемник%", ПутьКПроекту + ".project");
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ТекстКоманды = "robocopy ""%Источник%"" ""%Приемник%"" /E /NFL /NDL /NJH /NJS /NC /NS /NP >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Источник%", ПутьКПроектуEDT + ".settings");
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Приемник%", ПутьКПроекту + ".settings");
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ТекстКоманды = "robocopy ""%Источник%"" ""%Приемник%"" /E /NFL /NDL /NJH /NJS /NC /NS /NP >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Источник%", ПутьКПроектуEDT + "DT-INF");
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Приемник%", ПутьКПроекту + "DT-INF");
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
Иначе
ТекстКоманды = "cp -f ""%Источник%"" ""%Приемник%"" >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Источник%", ПутьКПроектуEDT + ".project");
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Приемник%", ПутьКПроекту + ".project");
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ТекстКоманды = "cp -Rf ""%Источник%"" ""%Приемник%"" >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Источник%", ПутьКПроектуEDT + ".settings" + РазделительПути);
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Приемник%", ПутьКПроекту + ".settings" + РазделительПути);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ТекстКоманды = "cp -Rf ""%Источник%"" ""%Приемник%"" >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Источник%", ПутьКПроектуEDT + "DT-INF" + РазделительПути);
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%Приемник%", ПутьКПроекту + "DT-INF" + РазделительПути);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
КонецЕсли;
КонецЕсли;
// Все файлы новой версии добавляем в индекс
ТекстКоманды = "git add --all ./ >> %LOGFILE%";
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ТекстКоманды = "git commit -F ""%ИмяФайлаКомментария%"" --allow-empty-message --cleanup=verbatim >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%ИмяФайлаКомментария%", ИмяФайлаКомментария);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ФайлКомментария = Новый ТекстовыйДокумент;
ФайлКомментария.УстановитьТекст(Комментарий);
ФайлКомментария.Записать(ИмяФайлаКомментария, КодировкаТекста.UTF8);
// Выполнение регламентных действий с репозиторием, если необходимо
ТекстКоманды = "git gc --auto >> %LOGFILE%";
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
Если ВыполнитьPushПослеКонвертации И ЗначениеЗаполнено(РеквизитыХранилища.АдресРепозиторияGit) Тогда
ТекстКоманды = "git push -u origin %ИмяВетки% >> %LOGFILE%";
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%ИмяВетки%", РеквизитыХранилища.ИмяВетки);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
КонецЕсли;
Если НЕ ЭтоWindowsСервер Тогда
ТекстКоманды = ФайлКоманды.ПолучитьТекст();
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%LOGFILE%", "$LOGFILE");
ФайлКоманды.УстановитьТекст(ТекстКоманды);
КонецЕсли;
Если ЭтоWindowsСервер Тогда
ФайлКоманды.Записать(ИмяФайлаКомандыGit, КодировкаТекста.OEM);
Иначе
ФайлКоманды.Записать(ИмяФайлаКомандыGit, КодировкаТекста.Системная);
КонецЕсли;
КонецПроцедуры
// Создание отсутствующих каталогов рекурсивно
//
// Параметры:
// ЛокальныйКаталогGit - Начальный каталог проверки
// Сегменты - Массив - Сегменты пути в репозитории
// РазделительПути - Строка - Разделитель пути
&НаСервере
Процедура СоздатьКаталогиРекурсивно(ЛокальныйКаталогGit, Сегменты, РазделительПути)
Путь = ЛокальныйКаталогGit;
Для Каждого Сегмент Из Сегменты Цикл
Если НЕ ЗначениеЗаполнено(Сегмент) Тогда
Продолжить;
КонецЕсли;
Путь = Путь + Сегмент + РазделительПути;
Каталог = Новый Файл(Путь);
Если НЕ Каталог.Существует() Тогда
СоздатьКаталог(Путь);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Состав поддерживаемых контейнеров конфигурации
//
// Параметры:
// Возвращаемое значение:
// Массив - список контейнеров
&НаСервере
Функция ПоддерживаемыеКонтейнеры()
Состав = Новый Массив;
Состав.Добавить("AccountingRegisters");
Состав.Добавить("AccumulationRegisters");
Состав.Добавить("CalculationRegisters");
Состав.Добавить("BusinessProcesses");
Состав.Добавить("Catalogs");
Состав.Добавить("ChartsOfAccounts");
Состав.Добавить("ChartsOfCalculationTypes");
Состав.Добавить("ChartsOfCharacteristicTypes");
Состав.Добавить("CommandGroups");
Состав.Добавить("CommonAttributes");
Состав.Добавить("CommonCommands");
Состав.Добавить("CommonForms");
Состав.Добавить("CommonModules");
Состав.Добавить("CommonPictures");
Состав.Добавить("CommonTemplates");
Состав.Добавить("Constants");
Состав.Добавить("DataProcessors");
Состав.Добавить("DefinedTypes");
Состав.Добавить("DocumentJournals");
Состав.Добавить("DocumentNumerators");
Состав.Добавить("Documents");
Состав.Добавить("Enums");
Состав.Добавить("EventSubscriptions");
Состав.Добавить("ExchangePlans");
Состав.Добавить("FilterCriteria");
Состав.Добавить("FunctionalOptions");
Состав.Добавить("FunctionalOptionsParameters");
Состав.Добавить("HTTPServices");
Состав.Добавить("InformationRegisters");
//Состав.Добавить("Languages"); // Перемещается в Configuration.mdo
Состав.Добавить("Reports");
Состав.Добавить("Roles");
Состав.Добавить("ScheduledJobs");
Состав.Добавить("SessionParameters");
Состав.Добавить("SettingsStorages");
Состав.Добавить("Sequences");
Состав.Добавить("StyleItems");
//Состав.Добавить("Subsystems"); // Обрабатывается отдельно
Состав.Добавить("Tasks");
Состав.Добавить("XDTOPackages");
Состав.Добавить("WSReferences");
Состав.Добавить("WebServices");
Возврат Состав;
КонецФункции
// Состав не поддерживаемых контейнеров конфигурации
//
// Возвращаемое значение:
// Массив - список контейнеров
&НаСервере
Функция НеПоддерживаемыеКонтейнеры()
Состав = Новый Массив;
Состав.Добавить("ExternalDataSources");
Состав.Добавить("Interfaces");
Состав.Добавить("Styles");
Возврат Состав;
КонецФункции
// Соответствие типов макетов и расширений файлов Template.*
//
// Возвращаемое значение:
// Структура - Соответствие типов и расширений
&НаСервере
Функция СоответствиеТиповМакетов()
Соответствие = Новый Структура;
Соответствие.Вставить("BinaryData", "bin");
Соответствие.Вставить("SpreadsheetDocument", "mxlx");
Соответствие.Вставить("DataCompositionSchema", "dcs");
Соответствие.Вставить("FileAwareTextDocument", "txt");
Соответствие.Вставить("HtmlDocument", "htmldoc");
Соответствие.Вставить("AddIn", "addin");
Соответствие.Вставить("GraphicalScheme", "scheme");
Соответствие.Вставить("GraphicalSchema", "scheme");
Соответствие.Вставить("ActiveDocument", "axdt");
Соответствие.Вставить("GeographicalSchema", "geos");
Соответствие.Вставить("DataCompositionAppearanceTemplate", "dcsat");
Возврат Соответствие;
КонецФункции
&НаСервере
Функция ПрочитатьТипМакета(ИмяФайлаМакета)
Файл = Новый Файл(ИмяФайлаМакета);
Если НЕ Файл.Существует() Тогда
Возврат Неопределено;
КонецЕсли;
ТипМакета = Неопределено;
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.ОткрытьФайл(ИмяФайлаМакета);
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.Имя = "TemplateType" Тогда
ЧтениеXML.Прочитать();
Если ЧтениеXML.ИмеетЗначение Тогда
ТипМакета = ЧтениеXML.Значение;
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Возврат ТипМакета;
КонецФункции
&НаСервереБезКонтекста
Процедура ПрочитатьТекстовыйФайлНаСервере(ПутьКФайлу, Текст, ИмяФайла, КодировкаСистемы = Ложь)
Файл = новый Файл(ПутьКФайлу);
ИмяФайла = Файл.Имя;
Если Файл.Существует() Тогда
Если КодировкаСистемы Тогда
СистемнаяИнформация = Новый СистемнаяИнформация;
ЭтоWindowsСервер = (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86
Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64);
Если ЭтоWindowsСервер Тогда
Текст.Прочитать(ПутьКФайлу, КодировкаТекста.OEM);
Иначе
Текст.Прочитать(ПутьКФайлу, КодировкаТекста.Системная);
КонецЕсли;
Иначе
Текст.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:DataProcessor xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="67e0b965-0c45-4581-92a0-c0a62357865a">
<producedTypes>
<objectType typeId="fbf85225-badf-4b91-b973-09794d91fafb" valueTypeId="a9789f99-a162-414b-8eec-7ad36832b1d3"/>
<managerType typeId="49ea87d8-a728-424e-b7f9-a54660829a7e" valueTypeId="0993d3aa-ff8b-4411-8f8b-39a24139f7ac"/>
</producedTypes>
<name>КонвертацияВФорматEDT</name>
<synonym>
<key>ru</key>
<value>Конвертация в формат EDT</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
<defaultForm>DataProcessor.КонвертацияВФорматEDT.Form.Форма</defaultForm>
<forms uuid="9a2e455c-19d1-4220-a93a-e3cc78e9abe3">
<name>Форма</name>
<synonym>
<key>ru</key>
<value>Форма</value>
</synonym>
<usePurposes>PersonalComputer</usePurposes>
<usePurposes>MobileDevice</usePurposes>
</forms>
</mdclass:DataProcessor>

177
README.md
View File

@ -1,24 +1,28 @@
# 1С:ГитКонвертер # 1С:ГитКонвертер
Конфигурация 1С, односторонняя синхронизация хранилища конфигураций 1С в репозиторий Git. Конфигурация предназначена для односторонней синхронизации хранилища конфигурации "1С:Предприятия" с репозиторием Git и последующим переходом на разработку в [1C:Enterprise Development Tools (1C:EDT)](http://v8.1c.ru/overview/release_EDT_17/) с сохранением истории.
Корректное переименование истории объектов метаданных при переименовании их в хранилище 1С по UUID'дам. Корректное переименование истории объектов метаданных при переименовании их в хранилище конфигураций "1С:Предприятия" по UUID'дам.
Git отслеживает контент файлов, а не пути файлов. В случае с выгрузкой 1С конфигурации - в ней присутствует множество файлов, очень похожих по контенту и именам (например `ФормаСписка.xml`), отличающихся только внутренним идентификатором (UUID). Поэтому если в одной версии хранилища были удалены одни объекты (файлы), добавлены и/или переименованы другие - в Git нужно явно сообщить, что удалять, несмотря на похожие файлы в других каталогах, а так же то, какие файлы переименовываются.
Таким образом, одна версия хранилища 1С может превращаться в 3 коммита: удаление файлов, переименование, и все остальные изменения контента в файлах и добавления файлов.
### Основные возможности ### Основные возможности
* Сконвертировать существующее хранилище 1С в репозиторий git * Конвертирование существующего хранилища конфигурации 1С в репозиторий Git
* Обновлять изменения из хранилища в репозиторий * Обновлять изменения из хранилища в репозиторий Git
* Параллелизировать загрузку истории хранилища из копий хранилища * Параллелизировать загрузку истории хранилища из копий хранилища
* Ограничение нагрузки на сервер с помощью очередей * Ограничение нагрузки на сервер с помощью очередей
* Возможно "сращивать" историю в git, если хранилище 1С обрезалось или начиналось заново. * Возможно "сращивать" историю в Git, если хранилище конфигураций "1С:Предприятия" обрезалось или начиналось заново.
* Сообщение гиту команды ```git mv старый_файл новый_файл``` при переименовании метаданных * Сообщение гиту команды ```git mv старый_файл новый_файл``` при переименовании метаданных
* Выгружать только изменения конфигурации. Доступно для Платформы 8.3.10 и выше, требуется использовать "очереди" * Выгружать только изменения конфигурации. Доступно для Платформы 8.3.10 и выше, требуется использовать "очереди"
* Создание сквозной история изменений для "хранилищ исправительных версий" если вы используете [Технологию разветвленной разработки конфигураций](https://its.1c.ru/db/v8std/content/2149184358/hdoc) или аналогичный процесс - хранилище версии можно загружать в "ветку" Git, получив сквозную историю в ветке.
* Конвертация репозитория выгрузки 1С:Предприятия в формат 1C:EDT с сохранением истории там, где это возможно
### Необходимые компоненты ### Необходимые компоненты
* Конфигурацию можно запустить, используя 1C:Enterprise Development Tools 1.7 (https://releases.1c.ru/project/DevelopmentTools10) * Конфигурацию можно запустить, используя 1C:Enterprise Development Tools 1.7 (https://releases.1c.ru/project/DevelopmentTools10)
* Платформа 1С:Предприятия 8.3.11 и выше (https://releases.1c.ru/project/Platform83) * Платформа 1С:Предприятия 8.3.11 и выше (https://releases.1c.ru/project/Platform83)
* СУБД поддерживаемая 1С:Предприятием * СУБД, поддерживаемая 1С:Предприятием
* OS Windows 7 или выше, ОС Linux и macOS - в бета-режиме. * OS Windows 7 или выше, ОС Linux и macOS - в бета-режиме.
## Начальная настройка ## Начальная настройка
@ -27,39 +31,39 @@
1. Разместите базу ГитКонвертера на сервере 1С. Работа в файловом режиме может быть использована только в демонстрационных целях. 1. Разместите базу ГитКонвертера на сервере 1С. Работа в файловом режиме может быть использована только в демонстрационных целях.
2. Заполните константу __"Путь к версиям платформы на сервере"__, где располагаются файлы Конфигуратора 1cv8(.exe) в формате: `C:\Program files (x86)\1cv8\%ВерсияПлатформы%\bin` 2. Заполните константу __"Путь к версиям платформы на сервере"__, где располагаются файлы Конфигуратора 1cv8(.exe) в формате: `C:\Program files (x86)\1cv8\%ВерсияПлатформы%\bin`
%ВерсияПлатформы% - в параметр будет подставлена текущая версия хранилища. где в параметр %ВерсияПлатформы% - будет подставлена текущая версия хранилища из настроек.
4. Для ограничения производительности можно включить константу __"Использовать очереди выполнения"__ 4. Для ограничения производительности можно включить константу __"Использовать очереди выполнения"__ - количеством очередей можно балансировать нагрузку на сервер.
### Настройка сервера 1С ### Настройка сервера 1С
Для ИБ ГитКонвертера на сервере 1С необходимо переключить формат журнала регистрации на старый режим. Для ИБ ГитКонвертера на сервере 1С рекомендуется настроить удаление, перенос в архив или полностью отключить журнал регистрации, т.к. интесивность событий в ИБ может быть очень высокой, а ценность истории ЖР за прошлые периоды - низкая.
Для этого необходимо в каталог журнала регистрации ИБ скопировать пустой файл с именем: __1Cv8.lgf__. Для легкого удаления и архивирования ЖР можно переключить его формат на старый режим. Для этого необходимо в каталог журнала регистрации ИБ скопировать пустой файл с именем: __1Cv8.lgf__.
Для больших проектов рекомендуется настроить удаление или бэкапирование файлов журнала регистрации. Для больших проектов рекомендуется выполнить такую настройку (удаление/бэкапирование файлов журнала регистрации).
Так же рекомендуется переключить регистрацию событий - только ошибки: __Конфигуратор - Администрирование - Настройка журнала регистрации... = Регистрировать ошибки__ с минимальной периодичностью. Так же рекомендуется переключить регистрацию событий - только ошибки. Для этого следует выбрать команду __Конфигуратор - Администрирование - Настройка журнала регистрации... = Регистрировать ошибки__ и в открывшемся диалоге установить минимально необходимую вам периодичностью.
## Настройка конвертации хранилища 1С ## Настройка конвертации хранилища 1С
Рекомендуется использовать сервер хранилищ конфигураций 1С. Рекомендуется использовать сервер хранилищ конфигураций 1С.
Для оптимальной работы сервера хранилищ настройте __Размер глобального кэша__ в "Администрировании" в 1,5-2 раза больше __количества__ параллельных потоков (если используются "копии хранилища") __получения версий * размер одной версии__. Для оптимальной работы сервера хранилищ настройте __Размер глобального кэша__ в "Администрировании" в 1,5-2 раза больше __количества__ параллельных потоков (если используются "копии хранилища") __получения версий * размер одной версии, Мб__.
### Параметры конвертации ### Параметры конвертации
* Укажите адрес хранилища. При использовании сервера хранилища рекомендуется настроить в администрировании хранилища параметр "Глобальный кэш версий конфигурации" чтобы количество кэшированных версий было больше параллельно получаемых версий. * Укажите адрес хранилища. При использовании сервера хранилища рекомендуется настроить в администрировании хранилища параметр "Глобальный кэш версий конфигурации" чтобы количество кэшированных версий было больше параллельно получаемых версий.
* Укажите версию платформы, рекомендуется использовать 8.3.9.1818 и выше. * Укажите версию платформы, рекомендуется использовать 8.3.9.1818 и выше.
* Укажите начальную версию в хранилище, если текущее хранилище было обрезано и первая версия больше 1. * Укажите начальную версию в хранилище конфигураций, если текущее хранилище было обрезано и первая версия больше 1.
* Если указана версия окончания - не будет выполняться запрос новых версий. * Если указана версия окончания - не будет выполняться запрос новых версий.
* Укажите расписание запусков * Укажите расписание запусков.
* Укажите __Каталог выгрузки версий__, в котором будут создаваться временные каталоги с номерами версий и выгрузкой данных. * Укажите __Каталог выгрузки версий__, в котором будут создаваться временные каталоги с номерами версий и выгрузкой данных.
* Желательно ограничить количество подготавливаемых (выгружаемых) версий - рекомендуется установить значение исходя из __Размер базы с версией + Размер выгрузки в xml__ и размера жесткого диска. * Желательно ограничить количество подготавливаемых (выгружаемых) версий - рекомендуется установить значение исходя из __Размер базы с версией + Размер выгрузки в xml__ и размера жесткого диска.
* Укажите __Минимальное количество метаданных__ - число файлов и каталогов выгрузки в xml - необходимо для контроля, что все файлы выгружены. Рекомендуется устанавливать 90-95% от текущей версии, чтобы учесть возможность удаления метаданных (т.е. сокращения количества файлов) * Укажите __Минимальное количество метаданных__ - число файлов и каталогов выгрузки в xml - необходимо для контроля, что все файлы выгружены. Рекомендуется устанавливать 90-95% от текущей версии, чтобы учесть возможность удаления метаданных (т.е. сокращения количества файлов)
* Не рекомендуется устанавливать __Удаление конфигураций поставщиков__, если планируется загружать конфигурацию из файлов и обновлять конфигурации поставщиков. Опция позволяет оптимизировать размер хранилища git и не хранить объемные файлы *.cf. * Не рекомендуется устанавливать __Удаление конфигураций поставщиков__, если планируется загружать конфигурацию из файлов и обновлять конфигурации поставщиков. Опция позволяет оптимизировать размер хранилища Git и не хранить объемные файлы *.cf.
* Установите __Удалять временные данные версии после коммита__ - рекомендуется на реальных проектах. * Установите __Удалять временные данные версии после коммита__ - рекомендуется на реальных проектах.
* __Выгружать изменения__ - позволяет на Платформе 8.3.10 и выше выгружать только изменения. Доступно при использовании __"Очередей"__ * __Выгружать изменения__ - позволяет на Платформе 8.3.10 и выше выгружать только изменения. Доступно при использовании __"Очередей"__
* __Локальный каталог git__ рекомендуется указывать на одном логическом диске с __Каталогом выгрузки версий__ - будет использовано перемещение версий возможностями ОС, иначе будет выполняться копирование. * __Локальный каталог Git__ рекомендуется указывать на одном логическом диске с __Каталогом выгрузки версий__ - будет использовано перемещение версий возможностями ОС, иначе будет выполняться копирование.
* __Каталог выгрузки в репозитории__ - относительный путь к каталогу выгрузки внутри репозитория. Рекомендуется указывать имя проекта для будущей совместимости с рабочим пространством 1C:EDT или оставить пустым. * __Каталог выгрузки в репозитории__ - относительный путь к каталогу выгрузки внутри репозитория. Рекомендуется указывать имя проекта для будущей совместимости с рабочим пространством 1C:EDT или оставить пустым.
* Установите флаг __Выполнять коммиты__ для выполнения коммитов. Отключение может быть необходимо с целью временно приостановить работу конвертера. * Установите флаг __Выполнять коммиты__ для выполнения коммитов. Отключение может быть необходимо с целью временно приостановить работу конвертера.
* Установите флаг __Обрабатывать все очереди__, если используются очереди в ИБ. * Установите флаг __Обрабатывать все очереди__, если используются очереди в ИБ.
@ -70,7 +74,38 @@
По умолчанию создается файл исключений __.gitignore__, в который добавляются файлы `DumpFilesIndex.txt` и `ConfigDumpInfo.xml` - не требуемые для работы с исходными файлами конфигурации 1С. По умолчанию создается файл исключений __.gitignore__, в который добавляются файлы `DumpFilesIndex.txt` и `ConfigDumpInfo.xml` - не требуемые для работы с исходными файлами конфигурации 1С.
Для увеличения быстродействия репозитория git можно использовать расширение __git lfs__ (https://git-lfs.github.com) Если репозиторий был создан с помощью кнопки в карточке хранилища, в локальный конфиг репозитория добавляются настройки для более комфортной работы:
```bash
git config --local core.quotepath false
git config --local gui.encoding utf-8
git config --local i18n.commitEncoding utf-8
git config --local diff.renameLimit 1
git config --local diff.renames false
```
#### Символы окончания строк.
Если разработчики, работающие с репозиторием, используют разные операционные системы (Microsoft Windows, Linux, macOS), нужно настроить конвертацию символов окончания строк при чтении из репозитория. Следующие команды настраивают Git таким образом, что в рабочей копии разработчика будут использоваться "родные" для его операционной системы символы, а в репозитории всегда будет использоваться LF.
Для операционной системы Microsoft Windows:
```bash
git config --global core.autocrlf true
git config --global core.safecrlf true
```
Для операционных систем Linux и macOS:
```bash
git config --global core.autocrlf input
git config --global core.safecrlf true
```
Подробнее о назначении этих параметров вы можете прочитать в документации Git на английском языке [git config core.safecrlf](http://git-scm.com/docs/git-config#git-config-coresafecrlf) и [git config core.autocrlf](http://git-scm.com/docs/git-config#git-config-coreautocrlf).
#### Git LFS
Для увеличения быстродействия репозитория Git можно использовать расширение __git lfs__ (https://git-lfs.github.com)
Если используется сервер репозиториев Git, необходимо убедиться, что он поддерживает это расширение и включить настройки для проекта. Например, GitLab, GitHub, BitBucket - поддерживают. Если используется сервер репозиториев Git, необходимо убедиться, что он поддерживает это расширение и включить настройки для проекта. Например, GitLab, GitHub, BitBucket - поддерживают.
@ -92,13 +127,20 @@ git lfs track "*.zip"
``` ```
В этом примере - все файлы конфигураций поставщиков, файлы макетов с "Двоичными данными" и картинки из конфигурации попадут в lfs. В этом примере - все файлы конфигураций поставщиков, файлы макетов с "Двоичными данными" и картинки из конфигурации попадут в lfs.
Например, чтобы переносить в LFS только некоторые типы файлов с расширением `*.bin` можно включить отслеживание только шаблонов и модулей без исходного кода по маске:
```bash
git lfs track "*/Ext/Template.bin"
git lfs track "*/Ext/Module.bin"
```
### Копии хранилища ### Копии хранилища
Копии хранилища используются для ускорения получения версий из хранилища. Копии хранилища используются для ускорения получения версий из хранилища.
* Возможно использовать тот же адрес серверного хранилища конфигураций, но с разными пользователями. Количество "копий" влияет на размер создаваемого глобального кэша версий на сервере хранилища 1С. Желательно установить кэш в настройках сервера хранилищ 1С в __полтора раза__ больше, чем количество копий в ГитКонвертере. * Возможно использовать тот же адрес серверного хранилища конфигураций, но с разными пользователями. Количество "копий" влияет на размер создаваемого глобального кэша версий на сервере хранилища 1С. Желательно установить кэш в настройках сервера хранилищ 1С в __полтора раза__ больше, чем количество копий в ГитКонвертере.
* Укажите другой адрес архивной копии хранилища, если в текущем хранилище выполнялось сокращение версий, и установите ограничение номеров версий в этой копии. * Укажите другой адрес архивной копии хранилища, если в текущем хранилище конфигураций выполнялось сокращение версий, и установите ограничение номеров версий в этой копии.
* Укажите расписание получения версий из этой копии. Если в "копии" указан адрес основного хранилища, необходимо в расписании учесть возможность работы разработчиков с хранилищем - запуски на получение выполнять с промежутками, обеспечивающими комфортную работу разработчиков. * Укажите расписание получения версий из этой копии. Если в "копии" указан адрес основного хранилища, необходимо в расписании учесть возможность работы разработчиков с хранилищем - запуски на получение выполнять с промежутками, обеспечивающими комфортную работу разработчиков.
### Очереди выполнения ### Очереди выполнения
@ -116,8 +158,101 @@ git lfs track "*.zip"
### Информация пользователей ### Информация пользователей
Хранилище 1С использует для идентификации __Пользователя__, а в репозитории git основным идентификатором является __email__ и имя пользователя. Для этих целей предназначен регистр сведений __Информация пользователей__, позволяющий указать соответствие пользователей хранилищ пользователям репозитория git. Хранилище конфигураций ":Предприятия" использует для идентификации __Пользователя__, а в репозитории Git основным идентификатором является __email__ и имя пользователя. Для этих целей предназначен регистр сведений __Информация пользователей__, позволяющий указать соответствие пользователей хранилищ пользователям репозитория Git.
Можно выполнять коммиты анонимно, с потерей информации об авторстве. Пользователь хранилища будет указан в дополнении к комментарию к каждой версии. Можно выполнять коммиты анонимно, с потерей информации об авторстве. Пользователь хранилища будет указан в дополнении к комментарию к каждой версии.
Пользователи могут быть указаны общие для всех хранилищ или с уточнением по хранилищам. Пользователи могут быть указаны общие для всех хранилищ или с уточнением по хранилищам.
## Конвертация выгрузки 1С:Предприятия в формат 1C:Enterprise Development Tools
Выполнить конвертацию необходимо, если процесс разработки полностью переносится из __Хранилища конфигураций 1С__ в Git репозиторий.
__Внимание!__ Конвертация в формат 1C:EDT необратима, поэтому последующая синхронизация с хранилищем конфигураций "1С:Предприятия" невозможна. Конечно, можно сделать "checkout" на коммит до конвертации и продолжить конвертацию в другой ветке, или откатить все изменения с помощью `git reset --hard <sha_commit>` и т.д.
Можно так же, в тестовых целях, создать копию элемента справочника "Хранилищ" и копию репозитория - создать ветку и конвертировать в формат 1C:EDT, оставляя возможность синхронизировать хранилище конфигураций с основной веткой Git.
Структура каталогов выгрузки 1С:Предприятия и формата 1C:EDT похожи, но немного различаются. Для сохранения истории разработки в формате 1C:EDT запустите обработку __"Конвертация в формат EDT"__. Она выполняет перемещение файлов в соответствии с форматом 1C:EDT, выполняет коммит в гит, заменяет каталог `src` выгрузки 1С:Предприятия каталогом из 1C:EDT и выполняет второй коммит с изменением контента файлов.
Стоит отметить, что содержание xml-файлов 1C:EDT и 1С:Предприятия в некоторых случаях различается существенно, поэтому построчное авторство сохранить не удастся.
1. Откройте 1C:EDT в новом Workspace и выполните импорт конфигурации из файлов: __File -> Import -> 1C:Enterprise Development Tools -> Configuration Files__, указав директорию к фалам `Локальный каталог Git/Каталог выгрузки в репозитории/src/`.
2. Укажите имя проекта соответствующее __Каталогу выгрузки в репозитории__ из настроек, если изначально было указано. Настройки проекта будут скопированы в репозиторий.
* Если изначально каталог с именем проекта не был указан (ну забыли, не знали...) можно заполнить имя проекта в карточке хранилища и выполнить перемещение `git mv ./src ./ИмяПроектаEDT/src` и коммит `git commit -m "EDT project name"` вручную, до конвертации.
3. Дождитесь окончания импорта и конвертации в 1C:EDT.
4. Если использовали __Git LFS__ - убедитесь что типы файлов, вынесенные в __LFS__, после конвертации с новыми именами/расширениями так же попадут в __LFS__.
5. Выполните конвертацию репозитория с помощью обработки __Сервис -> Конвертация в формат EDT__, указав путь к папке __src__ c исходными файлами в workspace из 1C:EDT.
Если изначально был указан __"Каталог выгрузки в репозитории"__ соответствующий имени проекта, после конвертации можно открыть 1C:EDT в новом  Workspace и выполнить импорт проекта из Git: __File -> Import -> Git -> Projects from Git__ и убедиться в корректности конвертации.
__Внимание!__ Рекомендуется читать документацию к 1C:EDT о настройках Git, работе с проектом, импорте и др.
Соответствие имен файлов формата выгрузки 1С:Предприятия и формата 1C:EDT
```
Configuration.xml -> Configuration.mdo
ClientApplicationInterface.xml -> ClientApplicationInterface.cai
CommandInterface.xml -> CommandInterface.cmi
HomePageWorkArea.xml -> HomePageWorkArea.hpwa
MainSectionCommandInterface.xml -> MainSectionCommandInterface.cmi
Form.xml -> Form.form
Template.xml -> Template.bin // BinaryData
Template.xml -> Template.mxlx // SpreadsheetDocument
Template.xml -> Template.dcs // DataCompositionSchema
Template.xml -> Template.txt // FileAwareTextDocument
Template.xml -> Template.htmldoc // HtmlDocument
Template.xml -> Template.addin // AddIn
Template.xml -> Template.scheme // GraphicalScheme
Template.xml -> Template.axdt // ActiveDocument
Template.xml -> Template.geos // GeographicalSchema
Template.xml -> Template.dcsat // DataCompositionAppearanceTemplate
Package.bin -> Package.xdto
WSDefinition.xml -> WsDefinitions.wsdl
Flowchart.xml -> Flowchart.scheme
Rights.xml -> Rights.rights
Schedule.xml -> Schedule.schedule
```
Другие файлы изменят имена не значительно, в соответствии с форматом 1C:EDT. Часть файлов (`Help.xml`, `Language.xml`, `Picture.xml`, `ФормаСписка.xml` и др.) будут удалены, т.к. контент файлов теперь хранится в составе других файлов.
## Если что-то пошло не так (FAQ)
#### Расписание конвертации включено, но список версий пуст
* Проверьте, что задана константа __"Путь к версиям платформы на сервере"__ и в настройках хранилища указана версия, соответствующая версии сервера хранилища конфигураций 1С:Предприятия.
* Проверьте файл логов `log.txt` в каталоге выгрузок - там может быть написано что-то вразумительное.
* Проверьте журнал регистрации базы 1С:ГитКонвертера - на наличие ошибок. Все мы - люди :)
#### Версии в списке ИБ 1С:ГитКонвертера есть, но конкретная версия зависла (зациклилась) на этапе выгрузки конфигурации в xml
* Можно посмотреть в лог пакетной операции для этой версии `/каталог выгрузки версий/ХХХ/log.txt` - пакетная операция Конфигуратора может сообщить что-то полезное
* Если база версии "развалилась" в контекстном меню формы списка версий __сбросить состояние__ версии - она будет получена заново из хранилища.
#### Версии обрабатываются, но не коммитятся в Git
* Проверьте, разрешен ли анонимный коммит в Git
* Проверьте список версий хранилища - красным подсвечиваются версии, для авторов которых не указана контактная информация в регистре "Информация пользователей"
* Нажмите кнопку "Выполнить коммиты" - для принудительного запуска коммитов обработанных версий в статусе "Метаданные загружены"
#### Коммиты не появляются на сервере Git
* Адрес Git-сервера был добавлен после создания хранилища? Нужно нажать кнопку "Установить адрес репозитория Git" чтобы настройки появились в config-файле.
* Откройте гит-клиент - проверьте, есть ли коммиты в локальном репозитории
* Посмотрите лог коммита на Git-сервер, расположенные `/каталог выгрузки версий/gi_log_ver_XXX.txt`
* Выполните команду `git push -u origin <branch name>` в консоли, чтобы проверить push вручную
* Проверьте права доступа для пользователя от которого запущен сервер 1С - от его имени выполняется запуск скриптов `*.bat/*.sh` и глобальные настройки Git для этого пользователя.
#### В какой-то версии произошел сбой и файлы версии закомичены не полностью
Т.е. в этой версии часть файлов или все были сначала удалены в репозитории, а следующая версия добавила файлы заново - сквозная история потерялась :(
* Можно установить контроль минимального количества файлов в выгрузке, чтобы такого не случалось в будущем.
* Т.к. это "односторонняя синхронизация" - то можно беспрепятственно откатить изменения `git reset --hard <commit>` на версию, до проблемной.
* Далее в карточке хранилища установить поле "Версия в Git" на текущую в Git.
* Для всех версий, начиная с "проблемной" и последующих, выполнить команду в контекстном меню "Сбросить состояние"
* В каталоге `src` удалить файлы `DumpFilesIndex.txt` и `ConfigDumpInfo.xml` т.к. они не хранятся в репозитории и не откатились.
* Проверить что командные файлы `*.bat` (или `*.sh`) удалены для всех версий, начиная с проблемной.
* Если была установлена настройка Git-сервера, необходимо на сервере отключить защиту ветки (если есть такое) и выполнить `git push -u -f origin <branch name>` принудительную передачу данных с заменой репозитория на сервере.
#### В хранилище версия есть, а в Git она пропущена
* Хранилище Конфигураций 1С:Предприятия позволяет сохранять новую версию без фактического изменения контента файлов, если меняется внутренняя версия объекта метаданных. Для Git в этом случае нечего коммитить.
* Откройте файлы логов и убедитесь в том, что версия была обработана корректно