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

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

Как обратиться к группе справочника в 1С

Как обратиться к группе справочника в 1С: поиск по наименованию и коду, создание групп, проверка ЭтоГруппа, работа с иерархией и типичные ошибки разработчика.

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

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

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

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

Ключевое отличие — системное свойство ЭтоГруппа. У групп оно равно Истина. Прикладные реквизиты справочника для групп обычно недоступны: если попытаться прочитать реквизит у объекта-группы, можно получить пустое значение или ошибку, в зависимости от настроек использования реквизита («Для элемента», «Для группы», «Для группы и элемента»). Этот параметр задаётся в конфигураторе в свойствах каждого реквизита.

Как найти группу по наименованию или коду

Самый частый сценарий — получить ссылку на существующую группу по её имени. Для этого используется метод менеджера справочника НайтиПоНаименованию(). Важен второй параметр: если передать Истина, поиск выполняется только среди групп; если Ложь — только среди элементов; если не указывать — среди всего справочника.

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

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

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

КонецЕсли;

Аналогично работает НайтиПоКоду() — он удобен, когда у групп заданы осмысленные коды, например при обмене с внешними системами. Оба метода возвращают ссылку, а не объект: для чтения реквизитов этого достаточно, а для изменения данных нужно вызвать ПолучитьОбъект().

Если наименование группы может встречаться на разных уровнях иерархии, добавьте третий параметр — ссылку на родителя. Тогда поиск ограничится конкретной веткой и исключит ошибочное обращение к одноимённой папке в другом разделе.

bsl
// Поиск группы внутри конкретного родителя
Родитель = Справочники.Номенклатура.НайтиПоНаименованию("Товары", Истина);
Группа = Справочники.Номенклатура.НайтиПоНаименованию("Материалы", Истина, Родитель);

Как создать новую группу программно

Для создания группы у менеджера справочника есть отдельный метод — СоздатьГруппу(). Использовать СоздатьЭлемент() с попыткой вручную выставить признак группы нельзя: свойство ЭтоГруппа доступно только для чтения и определяется способом создания объекта.

НоваяГруппа = Справочники.Номенклатура.СоздатьГруппу();

НоваяГруппа.Наименование = "Импортированные";

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

НоваяГруппа.Записать();

После вызова Записать() ссылка на новую группу доступна через НоваяГруппа.Ссылка — её можно сразу подставлять как родителя при создании элементов. Если справочник подчинён другому справочнику, перед записью нужно заполнить свойство Владелец, иначе запись завершится ошибкой.

Создание группы и проверка
  1. 1
    Вызовите Справочники.Имя.СоздатьГруппу()
  2. 2
    Заполните Наименование и при необходимости Родитель и Владелец
  3. 3
    Вызовите Записать() и перехватите возможное исключение
  4. 4
    Проверьте результат: откройте справочник в режиме предприятия и убедитесь, что папка появилась в нужной ветке

Как проверить, является ли ссылка группой

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

Если ТекущаяСсылка.ЭтоГруппа Тогда

// обработка группы

Иначе

// обработка элемента

КонецЕсли;

В запросах проверка выполняется через поле ЭтоГруппа или через параметр виртуальной таблицы. Учтите: в запросе это поле имеет тип «Булево», и условие записывается как ГДЕ Таблица.ЭтоГруппа = ИСТИНА. При выборке только «рабочих» элементов для отчётов группы почти всегда следует исключать, иначе в итогах появятся строки без прикладных данных.

Как получить группу по уникальному идентификатору и в запросе

При обмене данными группа часто передаётся как строка GUID. Получить ссылку можно методом ПолучитьСсылку() с объектом УникальныйИдентификатор. Перед использованием стоит проверить, что ссылка реально существует в базе, — иначе получите «битую» ссылку.

УИД = Новый УникальныйИдентификатор(СтрокаGUID);

ГруппаСсылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);

Если ГруппаСсылка.ПолучитьОбъект() = Неопределено Тогда

Сообщить("Объект с таким идентификатором отсутствует");

КонецЕсли;

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

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

Номенклатура.ЭтоГруппа = ИСТИНА

И НЕ Номенклатура.ПометкаУдаления

УПОРЯДОЧИТЬ ПО

Номенклатура.Ссылка ИЕРАРХИЯ

Конструкция УПОРЯДОЧИТЬ ПО Ссылка ИЕРАРХИЯ выстраивает результат в виде дерева: родительские группы идут перед вложенными. Это удобно для обхода выборки методом Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией).

Как назначить группу родителем и перенести элементы

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

ЭлементОбъект = ЭлементСсылка.ПолучитьОбъект();

ЭлементОбъект.Родитель = ГруппаСсылка;

ЭлементОбъект.Записать();

Два ограничения. Во-первых, родителем элемента может быть только группа (при иерархии списка); попытка назначить родителем обычный элемент вызовет ошибку при записи. Во-вторых, группу нельзя поместить внутрь самой себя или своего потомка — платформа контролирует зацикливание иерархии и откажет в записи.

Типичные ошибки при работе с группами

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

Типичные ошибки
01
Поиск группы методом НайтиПоНаименованию без второго параметра Истина — находится элемент с таким же именем или результат непредсказуем
02
Попытка создать группу через СоздатьЭлемент() и присвоить ЭтоГруппа — свойство доступно только для чтения, нужен метод СоздатьГруппу()
03
Чтение прикладного реквизита у группы, для которой реквизит настроен «Для элемента» — возвращается пустое значение без явной ошибки, что маскирует дефект логики
04
Использование ссылки, полученной по GUID, без проверки существования — дальше по коду возникает обращение к битой ссылке
05
Включение групп в выборку для отчёта по товарам — в итогах появляются пустые строки-папки

Отдельный случай — обращение к группе предопределённого элемента. Если группа создана в конфигураторе как предопределённая, её надёжнее получать по имени предопределённых данных: Справочники.Номенклатура.ИмяГруппы (в обычном приложении) или через ПредопределенноеЗначение("Справочник.Номенклатура.ИмяГруппы"). Такой способ устойчив к переименованию группы в пользовательском режиме.

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

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

Ссылка после поиска
Норма

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

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

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

Новая группа после записи
Норма

Видна в списке справочника как папка в нужной ветке

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

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

Перенос элемента
Норма

В форме элемента поле «Родитель» показывает целевую группу

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

Ошибка записи или элемент остался на прежнем месте

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

Можно ли превратить существующий элемент в группу?

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

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

Чаще всего не указан второй параметр Истина, либо в наименовании есть лишние пробелы или неразрывные пробелы, скопированные из внешнего источника. Проверьте также, не помечена ли группа на удаление — по умолчанию поиск такие объекты тоже находит, но логика обработки может их отфильтровывать.

Как получить всех потомков группы, включая вложенные уровни?

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

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

Да, если в конфигураторе в свойствах реквизита выбрано использование «Для группы» или «Для группы и элемента». По умолчанию реквизиты создаются «Для элемента», поэтому у групп они недоступны.

Чем группа отличается от предопределённого элемента?

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

Как удалить группу, в которой есть элементы?

Сначала пометьте группу на удаление, затем выполните штатную операцию «Удаление помеченных объектов». Платформа не даст удалить группу, пока в ней есть непомеченные элементы, — их нужно предварительно перенести или тоже пометить на удаление.

Итог

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

Группа справочника ищется через НайтиПоНаименованию или НайтиПоКоду с параметром Истина, создаётся только методом СоздатьГруппу(), а проверяется свойством ЭтоГруппа. Перед массовыми операциями с иерархией делайте резервную копию и проверяйте результат на небольшой выборке.