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