Набор записей регистра в виде иерархии по одному из измерений


Дано: Регистр сведений, одно из измерений которого — иерархический справочник.

Цель: Отображение в Управляемой форме данных регистра с группировкой по иерархии этого измерения. Причем отображаются только те группы, которые содержат элементы.

Пример: привяжем к справочнику «Организации» города , которые будем отображать с иерархией : Область/Город.

Создадим Р.С. (регистр сведений) с 2-мя измерениями : СтруктурнаяЕдиница (Тип:СправочникСсылка.Организации) у которого «включим» свойство «ведущий»  для того, чтобы можно было перейти из справочника Организации в набор записей Р.С.

Второе измерение: какой-нибудь иерархиический справочник городов.

В Управляемой форме Набора Записей Р.С. для основоного реквизита «Список» укажем, что это будет произвольный запрос, и в качестве Основной таблицы выберем наш справочник городов. (см.скрин). В модуле формы напишем несколько обработчиков событий формы.(см.листинг).

Ставим отображение в свойствах : список,  и при создании формы на сервере накладываем отбор на поле Ссылка списком родителей всех элементов справочника городов, принадлежащих конкретной Организации. Таким образом, при открытии мы видим самый верхний уровень справочника городов и только те группы, которые содержат города. При выборе элемента в списке проверяем : если это группа и текущее отображение — список, то меняем отображение на иерархический список и в качестве текущего родителя укажем выбранный элемент — эффект раскрытия группы, если же текущее отображение — иерархический список, меняем его на список и накладываем отбор списком родителей — переход на верхний уровень. Так же создадим команды добавление и удаление городов для конкретной Организации. Пример ,наверное, можно усложнить, если в справочнике городов уровней будет больше 2.

 

 

 


&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    //Вставить содержимое обработчика

    Если Параметры.Отбор.Количество() > 0 Тогда

        Для каждого пОтбор из Параметры.Отбор Цикл

            Если пОтбор.Ключ = «СтруктурнаяЕдиница» Тогда

                Параметры.СтруктурнаяЕдиница    =   пОтбор.Значение;

            КонецЕсли;

        КонецЦикла;

        Параметры.Отбор.Очистить();

    КонецЕсли;

    Параметры.СписокГородов.Очистить();

    Параметры.списокГрупп.Очистить();

    Параметры.СписокГородов.ЗагрузитьЗначения(УстановитьОтбор(Параметры.СтруктурнаяЕдиница,Параметры.списокГрупп));

    Отбор   =   Список.Отбор.Элементы;

    Отбор.Очистить();

    УсловиеОтбора                   =   Отбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    УсловиеОтбора.ЛевоеЗначение     =   Новый ПолеКомпоновкиДанных(«Ссылка»);

    УсловиеОтбора.ВидСравнения      =   ВидСравненияКомпоновкиДанных.ВСписке;

    УсловиеОтбора.ПравоеЗначение    =   Параметры.списокГрупп;

КонецПроцедуры

&НаКлиенте

Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

    // Вставить содержимое обработчика.

    СтандартнаяОбработка    =   Ложь;

    Если НЕ(ВыбраннаяСтрока = Неопределено) И ЗначениеЗаполнено(ВыбраннаяСтрока) И ВыбраннаяСтрока.ЭтоГруппа Тогда

        Если Элементы.Список.Отображение    = ОтображениеТаблицы.Список Тогда

            Элементы.Список.Отображение = ОтображениеТаблицы.ИерархическийСписок;

            Элементы.Список.ТекущийРодитель =   ВыбраннаяСтрока;

            Отбор   =   Список.Отбор.Элементы;

            Отбор.Очистить();

            УсловиеОтбора                   =   Отбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

            УсловиеОтбора.ЛевоеЗначение     =   Новый ПолеКомпоновкиДанных(«Ссылка»);

            УсловиеОтбора.ВидСравнения      =   ВидСравненияКомпоновкиДанных.ВСписке;

            УсловиеОтбора.ПравоеЗначение    =   Параметры.СписокГородов;

        ИначеЕсли Элементы.Список.Отображение   = ОтображениеТаблицы.ИерархическийСписок Тогда

            Элементы.Список.Отображение     =   ОтображениеТаблицы.Список;

            Элементы.Список.ТекущийРодитель =   Неопределено;

            Отбор                           =   Список.Отбор.Элементы;

            Отбор.Очистить();

            УсловиеОтбора                   =   Отбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

            УсловиеОтбора.ЛевоеЗначение     =   Новый ПолеКомпоновкиДанных(«Ссылка»);

            УсловиеОтбора.ВидСравнения      =   ВидСравненияКомпоновкиДанных.ВСписке;

            УсловиеОтбора.ПравоеЗначение    =   Параметры.списокГрупп;

        КонецЕсли;

    КонецЕсли;

