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