#Область СлужебныйПрограммныйИнтерфейс

Процедура ОтформатироватьНабор(Знач МассивФайлов) Экспорт

	Для Каждого Файл Из МассивФайлов Цикл
		ОтформатироватьМодуль(Файл.ПолноеИмя);
	КонецЦикла;

КонецПроцедуры
Процедура ОтформатироватьМодуль(Знач ПутьКМодулю) Экспорт

	ТекстовыйДокумент = Новый ТекстовыйДокумент();
	ТекстовыйДокумент.Прочитать(ПутьКМодулю, "UTF-8");

	БлокиКода  = РазобратьМодульНаБлоки(ТекстовыйДокумент);
	ТекстФайла = ОтформатироватьБлоки(БлокиКода);

	ТекстовыйДокумент.УстановитьТекст(ТекстФайла);
	ТекстовыйДокумент.Записать(ПутьКМодулю);

КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция РазобратьМодульНаБлоки(Знач ТекстовыйДокумент)

	Для Н = 1 По ТекстовыйДокумент.КоличествоСтрок() Цикл

		ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(Н);

		Если Не ЗначениеЗаполнено(СокрЛП(ТекущаяСтрока)) Тогда
			ТекстовыйДокумент.ЗаменитьСтроку(Н, "⣿");
		Иначе
			ТекстовыйДокумент.ЗаменитьСтроку(Н, СокрП(ТекущаяСтрока));
		КонецЕсли;

	КонецЦикла;

	ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
	БлокиФайла = СтрРазделить(ТекстФайла, "⣿");

	Возврат БлокиФайла;

КонецФункции

Функция ОтформатироватьБлоки(Знач БлокиКода)

	Для Н = 0 По БлокиКода.ВГраница() Цикл

		МассивСтрокБлока = СтрРазделить(БлокиКода[Н], Символы.ПС);

		Если МассивСтрокБлока.Количество() < 2 Тогда
			Продолжить;
		ИначеЕсли СтрНачинаетсяС(СокрЛП(МассивСтрокБлока[1]), "//") Тогда
			Продолжить;
		Иначе
			ВыровнятьЗнакиРавно(МассивСтрокБлока);
			ВыровнятьЗапятые(МассивСтрокБлока);
		КонецЕсли;

		БлокиКода[Н] = СтрСоединить(МассивСтрокБлока, Символы.ПС);

	КонецЦикла;

	ТекстФайла = СтрСоединить(БлокиКода, "");
	ТекстФайла = СтрЗаменить(ТекстФайла, Символы.Таб, "    ");

	Возврат ТекстФайла;

КонецФункции

Процедура ВыровнятьЗнакиРавно(МассивСтрокБлока)

	СоответствиеРасположений = Новый Соответствие();
	МаксимальноеРасположение = 0;
	ЧислоЗнаковРавно         = 0;

	Для Н = 0 По МассивСтрокБлока.ВГраница() Цикл

		РасположениеРавно = СтрНайти(МассивСтрокБлока[Н], "=");

		Если Не РасположениеРавно = 0 Тогда
			
			МассивЧастей = СтрРазделить(МассивСтрокБлока[Н], "=");
			НеПроверять  = Ложь;
			
			Для А = 0 По МассивЧастей.ВГраница() - 1 Цикл
				
				ЧислоКавычек = СтрЧислоВхождений(МассивЧастей[А], """");
				
				Если ЧислоКавычек <> 0 И ЧислоКавычек % 2 <> 0 Тогда
					СоответствиеРасположений.Вставить(Н, 0);
					НеПроверять = Истина;
					Прервать;
				КонецЕсли;

			КонецЦикла;

			Если НеПроверять Тогда
				Продолжить;
			КонецЕсли;

		КонецЕсли;

		СоответствиеРасположений.Вставить(Н, РасположениеРавно);
		МаксимальноеРасположение = ?(РасположениеРавно > МаксимальноеРасположение, РасположениеРавно, МаксимальноеРасположение);

		Если Не РасположениеРавно = 0 Тогда
			ЧислоЗнаковРавно = ЧислоЗнаковРавно + 1;
		КонецЕсли;

	КонецЦикла;

	Если МаксимальноеРасположение = 0 Или ЧислоЗнаковРавно < 2 Тогда
		Возврат;
	КонецЕсли;

	Для Каждого СтрокаБлока Из СоответствиеРасположений Цикл

		РасположениеРавно = СтрокаБлока.Значение;
		Индекс            = СтрокаБлока.Ключ;

		Если РасположениеРавно = 0 Или МаксимальноеРасположение - РасположениеРавно > 12 Тогда
			Продолжить;
		КонецЕсли;

		Для Н = РасположениеРавно По МаксимальноеРасположение - 1 Цикл
			МассивСтрокБлока[Индекс] = СтрЗаменить(МассивСтрокБлока[Индекс], "=", " =");
		КонецЦикла;

	КонецЦикла;

КонецПроцедуры

Процедура ВыровнятьЗапятые(МассивСтрокБлока, СоответствиеМаксимумов = "")

	ПолноеСоответствиеРасположений = Новый Соответствие();
	СтрокаСЗапятыми = 0;
	НачалоСтроки    = "";

	Для Н = 0 По МассивСтрокБлока.ВГраница() Цикл

		МассивУчастков   = СтрРазделить(МассивСтрокБлока[Н], ",");
		МассивУчастков_  = Новый Массив;
		Соединение       = Ложь;
		СтрокаСоединения = "";

		Для Каждого Участок Из МассивУчастков Цикл

			ЧислоКавычек = СтрЧислоВхождений(Участок, """");

			Если (ЧислоКавычек = 0 Или ЧислоКавычек % 2 = 0 ) И Не Соединение Тогда

				МассивУчастков_.Добавить(Участок);

			ИначеЕсли Соединение И ЧислоКавычек % 2 <> 0 Тогда
				МассивУчастков_.Добавить(СтрокаСоединения + "," + Участок);
				СтрокаСоединения = "";
				Соединение       = Ложь;

			Иначе
				СтрокаСоединения = ?(ЗначениеЗаполнено(СтрокаСоединения), СтрокаСоединения + "," + Участок, Участок);
				Соединение       = Истина;
			КонецЕсли;

		КонецЦикла;

		МассивУчастков = МассивУчастков_;

		Если МассивУчастков.Количество() < 2 Тогда
			Продолжить;
		Иначе
			СтрокаСЗапятыми = СтрокаСЗапятыми + 1;
		КонецЕсли;

		МассивНачалаСтроки = СтрРазделить(МассивУчастков[0], "(");

		Если МассивНачалаСтроки.Количество() < 2 Тогда
			Продолжить;
		КонецЕсли;

		НачалоСтроки             = МассивНачалаСтроки[0];
		СоответствиеРасположений = ПолноеСоответствиеРасположений[НачалоСтроки];

		Если Не ЗначениеЗаполнено(СоответствиеРасположений) Тогда
			СоответствиеРасположений = Новый Соответствие;
		КонецЕсли;

		Для Р = 0 По МассивУчастков.ВГраница() - 1 Цикл

			Если Не ЗначениеЗаполнено(СоответствиеМаксимумов) Тогда

				ДлинаУчастка = СтрДлина(МассивУчастков[Р]);

				ТекущийМаксимум = СоответствиеРасположений.Получить(Р);
				ТекущийМаксимум = ?(ЗначениеЗаполнено(ТекущийМаксимум), ТекущийМаксимум, 0);
				ТекущийМаксимум = ?(ДлинаУчастка > ТекущийМаксимум    , ДлинаУчастка   , ТекущийМаксимум);

				СоответствиеРасположений.Вставить(Р, ТекущийМаксимум);

			Иначе

				ТекущееСоответствиеМаксимумов = СоответствиеМаксимумов[НачалоСтроки];

				Если Не ЗначениеЗаполнено(ТекущееСоответствиеМаксимумов) Тогда
					Прервать;
				КонецЕсли;

				НеобходимаяДлина = ТекущееСоответствиеМаксимумов[Р];

				Если НеобходимаяДлина = Неопределено Тогда
					Продолжить;
				КонецЕсли;

				Пока СтрДлина(МассивУчастков[Р]) < НеобходимаяДлина Цикл
					МассивУчастков[Р] = МассивУчастков[Р] + " ";
				КонецЦикла;

			КонецЕсли;

		КонецЦикла;

		ПолноеСоответствиеРасположений.Вставить(НачалоСтроки, СоответствиеРасположений);

		МассивСтрокБлока[Н] = СтрСоединить(МассивУчастков, ",");

	КонецЦикла;

	Если Не ЗначениеЗаполнено(СоответствиеМаксимумов)
		И ЗначениеЗаполнено(ПолноеСоответствиеРасположений)
		И СтрокаСЗапятыми > 1 Тогда
		ВыровнятьЗапятые(МассивСтрокБлока, ПолноеСоответствиеРасположений);
	КонецЕсли;

КонецПроцедуры

#КонецОбласти