Я продолжу крик души, можно?
Суперархитекторство как оно есть.
Тот шаблон, который написан в (1) - изначально записывается примерно так:
ГенераторОтчета.НовоеПолеОтчетаСумма("ДоляЧистогоДохода", "Доля,%", "Ч7.2, ", 9,,, "[?(<ОБЩИЙ_ИТОГ.ПолучитьЧистыйДоход> <= 0, 1, <ИТОГ.ПолучитьЧистыйДоход> / <ОБЩИЙ_ИТОГ.ПолучитьЧистыйДоход>) * 100]", расшТЗ._ТИП_СВЕРТКИ_СРЕДНЕЕ,, "[?(<ОБЩИЙ_ИТОГ.ПолучитьЧистыйДоход> <= 0, 1, <ТЕКУЩАЯ_СТРОКА.ПолучитьЧистыйДоход> / <ОБЩИЙ_ИТОГ.ПолучитьЧистыйДоход>) * 100]");
И только потом, где-то внутри, строка типа "[?(<ОБЩИЙ_ИТОГ.ПолучитьЧистыйДоход> <= 0, 1, <ИТОГ.ПолучитьЧистыйДоход> / <ОБЩИЙ_ИТОГ.ПолучитьЧистыйДоход>) * 100]" преобразуется в нормальный шаблон специальным методом. Ниже код метода:
Функция ОбработатьШаблонИтога(шаблонОбщегоИтога)
результат = СтрЗаменить(шаблонОбщегоИтога, "<ИТОГ>", "данные.Итог(Сам().ПолучитьНомерКолонкиОтчета(колонка))");
результат = СтрЗаменить(результат, "<ОБЩИЙ_ИТОГ>", "ПолучитьТаблицуДанных(0).Итог(Сам().ПолучитьНомерКолонкиОтчета(колонка))");
//@TODO избавиться от дублирования
поз = Найти(результат, "<ИТОГ.");
Пока поз > 0 Цикл
подстр = Сред(результат, поз);
окончание = Найти(подстр, ">");
Если окончание = 0 Тогда
Сам()._ВыброситьИскл("Неправильный шаблон итогов: " + шаблонОбщегоИтога);
КонецЕсли;
имяКолонки = Сред(подстр, 7, окончание - 7);
результат = СтрЗаменить(результат, "<ИТОГ." + имяКолонки + ">", "данные.Итог(""" + имяКолонки + """)");
поз = Найти(результат, "<ИТОГ.");
КонецЦикла;
поз = Найти(результат, "<ОБЩИЙ_ИТОГ.");
Пока поз > 0 Цикл
подстр = Сред(результат, поз);
окончание = Найти(подстр, ">");
Если окончание = 0 Тогда
Сам()._ВыброситьИскл("Неправильный шаблон итогов: " + шаблонОбщегоИтога);
КонецЕсли;
имяКолонки = Сред(подстр, 13, окончание - 13);
результат = СтрЗаменить(результат, "<ОБЩИЙ_ИТОГ." + имяКолонки + ">", "ПолучитьТаблицуДанных(0).Итог(""" + имяКолонки + """)");
поз = Найти(результат, "<ОБЩИЙ_ИТОГ.");
КонецЦикла;
Возврат результат;
КонецФункции // ОбработатьШаблонИтога
Юниттестов на этот код никаких нет, ага.