К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как выбрать группу в 1С 8

Как выбрать группу в 1С 8: отбор по группе в запросе В ИЕРАРХИИ, программный поиск по наименованию, выбор группы на форме и типичные ошибки.

Группа в 1С 8 — это элемент справочника с признаком «ЭтоГруппа», который служит для иерархической организации данных: номенклатуры, контрагентов, статей расходов и других объектов. Выбор группы требуется в трёх типовых сценариях: в запросе при получении данных, программно из кода на встроенном языке и на форме при интерактивной работе пользователя.

Каждый из сценариев имеет свои особенности. В запросе важно правильно использовать оператор В ИЕРАРХИИ, чтобы захватить вложенные подгруппы. При программном поиске нужно помнить, что НайтиПоНаименованию по умолчанию ищет только внутри указанного родителя. На форме выбор группы часто блокируется стандартным параметром, и его нужно включить явно.

Ниже разобраны все три подхода с готовыми примерами кода, способами проверки результата и типичными ошибками, из-за которых группа «не выбирается» или в отбор попадают лишние элементы.

Как устроены группы в иерархических справочниках

Иерархический справочник в 1С 8 хранит элементы в виде дерева. Узлы дерева — это группы (папки), листья — обычные элементы. У каждого элемента есть реквизит Родитель, содержащий ссылку на группу, в которую он входит. У элементов верхнего уровня родитель пустой.

Тип иерархии задаётся в конфигураторе и бывает двух видов: «иерархия групп и элементов» (классический вариант для номенклатуры) и «иерархия элементов» (групп как отдельного вида объектов нет, любой элемент может быть родителем). От типа зависит, какие методы и условия доступны: свойство ЭтоГруппа существует только у справочников с иерархией групп и элементов.

Это важно учитывать перед написанием кода: если попытаться обратиться к свойству ЭтоГруппа у справочника с иерархией элементов, получите ошибку исполнения. Проверить тип иерархии можно в конфигураторе в свойствах справочника на закладке «Иерархия».

Выбор группы в запросе через В ИЕРАРХИИ

Наиболее частая задача — выбрать все элементы, входящие в группу, включая вложенные подгруппы любой глубины. Для этого служит оператор В ИЕРАРХИИ, который автоматически обходит всё поддерево:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)

| И НЕ Номенклатура.ЭтоГруппа";

Запрос.УстановитьПараметр("Группа", ГруппаСсылка);

Результат = Запрос.Выполнить().Выгрузить();

Условие НЕ ЭтоГруппа отсекает сами группы из результата — без него в выборку попадут и папки, что обычно не нужно при выгрузке товаров или контрагентов. Если требуются только элементы непосредственно в группе, без вложенных, замените условие на Номенклатура.Родитель = &Группа.

Как выбрать сами группы, а не элементы

Если нужен список групп внутри заданной (например, для построения дерева на форме), условие инвертируется: ЭтоГруппа = ИСТИНА, а отбор по родителю или иерархии остаётся. Для получения всех групп верхнего уровня используйте условие Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка).

Программный поиск группы по наименованию или коду

Когда группа известна по имени, а нужна ссылка для запроса или отбора, используйте методы менеджера справочника. Базовый вариант — НайтиПоНаименованию:

Группа = Справочники.Номенклатура.НайтиПоНаименованию("Материалы", Истина);

Если Группа.Пустая() Тогда

Сообщить("Группа не найдена");

КонецЕсли;

Второй параметр Истина означает поиск по точному соответствию. Если его опустить или указать Ложь, платформа найдёт первую группу, наименование которой начинается с заданной строки, — это частый источник ошибок, когда находится «Материалы строительные» вместо «Материалы».

Третий параметр метода — родитель, внутри которого искать. Если одноимённые группы есть в разных ветках дерева (например, «Услуги» в разделах «Продажи» и «Закупки»), обязательно передавайте родителя, иначе найдётся первая попавшаяся группа. Для поиска по коду используйте НайтиПоКоду с аналогичными параметрами — он надёжнее, если коды уникальны и заданы осмысленно.

Проверка, что найденное — именно группа

НайтиПоНаименованию не различает группы и элементы: если наименование совпало с обычным элементом, вернётся он. Добавьте проверку через свойство ЭтоГруппа, чтобы не передать элемент туда, где ожидается группа:

Если Не Группа.Пустая() И Не Группа.ЭтоГруппа Тогда

Сообщить("Найден элемент, а не группа");

КонецЕсли;

Порядок действий при программном выборе группы
  1. 1
    Определите, что известно о группе: наименование, код или родитель
  2. 2
    Найдите ссылку через НайтиПоНаименованию или НайтиПоКоду с точным соответствием
  3. 3
    Проверьте, что ссылка не пустая и ЭтоГруппа = Истина
  4. 4
    Передайте ссылку в запрос с условием В ИЕРАРХИИ или в отбор
  5. 5
    Проверьте результат на контрольном наборе данных с вложенными подгруппами

Выбор группы на форме и в поле ввода

