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:
commit
bd642a0f37
@ -21,7 +21,7 @@
|
||||
<defaultRoles>Role.АдминистраторСистемы</defaultRoles>
|
||||
<defaultRoles>Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок</defaultRoles>
|
||||
<vendor>Фирма "1С"</vendor>
|
||||
<version>1.0.3.1</version>
|
||||
<version>1.0.4.1</version>
|
||||
<updateCatalogAddress>http://downloads.v8.1c.ru/tmplts/</updateCatalogAddress>
|
||||
<help>
|
||||
<pages>
|
||||
@ -97,6 +97,7 @@
|
||||
<enums>Enum.СостоянияВерсии</enums>
|
||||
<reports>Report.СкоростьКонвертации</reports>
|
||||
<dataProcessors>DataProcessor.РегламентныеИФоновыеЗадания</dataProcessors>
|
||||
<dataProcessors>DataProcessor.КонвертацияВФорматEDT</dataProcessors>
|
||||
<informationRegisters>InformationRegister.ИнформацияПользователей</informationRegisters>
|
||||
<informationRegisters>InformationRegister.СостоянияВерсии</informationRegisters>
|
||||
</mdclass:Configuration>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
@ -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
177
README.md
@ -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
|
||||
* Обновлять изменения из хранилища 1С в репозиторий Git
|
||||
* Параллелизировать загрузку истории хранилища из копий хранилища
|
||||
* Ограничение нагрузки на сервер с помощью очередей
|
||||
* Возможно "сращивать" историю в git, если хранилище 1С обрезалось или начиналось заново.
|
||||
* Возможно "сращивать" историю в Git, если хранилище конфигураций "1С:Предприятия" обрезалось или начиналось заново.
|
||||
* Сообщение гиту команды ```git mv старый_файл новый_файл``` при переименовании метаданных
|
||||
* Выгружать только изменения конфигурации. Доступно для Платформы 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)
|
||||
* Платформа 1С:Предприятия 8.3.11 и выше (https://releases.1c.ru/project/Platform83)
|
||||
* СУБД поддерживаемая 1С:Предприятием
|
||||
* СУБД, поддерживаемая 1С:Предприятием
|
||||
* OS Windows 7 или выше, ОС Linux и macOS - в бета-режиме.
|
||||
|
||||
## Начальная настройка
|
||||
@ -27,39 +31,39 @@
|
||||
|
||||
1. Разместите базу ГитКонвертера на сервере 1С. Работа в файловом режиме может быть использована только в демонстрационных целях.
|
||||
2. Заполните константу __"Путь к версиям платформы на сервере"__, где располагаются файлы Конфигуратора 1cv8(.exe) в формате: `C:\Program files (x86)\1cv8\%ВерсияПлатформы%\bin`
|
||||
%ВерсияПлатформы% - в параметр будет подставлена текущая версия хранилища.
|
||||
4. Для ограничения производительности можно включить константу __"Использовать очереди выполнения"__
|
||||
где в параметр %ВерсияПлатформы% - будет подставлена текущая версия хранилища из настроек.
|
||||
4. Для ограничения производительности можно включить константу __"Использовать очереди выполнения"__ - количеством очередей можно балансировать нагрузку на сервер.
|
||||
|
||||
### Настройка сервера 1С
|
||||
|
||||
Для ИБ ГитКонвертера на сервере 1С необходимо переключить формат журнала регистрации на старый режим.
|
||||
Для ИБ ГитКонвертера на сервере 1С рекомендуется настроить удаление, перенос в архив или полностью отключить журнал регистрации, т.к. интесивность событий в ИБ может быть очень высокой, а ценность истории ЖР за прошлые периоды - низкая.
|
||||
|
||||
Для этого необходимо в каталог журнала регистрации ИБ скопировать пустой файл с именем: __1Cv8.lgf__.
|
||||
Для больших проектов рекомендуется настроить удаление или бэкапирование файлов журнала регистрации.
|
||||
Для легкого удаления и архивирования ЖР можно переключить его формат на старый режим. Для этого необходимо в каталог журнала регистрации ИБ скопировать пустой файл с именем: __1Cv8.lgf__.
|
||||
Для больших проектов рекомендуется выполнить такую настройку (удаление/бэкапирование файлов журнала регистрации).
|
||||
|
||||
Так же рекомендуется переключить регистрацию событий - только ошибки: __Конфигуратор - Администрирование - Настройка журнала регистрации... = Регистрировать ошибки__ с минимальной периодичностью.
|
||||
Так же рекомендуется переключить регистрацию событий - только ошибки. Для этого следует выбрать команду __Конфигуратор - Администрирование - Настройка журнала регистрации... = Регистрировать ошибки__ и в открывшемся диалоге установить минимально необходимую вам периодичностью.
|
||||
|
||||
|
||||
## Настройка конвертации хранилища 1С
|
||||
|
||||
Рекомендуется использовать сервер хранилищ конфигураций 1С.
|
||||
|
||||
Для оптимальной работы сервера хранилищ настройте __Размер глобального кэша__ в "Администрировании" в 1,5-2 раза больше __количества__ параллельных потоков (если используются "копии хранилища") __получения версий * размер одной версии__.
|
||||
Для оптимальной работы сервера хранилищ настройте __Размер глобального кэша__ в "Администрировании" в 1,5-2 раза больше __количества__ параллельных потоков (если используются "копии хранилища") __получения версий * размер одной версии, Мб__.
|
||||
|
||||
### Параметры конвертации
|
||||
|
||||
* Укажите адрес хранилища. При использовании сервера хранилища рекомендуется настроить в администрировании хранилища параметр "Глобальный кэш версий конфигурации" чтобы количество кэшированных версий было больше параллельно получаемых версий.
|
||||
* Укажите версию платформы, рекомендуется использовать 8.3.9.1818 и выше.
|
||||
* Укажите начальную версию в хранилище, если текущее хранилище было обрезано и первая версия больше 1.
|
||||
* Укажите начальную версию в хранилище конфигураций, если текущее хранилище было обрезано и первая версия больше 1.
|
||||
* Если указана версия окончания - не будет выполняться запрос новых версий.
|
||||
* Укажите расписание запусков
|
||||
* Укажите расписание запусков.
|
||||
* Укажите __Каталог выгрузки версий__, в котором будут создаваться временные каталоги с номерами версий и выгрузкой данных.
|
||||
* Желательно ограничить количество подготавливаемых (выгружаемых) версий - рекомендуется установить значение исходя из __Размер базы с версией + Размер выгрузки в xml__ и размера жесткого диска.
|
||||
* Укажите __Минимальное количество метаданных__ - число файлов и каталогов выгрузки в xml - необходимо для контроля, что все файлы выгружены. Рекомендуется устанавливать 90-95% от текущей версии, чтобы учесть возможность удаления метаданных (т.е. сокращения количества файлов)
|
||||
* Не рекомендуется устанавливать __Удаление конфигураций поставщиков__, если планируется загружать конфигурацию из файлов и обновлять конфигурации поставщиков. Опция позволяет оптимизировать размер хранилища git и не хранить объемные файлы *.cf.
|
||||
* Не рекомендуется устанавливать __Удаление конфигураций поставщиков__, если планируется загружать конфигурацию из файлов и обновлять конфигурации поставщиков. Опция позволяет оптимизировать размер хранилища Git и не хранить объемные файлы *.cf.
|
||||
* Установите __Удалять временные данные версии после коммита__ - рекомендуется на реальных проектах.
|
||||
* __Выгружать изменения__ - позволяет на Платформе 8.3.10 и выше выгружать только изменения. Доступно при использовании __"Очередей"__
|
||||
* __Локальный каталог git__ рекомендуется указывать на одном логическом диске с __Каталогом выгрузки версий__ - будет использовано перемещение версий возможностями ОС, иначе будет выполняться копирование.
|
||||
* __Локальный каталог Git__ рекомендуется указывать на одном логическом диске с __Каталогом выгрузки версий__ - будет использовано перемещение версий возможностями ОС, иначе будет выполняться копирование.
|
||||
* __Каталог выгрузки в репозитории__ - относительный путь к каталогу выгрузки внутри репозитория. Рекомендуется указывать имя проекта для будущей совместимости с рабочим пространством 1C:EDT или оставить пустым.
|
||||
* Установите флаг __Выполнять коммиты__ для выполнения коммитов. Отключение может быть необходимо с целью временно приостановить работу конвертера.
|
||||
* Установите флаг __Обрабатывать все очереди__, если используются очереди в ИБ.
|
||||
@ -70,7 +74,38 @@
|
||||
|
||||
По умолчанию создается файл исключений __.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 - поддерживают.
|
||||
|
||||
@ -92,13 +127,20 @@ git lfs track "*.zip"
|
||||
```
|
||||
В этом примере - все файлы конфигураций поставщиков, файлы макетов с "Двоичными данными" и картинки из конфигурации попадут в lfs.
|
||||
|
||||
Например, чтобы переносить в LFS только некоторые типы файлов с расширением `*.bin` можно включить отслеживание только шаблонов и модулей без исходного кода по маске:
|
||||
|
||||
```bash
|
||||
git lfs track "*/Ext/Template.bin"
|
||||
git lfs track "*/Ext/Module.bin"
|
||||
```
|
||||
|
||||
### Копии хранилища
|
||||
|
||||
Копии хранилища используются для ускорения получения версий из хранилища.
|
||||
|
||||
* Возможно использовать тот же адрес серверного хранилища конфигураций, но с разными пользователями. Количество "копий" влияет на размер создаваемого глобального кэша версий на сервере хранилища 1С. Желательно установить кэш в настройках сервера хранилищ 1С в __полтора раза__ больше, чем количество копий в ГитКонвертере.
|
||||
|
||||
* Укажите другой адрес архивной копии хранилища, если в текущем хранилище выполнялось сокращение версий, и установите ограничение номеров версий в этой копии.
|
||||
* Укажите другой адрес архивной копии хранилища, если в текущем хранилище конфигураций выполнялось сокращение версий, и установите ограничение номеров версий в этой копии.
|
||||
* Укажите расписание получения версий из этой копии. Если в "копии" указан адрес основного хранилища, необходимо в расписании учесть возможность работы разработчиков с хранилищем - запуски на получение выполнять с промежутками, обеспечивающими комфортную работу разработчиков.
|
||||
|
||||
### Очереди выполнения
|
||||
@ -116,8 +158,101 @@ git lfs track "*.zip"
|
||||
|
||||
### Информация пользователей
|
||||
|
||||
Хранилище 1С использует для идентификации __Пользователя__, а в репозитории git основным идентификатором является __email__ и имя пользователя. Для этих целей предназначен регистр сведений __Информация пользователей__, позволяющий указать соответствие пользователей хранилищ пользователям репозитория git.
|
||||
Хранилище конфигураций "1С:Предприятия" использует для идентификации __Пользователя__, а в репозитории 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 в этом случае нечего коммитить.
|
||||
* Откройте файлы логов и убедитесь в том, что версия была обработана корректно
|
||||
|
Loading…
Reference in New Issue
Block a user