1С 8.3 Определение максимального количества используемых уровней иерархической таблицы
Данные > Примеры кода 1С > 1С 8.3 Запросы
Перейти в раздел примеры кода 1С 8.3:
Определяет глубину (максимальное количество используемых уровней иерархии) иерархической таблицы. в 1С 8.3:
// Автор: Назаренко_СВ
//
//Параметры:
// ИерархическаяТабл – Строка – Полное имя таблицы с иерархическими данными, как она задается в языке запросов.
// Например, "Справочник.Номенклатура".
//
//Возвращаемое значение:
// Число – Глубина (количество используемых уровней иерархии) указанной иерархической таблицы.
//
Функция ГлубинаТаб(ИерархическаяТабл) Экспорт
Результат = 0;
ТекстЗапроса = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ИсходнаяТаблица.Родитель КАК Родитель
|ПОМЕСТИТЬ вт_Родители0
|ИЗ
| "+ИерархическаяТабл+" КАК ИсходнаяТаблица
|";
Итерация = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ИсходнаяТаблица.Родитель КАК Родитель
|ПОМЕСТИТЬ вт_Родители#2
|ИЗ
| вт_Родители#1 КАК Родители
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ "+ИерархическаяТабл+" КАК ИсходнаяТаблица
|ПО
| Родители.Родитель = ИсходнаяТаблица.Ссылка
|;
|УНИЧТОЖИТЬ вт_Родители#1
|;
|";
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
КоличЭлементов = Выборка.Количество;
Иначе
КоличЭлементов = 0;
КонецЕсли;
Пока КоличЭлементов <> 0 Цикл
ТекстЗапроса2 = СтрЗаменить(Итерация, "#1", Формат(Результат, "ЧН=0; ЧГ=0"));
Результат = Результат +1;
Запрос.Текст = СтрЗаменить(ТекстЗапроса2, "#2", Формат(Результат, "ЧН=0; ЧГ=0"));
ЗапросРезультаты = Запрос.ВыполнитьПакет();
Выборка = ЗапросРезультаты[0].Выбрать();
Если Выборка.Следующий() Тогда
КоличЭлементов = Выборка.Количество;
Иначе
КоличЭлементов = 0;
КонецЕсли;
КонецЦикла;
// Перед выходом удалим последнюю временную таблицу.
Запрос.Текст = СтрЗаменить("УНИЧТОЖИТЬ вт_Родители#1", "#1", Формат(Результат, "ЧН=0; ЧГ=0"));
Запрос.Выполнить();
Возврат Результат;
КонецФункции
//
//Параметры:
// ИерархическаяТабл – Строка – Полное имя таблицы с иерархическими данными, как она задается в языке запросов.
// Например, "Справочник.Номенклатура".
//
//Возвращаемое значение:
// Число – Глубина (количество используемых уровней иерархии) указанной иерархической таблицы.
//
Функция ГлубинаТаб(ИерархическаяТабл) Экспорт
Результат = 0;
ТекстЗапроса = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ИсходнаяТаблица.Родитель КАК Родитель
|ПОМЕСТИТЬ вт_Родители0
|ИЗ
| "+ИерархическаяТабл+" КАК ИсходнаяТаблица
|";
Итерация = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ИсходнаяТаблица.Родитель КАК Родитель
|ПОМЕСТИТЬ вт_Родители#2
|ИЗ
| вт_Родители#1 КАК Родители
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ "+ИерархическаяТабл+" КАК ИсходнаяТаблица
|ПО
| Родители.Родитель = ИсходнаяТаблица.Ссылка
|;
|УНИЧТОЖИТЬ вт_Родители#1
|;
|";
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
КоличЭлементов = Выборка.Количество;
Иначе
КоличЭлементов = 0;
КонецЕсли;
Пока КоличЭлементов <> 0 Цикл
ТекстЗапроса2 = СтрЗаменить(Итерация, "#1", Формат(Результат, "ЧН=0; ЧГ=0"));
Результат = Результат +1;
Запрос.Текст = СтрЗаменить(ТекстЗапроса2, "#2", Формат(Результат, "ЧН=0; ЧГ=0"));
ЗапросРезультаты = Запрос.ВыполнитьПакет();
Выборка = ЗапросРезультаты[0].Выбрать();
Если Выборка.Следующий() Тогда
КоличЭлементов = Выборка.Количество;
Иначе
КоличЭлементов = 0;
КонецЕсли;
КонецЦикла;
// Перед выходом удалим последнюю временную таблицу.
Запрос.Текст = СтрЗаменить("УНИЧТОЖИТЬ вт_Родители#1", "#1", Формат(Результат, "ЧН=0; ЧГ=0"));
Запрос.Выполнить();
Возврат Результат;
КонецФункции
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник