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