Как найти группу номенклатуры по коду и определить её верхний уровень в иерархии 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие часто возникают задачи по работе со справочниками, имеющими иерархическую структуру. Наиболее распространенные вопросы: как найти конкретную группу по её коду и как, имея ссылку на вложенный элемент, «подняться» до самой верхней группы в дереве справочника. Разберем эти задачи по порядку.

Поиск группы справочника по коду

Многие разработчики сталкиваются с тем, что классические методы поиска кажутся неэффективными в сложных конфигурациях. Однако стандартные механизмы продолжают работать, если учитывать особенности платформы. Рассмотрим основной способ поиска через Запрос, который является наиболее универсальным и производительным инструментом в 1С v8.

Чтобы найти группу по коду, нам необходимо выполнить запрос к справочнику с условием на поле Код и флаг ЭтоГруппа. Это гарантирует, что мы получим именно группу, а не элемент с таким же кодом.

Разберем пример кода для реализации такого поиска:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Спр.Ссылка
    |ИЗ
    |    Справочник.Номенклатура КАК Спр
    |ГДЕ
    |    Спр.Код = &Код
    |    И Спр.ЭтоГруппа = ИСТИНА";

Запрос.УстановитьПараметр("Код", ИскомыйКод);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    // Работаем с найденной ссылкой
    ИскомаяГруппа = Выборка.Ссылка;
КонецЦикла;

Важное примечание: Использование метода НайтиПоКоду() менеджера справочника по-прежнему актуально. Однако, если вы работаете в типовых решениях, убедитесь, что код передается в правильном формате, учитывая префиксы базы данных или организации, если они используются в конкретной конфигурации.

Определение «верхней» группы элемента

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

Способ 1: Использование метода ПолныйКод

Для быстрого получения иерархического пути можно воспользоваться методом объекта ПолныйКод(). Этот метод возвращает строку, содержащую коды всех родительских элементов, разделенных символом «/». Анализируя эту строку, мы можем выделить код верхнего уровня.

Пример реализации через строковые функции:


// Получаем полный код элемента
СтрокаКодов = Объект.ПолныйКод();
// Выделяем часть до первого разделителя
ВерхняяГруппаКод = Лев(СтрокаКодов, Найти(СтрокаКодов, "/") - 1);

Способ 2: Использование итеративного цикла

Более надежный способ, исключающий работу со строками, — это обход иерархии вверх через обращение к свойству Родитель. Мы будем подниматься по цепочке родителей, пока не дойдем до элемента, у которого Родитель является пустой ссылкой.

Рассмотрим пример оптимальной функции:


Функция НайтиВерхнююГруппу(Элемент)
    Р = Элемент.Ссылка;
    // Цикл работает, пока у элемента есть родитель
    Пока НЕ Р.Родитель.Пустая() Цикл
        Р = Р.Родитель;
    КонецЦикла;
    Возврат Р;
КонецФункции

Этот метод считается стандартом разработки, так как он легко читается, быстро выполняется и не подвержен риску переполнения стека, который может возникнуть при глубокой рекурсии.

Советы по оптимизации

  1. Избегайте рекурсии: Хотя рекурсивные функции выглядят элегантно, для обхода иерархии справочников в 1С лучше использовать обычные циклы Пока. Это экономит ресурсы памяти сервера.
  2. Используйте ИЕРАРХИЯ в запросах: Если задача состоит не в поиске родителя, а в получении всей ветки (всех подчиненных элементов), используйте конструкцию ГДЕ Ссылка В ИЕРАРХИИ (&Родитель). Это работает значительно быстрее, чем программный перебор элементов в цикле.
  3. Проверка типов: При работе с иерархией всегда учитывайте свойство ЭтоГруппа, чтобы дифференцировать группы от конечных элементов номенклатуры в ваших алгоритмах.

Теперь вы обладаете достаточными знаниями для эффективного поиска групп и работы с иерархией справочников в любой типовой или самописной конфигурации 1С. Применяйте эти методы в зависимости от текущей задачи — для простого поиска выбирайте Запрос, а для анализа иерархии — итеративный обход через Родитель.

← На главную