КонецПроцедуры

&НаКлиенте

Процедура Добавить(Команда)

    // Вставить содержимое обработчика.

    Форма   =   Справочники.КонтТерритории.ПолучитьФормуВыбора(,ЭтаФорма);

    Если НЕ Элементы.Список.ТекущаяСтрока   =   Неопределено Тогда

        Если Элементы.Список.ТекущаяСтрока.ЭтоГруппа Тогда

            Спр =   Справочники.КонтТерритории.Выбрать(Элементы.Список.ТекущаяСтрока);

            Пока Спр.Следующий() и НЕ СПР.ЭтоГруппа Цикл

                Форма.ПараметрТекущаяСтрока = СПР.Ссылка;

                Прервать;

            КонецЦикла;

        КонецЕсли;

        Если НЕ ЗначениеЗаполнено(Форма.ПараметрТекущаяСтрока) Тогда

            Форма.ПараметрТекущаяСтрока = Элементы.Список.ТекущаяСтрока;

        КонецЕсли;

    КонецЕсли;

    Если НЕ ЗначениеЗаполнено(Форма.ПараметрТекущаяСтрока) и ЗначениеЗаполнено(Элементы.Список.ТекущийРодитель) Тогда

        Спр =   Справочники.КонтТерритории.Выбрать(Элементы.Список.ТекущийРодитель);

        Пока Спр.Следующий() и НЕ СПР.ЭтоГруппа Цикл

            Форма.ПараметрТекущаяСтрока = СПР.Ссылка;

            Прервать;

        КонецЦикла;

    КонецЕсли;

    Форма.ПараметрВыборГруппИЭлементов =    ИспользованиеГруппИЭлементов.Элементы;

    Выбор   =   Форма.ОткрытьМодально();

    Если НЕ(Выбор   =   Неопределено) и НЕ(ВыБОР    =   Справочники.КонтТерритории.ПустаяСсылка()) Тогда

        //Отбор                     =   Список.Отбор.Элементы;

        Запись                      =   РегистрыСведений.ТН_ФилиалГород.СоздатьМенеджерЗаписи();

        Запись.Город                =   Выбор;

        Запись.СтруктурнаяЕдиница  =    Параметры.СтруктурнаяЕдиница;

        Запись.Прочитать();

        Если НЕ Запись.Выбран() Тогда

            Запись                      =   РегистрыСведений.ТН_ФилиалГород.СоздатьМенеджерЗаписи();

            Запись.Город                    =   Выбор;

            Запись.СтруктурнаяЕдиница   =   Параметры.СтруктурнаяЕдиница;

            Запись.Записать();

            ОповеститьОбИзменении(Тип(«СправочникСсылка.КонтТерритории»));

            Если Элементы.Список.Отображение     =   ОтображениеТаблицы.ИерархическийСписок Тогда

                Параметры.СписокГородов.Очистить();

                Параметры.списокГрупп.Очистить();

                Параметры.СписокГородов.ЗагрузитьЗначения(УстановитьОтбор(Параметры.СтруктурнаяЕдиница,Параметры.списокГрупп));

                Элементы.Список.Отображение     =   ОтображениеТаблицы.ИерархическийСписок;

                Элементы.Список.ТекущийРодитель =   Запись.Город.Родитель;

                Элементы.Список.ТекущаяСтрока   =   Запись.Город;

                Отбор   =   Список.Отбор.Элементы;

                Отбор.Очистить();

                УсловиеОтбора                   =   Отбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

                УсловиеОтбора.ЛевоеЗначение     =   Новый ПолеКомпоновкиДанных(«Ссылка»);

                УсловиеОтбора.ВидСравнения      =   ВидСравненияКомпоновкиДанных.ВСписке;

                УсловиеОтбора.ПравоеЗначение    =   Параметры.СписокГородов;

            Иначе

                Параметры.СписокГородов.Очистить();

                Параметры.списокГрупп.Очистить();

                Параметры.СписокГородов.ЗагрузитьЗначения(УстановитьОтбор(Параметры.СтруктурнаяЕдиница,Параметры.списокГрупп));
               