В управляемых формах поле ввода со ссылкой на иерархический справочник по умолчанию часто показывает только элементы — группы в списке выбора недоступны. За это отвечает свойство поля «Выбор групп и элементов» (в коде — параметр ВыборГруппИЭлементов). Чтобы пользователь мог выбрать группу, установите в конфигураторе у поля значение «Группы и элементы» или «Группы».

Программно то же самое делается при открытии формы выбора через параметры:

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("РежимВыбора", Истина);

ПараметрыФормы.Вставить("ВыборГруппИЭлементов",

ИспользованиеГруппИЭлементов.Группы);

ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора",

ПараметрыФормы, Элемент);

Значение Группы разрешит выбирать только папки, ГруппыИЭлементы — и то и другое, Элементы — только элементы. Этот же параметр работает в динамических списках и полях отбора отчётов на СКД.

Отбор по группе в списке справочника

Чтобы показать пользователю только содержимое конкретной группы, установите отбор динамического списка по полю Родитель (только прямое содержимое) или добавьте условие В ИЕРАРХИИ в произвольный запрос списка (с учётом вложенности). Для отбора по родителю достаточно элемента отбора ЭлементОтбора с видом сравнения «Равно».

Типичные ошибки
01
Поиск по наименованию без второго параметра Истина — находится похожая, но не та группа
02
Отбор по Родитель вместо В ИЕРАРХИИ — элементы из вложенных подгрупп теряются
03
Забыто условие НЕ ЭтоГруппа — в выборку товаров попадают папки
04
Игнорирование родителя при поиске — при одноимённых группах выбирается чужая ветка
05
На форме не включён ВыборГруппИЭлементов — пользователь физически не может выбрать группу

Выбор группы в отчётах на СКД и в отборах

В отчётах на системе компоновки данных пользователь выбирает группу через отбор. Чтобы отбор работал с учётом вложенных подгрупп, вид сравнения должен быть «В иерархии» — он доступен для ссылочных полей иерархических справочников автоматически. В настройках отчёта это стандартный элемент отбора, дополнительного кода не требуется.

Если группа должна быть задана жёстко, без возможности изменения пользователем, используйте параметр данных в запросе СКД с условием В ИЕРАРХИИ(&Группа) и снимите у параметра флаг «Доступен пользователю». Так отчёт всегда будет строиться по нужной ветке дерева независимо от настроек.

Контрольные точки

Как проверить результат

Состав выборки
Норма

В результат входят элементы группы и всех вложенных подгрупп

Тревожный признак

Элементов из подгрупп нет — использован отбор по Родитель вместо В ИЕРАРХИИ

Наличие групп в выборке
Норма

Только элементы, папок нет

Тревожный признак

В списке присутствуют группы — пропущено условие НЕ ЭтоГруппа

Найденная ссылка
Норма

Ссылка не пустая, ЭтоГруппа = Истина, родитель соответствует ожиданиям

Тревожный признак

Пустая ссылка или найден элемент с тем же наименованием

Поле выбора на форме
Норма

В диалоге выбора доступны группы

Тревожный признак

Группы не отображаются — не установлен параметр ВыборГруппИЭлементов

Ограничения и безопасные границы

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

Учтите, что обход больших иерархий оператором В ИЕРАРХИИ может быть ресурсоёмким на справочниках с сотнями тысяч элементов. В таких случаях ограничивайте выборку дополнительными условиями (по пометке удаления, владельцу, периоду) и проверяйте план запроса на копии базы.

Частые вопросы

Как выбрать только элементы верхнего уровня без группы?

Используйте условие Родитель = ЗНАЧЕНИЕ(Справочник.Имя.ПустаяСсылка) — так отбираются элементы и группы, не входящие ни в одну папку. При необходимости добавьте условие по ЭтоГруппа, чтобы оставить только элементы или только группы.

Почему НайтиПоНаименованию возвращает пустую ссылку, хотя группа есть?

Чаще всего наименование задано с лишними пробелами или в другом регистре части символов, либо поиск ведётся не в том родителе. Проверьте точное наименование через список справочника и попробуйте поиск по коду.

Можно ли выбрать элементы сразу нескольких групп?

Да. Передайте в параметр список значений или массив ссылок на группы и используйте условие В ИЕРАРХИИ(&СписокГрупп) — оператор корректно работает со списком.

Как разрешить выбор групп в обычном приложении (обычные формы)?

В обычных формах у поля ввода есть свойство «Выбор групп» — установите его в конфигураторе. Также выбор группы доступен в диалоге выбора при соответствующей настройке формы списка.

Чем отличается В ИЕРАРХИИ от условия по Родитель?

Родитель = &Группа выбирает только прямое содержимое группы. В ИЕРАРХИИ обходит всё поддерево на любую глубину, включая элементы вложенных подгрупп.

Итог

Что важно запомнить

В запросах используйте В ИЕРАРХИИ для захвата вложенных подгрупп и НЕ ЭтоГруппа для исключения папок. Программно ищите группу с точным соответствием и проверкой ЭтоГруппа. На форме выбор групп включается параметром ВыборГруппИЭлементов. Перед массовыми операциями по выбранной группе делайте резервную копию.