| Родитель в справочникеКлючевые слова: родитель, элемент, группа, справочник, перенос
 
 
 Родитель – это группа (папка), которой принадлежит элемент.
 
 Основные методы работы с родителем:
 
 Все примеры рассматриваются для справочников, в которых установлен Переключатель "Серии Кодов" - "Во всем справочнике"
 Иначе, используемая автором функция Спр.НайтиПоКоду() мягко говоря может дать непредсказуемый результат.
 
 Выбор всех элементов, принадлежащих группе:
 
 
 
    //Выбираем элементы, лежащие в группе с кодом Гл005172
    Спр = СоздатьОбъект("Справочник.Номенклатура");
    Если Спр.НайтиПоКоду("Гл005172") = 1 Тогда
        Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент());
    КонецЕсли;
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        Сообщить(Спр.ТекущийЭлемент());
    КонецЦикла;    
 Выбор элементов, непосредственно принадлежащих выбранной группе.
 
 
 
    //Выбираем элементы, непосредственно принадлежащих группе с кодом Гл005172
    Спр = СоздатьОбъект("Справочник.Номенклатура");
    Если Спр.НайтиПоКоду("Гл005172") = 1 Тогда
        Ур = Спр.ТекущийЭлемент().Уровень() + 1;
        Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент());
        Спр.ВыбратьЭлементы();
        Пока Спр.ПолучитьЭлемент() = 1 Цикл
            Если Спр.ТекущийЭлемент().Уровень() = Ур Тогда
                Сообщить(Спр.ТекущийЭлемент());
            КонецЕсли;
        КонецЦикла;    
    КонецЕсли;
Здесь проверяется уровень элементов и выбираются только те, чей уровень на 1 больше, чем у выбранной группы. Если нужно выбрать только элементы без групп, тогда нужно добавить проверку на ЭтоГруппа().
 А если заюзать чудный метод <ВключатьПодчиненные()/IncludeChildren()/>, то код можно сделать проще:
 
 
    //Выбираем элементы, непосредственно принадлежащих группе с кодом Гл005172
    Спр = СоздатьОбъект("Справочник.Номенклатура");
    Если Спр.НайтиПоКоду("Гл005172") = 1 Тогда
//        Ур = Спр.ТекущийЭлемент().Уровень() + 1;
        Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент());
        Спр.ВключатьПодчиненные(0); //<--
        Спр.ВыбратьЭлементы();
        Пока Спр.ПолучитьЭлемент() = 1 Цикл
//            Если Спр.ТекущийЭлемент().Уровень() = Ур Тогда
                Сообщить(Спр.ТекущийЭлемент());
//            КонецЕсли;
        КонецЦикла;    
    КонецЕсли;
 Изменение родителя уже существующего элемента:
 
 
 
    //Переносим элемент с кодом Гл000485 в группу с кодом Гл005172
    Спр = СоздатьОбъект("Справочник.Номенклатура");
    Если Спр.НайтиПоКоду("Гл005172") = 1 Тогда
        Род = Спр.ТекущийЭлемент();
        Если Спр.НайтиПоКоду("Гл000485") = 1 Тогда
            Спр.Родитель = Род;
            Спр.Записать();
        КонецЕсли;    
    КонецЕсли;    
 p.s. Обратите внимание на Спр.Записать() – часто забывают это сделать и изменения не принимаются J
 p.p.s Обратите внимание на Спр.Родитель = Род. Часто пишут  Спр.ТекущийЭлемент().Родитель = Род и получают ошибку о невозможности перепозиционироваться.
 
 
 Перенос элементов из одной группы в другую:
 
 
 
    //Перенос всех элементов из группы с кодом Гл000476 в группу с кодом Гл005172
    Спр = СоздатьОбъект("Справочник.Номенклатура");
    Справ = СоздатьОбъект("Справочник.Номенклатура");
    Если Спр.НайтиПоКоду("Гл005172") = 1 Тогда
        Род = Спр.ТекущийЭлемент();
        Если Спр.НайтиПоКоду("Гл000476") = 1 Тогда
            Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент());
            Пока Спр.ВыбратьЭлементы() = 1 Цикл
                Спр.ПолучитьЭлемент();
                Спр.Родитель = Род;    
                Спр.Записать();
            КонецЦикла;        
        КонецЕсли;    
    КонецЕсли;    
 Перенос из одной группы в другую только элементов, без групп:
 
 
 
    //Перенос всех элементов из группы с кодом Гл000476 в группу с кодом Гл005172
    Спр = СоздатьОбъект("Справочник.Номенклатура");
    Если Спр.НайтиПоКоду("Гл005172") = 1 Тогда
        Род = Спр.ТекущийЭлемент();
        Если Спр.НайтиПоКоду("Гл000476") = 1 Тогда
            Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент());
            nn = 0;
Пока nn = 0 Цикл
    nn = 1;
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
                    Если Спр.ЭтоГруппа() = 0 Тогда
Спр.Родитель = Род;    
                        Спр.Записать();
                        nn = 0;
                    КонецЕсли;
                КонецЦикла;     
            КонецЦикла;       
        КонецЕсли;    
    КонецЕсли;    
 Сложность двух предыдущих задач состоит в том, что при смене Родителя сбивается выборка, и ее надо делать заново.
 Ну а чтобы не сбивалась выборка есть несколько способов:
 -получение этой выборки запросом;
 -получение этой выборки в список значений;
 -неэффективно, но как вариант, перебор всего справочника без учета подчинения с проверкой на принадлежность нужной группе;
 
 Для проверки принадлежности элемента группе следует использовать метод ПринадлежитГруппе().
 
 
 P.S. Самая распространенная ошибка - сравнение элемента справочника со строкой. Происходит из-за непонимания, что это разные типы данных.
 
 Неправильно:
 Если ЭлементСправочника = "Капуста" Тогда Правильно:
 Если ЭлементСправочника.Наименование = "Капуста" Тогда |