Элементы.Список.Отображение     =   ОтображениеТаблицы.Список;

                Отбор   =   Список.Отбор.Элементы;

                Отбор.Очистить();

                УсловиеОтбора                   =   Отбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

                УсловиеОтбора.ЛевоеЗначение     =   Новый ПолеКомпоновкиДанных(«Ссылка»);

                УсловиеОтбора.ВидСравнения      =   ВидСравненияКомпоновкиДанных.ВСписке;

                УсловиеОтбора.ПравоеЗначение    =   Параметры.списокГрупп;

            КонецЕсли;

        КонецЕсли;

    КонецЕсли;

КонецПроцедуры

&НаКлиенте

Процедура Удалить(Команда)

    // Вставить содержимое обработчика.

    Если НЕ(Элементы.Список.ТекущаяСтрока   =   Неопределено) и (НЕ Элементы.Список.ТекущаяСтрока.ЭтоГруппа) Тогда

        //Отбор                     =   Список.Отбор.Элементы;

        Запись                      =   РегистрыСведений.ТН_ФилиалГород.СоздатьМенеджерЗаписи();

        Запись.Город                =   Элементы.Список.ТекущаяСтрока;

        Запись.СтруктурнаяЕдиница  =    Параметры.СтруктурнаяЕдиница;

        Запись.Прочитать();

        Если Запись.Выбран() Тогда

            Запись.Удалить();

            ОповеститьОбИзменении(Тип(«СправочникСсылка.КонтТерритории»));

            Параметры.СписокГородов.Очистить();

            Параметры.списокГрупп.Очистить();

            Параметры.СписокГородов.ЗагрузитьЗначения(УстановитьОтбор(Параметры.СтруктурнаяЕдиница,Параметры.списокГрупп));

            Если Элементы.Список.Отображение    = ОтображениеТаблицы.Список Тогда

                    Отбор   =   Список.Отбор.Элементы;

                    Отбор.Очистить();

                    УсловиеОтбора                   =   Отбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

                    УсловиеОтбора.ЛевоеЗначение     =   Новый ПолеКомпоновкиДанных(«Ссылка»);

                    УсловиеОтбора.ВидСравнения      =   ВидСравненияКомпоновкиДанных.ВСписке;

                    УсловиеОтбора.ПравоеЗначение    =   Параметры.списокГрупп;

            ИначеЕсли Элементы.Список.Отображение   = ОтображениеТаблицы.ИерархическийСписок Тогда

                    Отбор                           =   Список.Отбор.Элементы;

                    Отбор.Очистить();

                    УсловиеОтбора                   =   Отбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

                    УсловиеОтбора.ЛевоеЗначение     =   Новый ПолеКомпоновкиДанных(«Ссылка»);

                    УсловиеОтбора.ВидСравнения      =   ВидСравненияКомпоновкиДанных.ВСписке;

                    УсловиеОтбора.ПравоеЗначение    =   Параметры.СписокГородов;

            КонецЕсли;

        КонецЕсли;

    КонецЕсли;

КонецПроцедуры

&НаСервереБезКонтекста

фУНКЦИЯ УстановитьОтбор(СтруктурнаяЕдиница,списокГрупп)

    Если СтруктурнаяЕдиница =   Справочники.Организации.ПустаяСсылка() Тогда

        Возврат Новый СписокЗначений;

    КонецЕсли;

    Запрос  =   Новый Запрос;

    Запрос.Текст    =   «ВЫБРАТЬ

                        |   ТН_ФилиалГород.Город,

                        |   ТН_ФилиалГород.Город.Родитель КАК Родитель

                        |ИЗ

                        |   РегистрСведений.ТН_ФилиалГород КАК ТН_ФилиалГород

                        |ГДЕ

                        |   ТН_ФилиалГород.СтруктурнаяЕдиница = &СтруктурнаяЕдиница

                        |   И (НЕ ТН_ФилиалГород.Город.ЭтоГруппа)»;

    Запрос.УстановитьПараметр(«СтруктурнаяЕдиница»,СтруктурнаяЕдиница);

    табзн       =   Запрос.Выполнить().Выгрузить();

    списокГрупп.Очистить();

    списокГрупп.ЗагрузитьЗначения(табзн.ВыгрузитьКолонку(«Родитель»));

    Возврат  табзн.ВыгрузитьКолонку(«Город»);

КонецфУНКЦИИ

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *