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