public static string ParseRegions(string cfModuleFileText, List <RegionContainer> linesNew, int startIndex, int endIndex) { string subStringRegion = "#Область"; string subStringEndRegion = "#КонецОбласти"; int lastListRegionIndex = -1; while (true) { int indexOfSubStringRegion = cfModuleFileText.IndexOf(subStringRegion, startIndex, StringComparison.CurrentCultureIgnoreCase); int indexOfSubStringEndRegion = cfModuleFileText.IndexOf(subStringEndRegion, startIndex, StringComparison.CurrentCultureIgnoreCase); int startIndexNameRegion; int endIndexNameRegion; string subStringSpace; if (indexOfSubStringRegion >= 0 && indexOfSubStringEndRegion >= 0) { if (indexOfSubStringRegion < indexOfSubStringEndRegion) { //Получаем индекс первого символа имени области startIndexNameRegion = indexOfSubStringRegion + 7; do { startIndexNameRegion++; subStringSpace = cfModuleFileText.Substring(startIndexNameRegion, 1); subStringSpace = subStringSpace.Trim(new char[] { ' ', '\r', '\n', '\t' }); }while (subStringSpace.Length == 0); //Получаем индекс последнего символа имени области endIndexNameRegion = startIndexNameRegion; while (subStringSpace.Length != 0) { endIndexNameRegion++; subStringSpace = cfModuleFileText.Substring(endIndexNameRegion, 1); subStringSpace = subStringSpace.Trim(new char[] { ' ', '\r', '\n', '\t' }); } RegionContainer lineNew = new RegionContainer(); lineNew.Name = cfModuleFileText.Substring(startIndexNameRegion, endIndexNameRegion - startIndexNameRegion); lineNew.StartIndex = indexOfSubStringRegion; linesNew.Add(lineNew); lastListRegionIndex++; startIndex = endIndexNameRegion + 1; } else { for (int listRegionIndex = lastListRegionIndex; listRegionIndex >= 0; listRegionIndex--) { RegionContainer lineNew = linesNew[listRegionIndex]; if (lineNew.EndIndex == 0) { lineNew.EndIndex = indexOfSubStringEndRegion; startIndex = indexOfSubStringEndRegion + 13; break; } } } } else if (indexOfSubStringRegion >= 0) { //Такого быть не может. //Начало области не может быть без конца области, потому что строку мы обрезаем слева. break; } else if (indexOfSubStringEndRegion >= 0) { for (int listRegionIndex = lastListRegionIndex; listRegionIndex >= 0; listRegionIndex--) { RegionContainer lineNew = linesNew[listRegionIndex]; if (lineNew.EndIndex == 0) { lineNew.EndIndex = indexOfSubStringEndRegion; startIndex = indexOfSubStringEndRegion + 13; break; } } } else//Либо ничего не нашли, либо дошли до конца - прерываем цикл { break; } } return("fff"); }
public static string ChangeModuleFile(string cfFileDir, string moduleName) { string cfModuleFilePathNew = $@"{cfFileDir}\ОбщийМодуль.{moduleName}1.Модуль.txt"; string cfModuleFilePath = $@"{cfFileDir}\ОбщийМодуль.{moduleName}.Модуль.txt"; string cfModuleFileText; //Читаем текст файла общего модуля конфигурации using (StreamReader srCfModuleFile = new StreamReader(cfModuleFilePath, System.Text.Encoding.UTF8)) { cfModuleFileText = srCfModuleFile.ReadToEnd(); } int endIndex = cfModuleFileText.Length - 1; //Отбираем области экспортных процедур и функций List <RegionContainer> Regionlines = new List <RegionContainer>(); ParseRegions(cfModuleFileText, Regionlines, 0, endIndex); //Отбираем эксортные процедуры и функции List <PFContainer> PFlines = new List <PFContainer>(); ParseCFModuleFileText(cfModuleFileText, PFlines, 0, endIndex); //Заисываем данные в новый модуль using (StreamWriter srCfModuleFileNew = new StreamWriter(cfModuleFilePath, false, System.Text.Encoding.UTF8)) { //Здесь будем хранить список областей записанных в файл List <RegionContainer> writeRegionlines = new List <RegionContainer>(); //Здесь будем хранить список закрытых областей записанных в файл List <RegionContainer> writeEndRegionlines = new List <RegionContainer>(); foreach (PFContainer line in PFlines) { string subStringParameters = ""; if (line.Parameters != null) { foreach (string parameter in line.Parameters) { subStringParameters = subStringParameters + ((subStringParameters == "") ? subStringParameters : ", ") + parameter; } } //вставляем области if (Regionlines.Count != 0) { //Найдем список областей до текущей процедуры/функции, их нужно закрыть List <RegionContainer> findEndRegionlines = Regionlines.FindAll(x => x.EndIndex < line.Index); foreach (RegionContainer findEndRegionline in findEndRegionlines) { //Поищем в списке записанных областей текущую найденную закрытую область //Ее может не быть, потому что в ней могло не оказаться экспортных процедур/функций, тогда закрыать нечего RegionContainer writeRegionline = writeRegionlines.Find(x => x.StartIndex == findEndRegionline.StartIndex && x.EndIndex == findEndRegionline.EndIndex); if (writeRegionline != null)//Область, которую нужно закрыть, должна быть записана в файл { //Поищем в списке записанных закрытых областей текущую найденную закрытую область, может оказаться уже закрытой RegionContainer writeEndRegionline = writeEndRegionlines.Find(x => x.StartIndex == findEndRegionline.StartIndex && x.EndIndex == findEndRegionline.EndIndex); if (writeEndRegionline == null) { srCfModuleFileNew.WriteLine(); srCfModuleFileNew.WriteLine($"#КонецОбласти"); writeEndRegionlines.Add(findEndRegionline); } } } //Найдем список областей для текущей процедуры/функции List <RegionContainer> findRegionlines = Regionlines.FindAll(x => x.StartIndex <line.Index && x.EndIndex> line.Index); foreach (RegionContainer findRegionline in findRegionlines) { //Поищем в списке записанных областей текущую найденную область RegionContainer writeRegionline = writeRegionlines.Find(x => x.StartIndex == findRegionline.StartIndex && x.EndIndex == findRegionline.EndIndex); if (writeRegionline == null) { srCfModuleFileNew.WriteLine(); srCfModuleFileNew.WriteLine($"#Область {findRegionline.Name}"); writeRegionlines.Add(findRegionline); } } } if (line.Type == TypePF.Function) { srCfModuleFileNew.WriteLine(); srCfModuleFileNew.WriteLine(line.Text); srCfModuleFileNew.WriteLine(); srCfModuleFileNew.WriteLine($"\tОбъектСЛК = ОбщегоНазначенияУВССервер.СоздатьОбъектСЛК(\"{moduleName}\");"); srCfModuleFileNew.WriteLine(); srCfModuleFileNew.WriteLine($"\tЕсли Не ОбъектСЛК = Неопределено Тогда"); srCfModuleFileNew.WriteLine($"\t\tВозврат ОбъектСЛК.{line.Name}({subStringParameters});"); srCfModuleFileNew.WriteLine($"\tИначе"); srCfModuleFileNew.WriteLine($"\t\tВозврат Неопределено;"); srCfModuleFileNew.WriteLine($"\tКонецЕсли;"); srCfModuleFileNew.WriteLine(); srCfModuleFileNew.WriteLine($"КонецФункции"); } else if (line.Type == TypePF.Procedure) { srCfModuleFileNew.WriteLine(); srCfModuleFileNew.WriteLine(line.Text); srCfModuleFileNew.WriteLine(); srCfModuleFileNew.WriteLine($"\tОбъектСЛК = ОбщегоНазначенияУВССервер.СоздатьОбъектСЛК(\"{moduleName}\");"); srCfModuleFileNew.WriteLine(); srCfModuleFileNew.WriteLine($"\tЕсли Не ОбъектСЛК = Неопределено Тогда"); srCfModuleFileNew.WriteLine($"\t\tОбъектСЛК.{line.Name}({subStringParameters});"); srCfModuleFileNew.WriteLine($"\tКонецЕсли;"); srCfModuleFileNew.WriteLine(); srCfModuleFileNew.WriteLine($"КонецПроцедуры"); } } if (Regionlines.Count != 0) { int countWriteNotEndRegionlines = writeRegionlines.Count - writeEndRegionlines.Count; while (countWriteNotEndRegionlines != 0) { srCfModuleFileNew.WriteLine(); srCfModuleFileNew.WriteLine($"#КонецОбласти"); countWriteNotEndRegionlines--; } } } return("fff"); }