Каталог решений - Иерархическая нумерация в отчете, основанном на СКД

Иерархическая нумерация в отчете, основанном на СКД

Иерархическая нумерация в отчете, основанном на СКД

В наличии

Правильная!! иерархическая нумерация в отчете на СКД, с учетом всех группировок, в том числе иерархических справочников

Категория:

Описание

Перерыл весь Инфостарт, но так и не нашел готового решения по иерархической нумерации в отчете на СКД. Делюсь своим вариантом решения.

1. Добавляем в отчет вычисляемое выражение

2. Добавляем макет поля на закладке макеты

3. На закладке Настройки для всех! группировок указываем в выбранных полях наше новое поле

Со схемой все.

Далее в модуле отчета, после вывода, пишем постобработку. Для обработки желательно знать первую строку отчета, чтобы не лопатить шапку.

Поиск колонки с номерами

		// Номер по порядку
		Если КолонкаНомераПоПорядку = 0 Тогда
			Для Кол = -Результат.ШиринаТаблицы По -1 Цикл
				Для Стр = Результат.Области.Заголовок.Низ+1 По ПерваяСтрокаОтчета Цикл
					ТекстРасшифровки = Результат.Область(Стр, -Кол).Текст;
					Если ТекстРасшифровки = "№ п/п" Тогда
						КолонкаНомераПоПорядку = -Кол;
						Прервать;
					КонецЕсли;
				КонецЦикла;
			КонецЦикла;
		КонецЕсли;

Собственно проставление номеров

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

У меня этот код вынесен в отдельную функцию

has been added to your cart:
Оформление заказа