Рефакторинг индусского кода

Долгое время использовал полезную обработку с инфостарта, которая подсчитывает количество и размер объектов в базе. Причем размер именно в байтах.

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

Код был написан путем copy-paste, без всякой формализации.

Я на скорую руку сделал рефакторинг, в итоге код вывода на печать из 320 строк сократился до 103:

Процедура ПечатьОбласти(Макет, ТабДокумент, ЗаголовокТипа, ИдентификаторКласса, ТипРП, МассивДанных, МассивДанных_Кол) Экспорт
	//ИдентификаторКласса - Документ, Справочник, ...
	
	ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
	ОбластьШапка.Параметры.Тип = ЗаголовокТипа;
	ТабДокумент.Вывести(ОбластьШапка, 1, "Заголовок");
	
	Если МассивДанных = Неопределено Тогда
		Возврат;
	КонецЕсли;
		
	Номер           = 0;
	ОбщийРазмер     = 0;
	
	ТЗОбластей = Новый ТаблицаЗначений();
	ТЗОбластей.Колонки.Добавить("Размер");
	ТЗОбластей.Колонки.Добавить("Область");
	
	Пока Номер < МассивДанных.Количество() Цикл
		
		ОбластьОбъект                         = Макет.ПолучитьОбласть("Объект");
		ОбластьОбъект.Параметры.Номер         = Номер+1;
		ОбластьОбъект.Параметры.Объект      =   МассивДанных[Номер].Объект;
		ОбластьОбъект.Параметры.Количество    = МассивДанных[Номер].Количество;      
		
		РазмерДанных = 0;
		
		Если Не ВерсияПриложенияМеньше8315() Тогда
			
			МассивИменМетаданных = Новый Массив();
			МассивИменМетаданных.Добавить(ИдентификаторКласса + "." + МассивДанных[Номер].ОбъектИмя);
			Выполнить("РазмерДанных = ПолучитьРазмерДанныхБазыДанных(Новый Массив(),МассивИменМетаданных)");
			ОбластьОбъект.Параметры.Размер     = Формат(РазмерДанных/1048576,"ЧЦ=15; ЧДЦ=2");
			ОбластьОбъект.Параметры.РазмерБайт = Формат(РазмерДанных,"ЧЦ=20; ЧДЦ=2");
			ОбщийРазмер = ОбщийРазмер + РазмерДанных;
			
		КонецЕсли;
		
		НСтрОбласть = ТЗОбластей.Добавить();
		НСтрОбласть.Область = ОбластьОбъект;
		НСтрОбласть.Размер = РазмерДанных;
		Номер = Номер + 1;
		
	КонецЦикла;
	
	Если СортироватьПоРазмеру Тогда
		ТЗОбластей.Сортировать("Размер Убыв");
	КонецЕсли;

	Для Каждого СтрокаОбласть Из ТЗОбластей Цикл
		Таб = ТабДокумент.Вывести(СтрокаОбласть.Область, 2, ЗаголовокТипа);
	КонецЦикла;
	
	ОбластьИтого                     = Макет.ПолучитьОбласть("Итого");
	ОбластьИтого.Параметры.Итого  = МассивДанных_Кол[0].ОбщееКоличество;
	
	Если Не ВерсияПриложенияМеньше8315() Тогда
		
		ОбластьИтого.Параметры.ОбщийРазмер     = Формат(ОбщийРазмер/1048576,"ЧЦ=15; ЧДЦ=2");
		ОбластьИтого.Параметры.ОбщийРазмерБайт = Формат(ОбщийРазмер,"ЧЦ=20; ЧДЦ=2")
		
	КонецЕсли;
	
	ТабДокумент.Вывести(ОбластьИтого);
	
	ОбластьОбщее = Макет.ПолучитьОбласть("Общее");
	ОбластьОбщее.Параметры.ТипРП = ТипРП;
	ОбластьОбщее.Параметры.Кол = МассивДанных_Кол[0].ОбщееКоличествоОбъектов;
	ОбластьОбщее.Параметры.Исп = МассивДанных_Кол[0].ИспользуемоеКоличествоОбъектов;
	ТабДокумент.Вывести(ОбластьОбщее);
		
КонецПроцедуры

