Рефакторинг индусского кода
Долгое время использовал полезную обработку с инфостарта, которая подсчитывает количество и размер объектов в базе. Причем размер именно в байтах.
Но всегда хотел, чтобы таблицы были отсортированы по количеству, полез в код, чтобы добавить сортировку и был ошеломлен.
Код был написан путем 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
Свежие комментарии