Перерыл весь Инфостарт, но так и не нашел готового решения по иерархической нумерации в отчете на СКД. Делюсь своим вариантом решения.
1. Добавляем в отчет вычисляемое выражение
2. Добавляем макет поля на закладке макеты
3. На закладке Настройки для всех! группировок указываем в выбранных полях наше новое поле
Со схемой все.
Далее в модуле отчета, после вывода, пишем постобработку. Для обработки желательно знать первую строку отчета, чтобы не лопатить шапку.
Поиск колонки с номерами
// Номер по порядку
Если КолонкаНомераПоПорядку = 0 Тогда
Для Кол = -Результат.ШиринаТаблицы По -1 Цикл
Для Стр = Результат.Области.Заголовок.Низ+1 По ПерваяСтрокаОтчета Цикл
ТекстРасшифровки = Результат.Область(Стр, -Кол).Текст;
Если ТекстРасшифровки = "№ п/п" Тогда
КолонкаНомераПоПорядку = -Кол;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
Собственно проставление номеров
Если Результат.ВысотаТаблицы = 0
ИЛИ ПерваяСтрокаОтчета = 0
ИЛИ КолонкаНомераПоПорядку = 0 Тогда
Возврат;
КонецЕсли;
// Проставим иерархические номера
НомераВерхнихУровней = Новый Соответствие();
НомераВерхнихУровней.Вставить("Уровень1", 0);
МаксимальныйУровень = 7;
ПрошлыйУровень = МаксимальныйУровень;
// проходим по всем строкам нужной колонки и заполняем номера
Для Стр = ПерваяСтрокаОтчета+1 По Результат.ВысотаТаблицы-1 Цикл
ЗначенияПолейРасшифровки = ДанныеРасшифровки.Элементы[Результат.Область(Стр, КолонкаНомераПоПорядку).Расшифровка].ПолучитьПоля();
ПолеУровень = ЗначенияПолейРасшифровки.Найти("Уровень");
Если ПолеУровень = Неопределено Тогда
Возврат;
КонецЕсли;
Если ПолеУровень.Значение < ПрошлыйУровень Тогда
// обнулим более низкие уровни
Для ТекущийУровень = ПолеУровень.Значение + 1 По МаксимальныйУровень Цикл
НомераВерхнихУровней.Вставить("Уровень"+ТекущийУровень, 0);
КонецЦикла;
КонецЕсли;
// увеличиваем текущий уровень
НомераВерхнихУровней.Вставить("Уровень"+ПолеУровень.Значение, НомераВерхнихУровней["Уровень"+ПолеУровень.Значение]+1);
// получаем полный номер, с учетом всех вышестоящих уровней
Номер = "";
Для ТекущийУровень = 1 По ПолеУровень.Значение Цикл
Номер = Номер + НомераВерхнихУровней["Уровень"+ТекущийУровень] + ".";
КонецЦикла;
Результат.Область(Стр, КолонкаНомераПоПорядку).Текст = Лев(Номер, СтрДлина(Номер)-1);
КонецЦикла;
У меня этот код вынесен в отдельную функцию
Надеюсь, что мой лайфхак будет полезен для всех любителей СКД. Если у вас есть свой вариант, то делитесь им и я с удовольствием размещу ссылки на этой странице.
Вариант без программирования: //infostart.ru/public/1084494/
Вариант с программированием: //infostart.ru/public/956767/