Родитель в справочнике Ключевые слова: родитель, элемент, группа, справочник, перенос
Родитель – это группа (папка), которой принадлежит элемент.
Основные методы работы с родителем:
Все примеры рассматриваются для справочников, в которых установлен Переключатель "Серии Кодов" - "Во всем справочнике"
Иначе, используемая автором функция Спр.НайтиПоКоду() мягко говоря может дать непредсказуемый результат.
Выбор всех элементов, принадлежащих группе:
//Выбираем элементы, лежащие в группе с кодом Гл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. Самая распространенная ошибка - сравнение элемента справочника со строкой. Происходит из-за непонимания, что это разные типы данных.
Неправильно: Если ЭлементСправочника = "Капуста" Тогда
Правильно: Если ЭлементСправочника.Наименование = "Капуста" Тогда |