&НаСервере
Функция Печать(п_Документы = Неопределено, п_Документы_Кол = Неопределено, п_Справочники = Неопределено, п_Справочники_Кол = Неопределено, п_РегистрыСведений = Неопределено, п_РегистрыСведений_Кол = Неопределено, п_РегистрыНакопления = Неопределено, п_РегистрыНакопления_Кол = Неопределено, п_РегистрыБухгалтерии = Неопределено, п_РегистрыБухгалтерии_Кол = Неопределено, п_РегистрыРасчета = Неопределено, п_РегистрыРасчета_Кол = Неопределено)  Экспорт
	
	СистемнаяИнформация             = Новый СистемнаяИнформация;
	ВерсияПриложенияБезНомераСборки = ВерсияБезНомераСборки(СистемнаяИнформация.ВерсияПриложения);
	
	РазмерДанных = 0;
	
	ТабДокумент = Новый ТабличныйДокумент;
	
	Если ВерсияПриложенияМеньше8315() Тогда
		
		Макет =  ЭтотОбъект.ПолучитьМакет("Макет");
		
	Иначе
		
		Макет = ЭтотОбъект.ПолучитьМакет("Макет8315");
		
	КонецЕсли;    
	
	ПечатьОбласти(Макет, ТабДокумент, "Документы", "Документ", "документов", п_Документы, п_Документы_Кол);	
	ПечатьОбласти(Макет, ТабДокумент, "Справочники", "Справочник", "справочников", п_Справочники, п_Справочники_Кол);	
	ПечатьОбласти(Макет, ТабДокумент, "Регистры сведений", "РегистрСведений", "регистров сведений", п_РегистрыСведений, п_РегистрыСведений_Кол);	
	ПечатьОбласти(Макет, ТабДокумент, "Регистры накопления", "РегистрНакопления", "регистров накопления", п_РегистрыНакопления, п_РегистрыНакопления_Кол);	
	ПечатьОбласти(Макет, ТабДокумент, "Регистры бухгалтерии", "РегистрБухгалтерии", "регистров бухгалтерии", п_РегистрыБухгалтерии, п_РегистрыБухгалтерии_Кол);	
	ПечатьОбласти(Макет, ТабДокумент, "Регистры расчета", "РегистрРасчета", "регистров расчета", п_РегистрыРасчета, п_РегистрыРасчета_Кол);	
	
	Возврат ТабДокумент;
	
КонецФункции

В источнике блок, который я вынес в ПечатьОбласти повторялся для каждого класса метаданных, например для документов:

	//Документы
	
	ОбластьШапкаДокумент = Макет.ПолучитьОбласть("ШапкаДокументы");
	ТабДокумент.Вывести(ОбластьШапкаДокумент,1,"Заголовок");
	
	Если Не п_Документы = Неопределено Тогда
		
		Номер           = 0;
		ОбщийРазмер     = 0;
		
		Пока Номер < п_Документы.Количество() Цикл
						
			ОбластьШапка                         = Макет.ПолучитьОбласть("Документы");
			ОбластьШапка.Параметры.Номер         = Номер+1;
			ОбластьШапка.Параметры.Документ      = п_Документы[Номер].Документ;
			ОбластьШапка.Параметры.Количество    = п_Документы[Номер].Количество;
			
			Если Не ВерсияПриложенияМеньше8315() Тогда
				
				МассивИменМетаданных = Новый Массив();
				МассивИменМетаданных.Добавить("Документ." + п_Документы[Номер].ДокументИмя);
				Выполнить("РазмерДанных = ПолучитьРазмерДанныхБазыДанных(Новый Массив(),МассивИменМетаданных)");
				ОбластьШапка.Параметры.Размер     = Формат(РазмерДанных/1048576,"ЧЦ=15; ЧДЦ=2");
				ОбластьШапка.Параметры.РазмерБайт = Формат(РазмерДанных,"ЧЦ=20; ЧДЦ=2");
				ОбщийРазмер = ОбщийРазмер + РазмерДанных;
				
			КонецЕсли;
			
			Таб = ТабДокумент.Вывести(ОбластьШапка,2, "Документы");
			Номер = Номер + 1;
			
		КонецЦикла;
		
		ОбластьИтогоДокументы                     = Макет.ПолучитьОбласть("ИтогоДокументы");
		ОбластьИтогоДокументы.Параметры.ИтогоДок  = п_Документы_Кол[0].ОбщееКоличество;
		
		Если Не ВерсияПриложенияМеньше8315() Тогда
			
			ОбластьИтогоДокументы.Параметры.ОбщийРазмер     = Формат(ОбщийРазмер/1048576,"ЧЦ=15; ЧДЦ=2");
			ОбластьИтогоДокументы.Параметры.ОбщийРазмерБайт = Формат(ОбщийРазмер,"ЧЦ=20; ЧДЦ=2")
			
		КонецЕсли;
		
		ТабДокумент.Вывести(ОбластьИтогоДокументы);
		ОбластьОбщееДок = Макет.ПолучитьОбласть("ОбщееДок");
		ОбластьОбщееДок.Параметры.КолДок = п_Документы_Кол[0].ОбщееКоличествоДокументов;
		ОбластьОбщееДок.Параметры.ИспДок = п_Документы_Кол[0].ИспользуемоеКоличествоДокументов;
		ТабДокумент.Вывести(ОбластьОбщееДок);
		
	КонецЕсли;

Остальной кусок кода по подсчету количества объектов тоже имеет смысл формализовать. Видна рука дилетанта, не опытного, но трудолюбивого.

Жаль, автор не оставил возможность комментирования, думаю 6 минусов ему влепили именно за «индусский код».

Как видно из кода, я добавил сортировку по размеру:

Среда: Универсально. Платформа: 8.3.19.1723

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *