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

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

Как получить группу в 1С: практическое руководство

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

Фраза «получить группу в 1С» объединяет три разные задачи. Первая — найти ссылку на группу (папку) иерархического справочника, например группу «Услуги» в справочнике «Номенклатура», чтобы использовать её в коде, отборе или при создании элементов. Вторая — проверить, входит ли конкретный элемент в нужную группу, включая все её подгруппы. Третья — работа с группами доступа и группами пользователей, когда нужно выдать сотруднику права на определённые данные.

Способ решения зависит от того, где вы работаете: в режиме «Предприятие» через интерфейс, в конфигураторе с помощью встроенного языка, в консоли запросов или в настройках прав. Ниже разобраны все основные сценарии с готовыми примерами кода, которые работают в типовых конфигурациях на управляемых формах (Бухгалтерия, Управление торговлей, ERP, Зарплата и управление персоналом).

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

Что такое группа в 1С и какие виды групп существуют

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

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

Дальше в статье основное внимание уделено группам справочников, поскольку именно эта задача возникает чаще всего у разработчиков и внедренцев. Работа с группами доступа разобрана в отдельном разделе.

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

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

bsl
ГруппаУслуги = Справочники.Номенклатура.НайтиПоНаименованию("Услуги", Истина);
Если ГруппаУслуги.Пустая() Тогда
    Сообщить("Группа не найдена");
ИначеЕсли Не ГруппаУслуги.ЭтоГруппа Тогда
    Сообщить("Найден элемент, а не группа");
КонецЕсли;

Второй параметр Истина означает поиск по точному соответствию наименования. Если групп с одинаковым наименованием несколько (например, «Прочее» есть в нескольких родительских группах), уточняйте поиск третьим параметром — ссылкой на родителя. Это защищает от ситуации, когда код находит «не ту» папку и новые элементы попадают в чужую ветку иерархии.

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

Получение предопределённой группы

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

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

В запросе группы выбираются условием по служебному полю ЭтоГруппа. Типовой запрос для получения списка всех групп справочника выглядит так:

bsl
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Группа,
    Номенклатура.Наименование КАК Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.ЭтоГруппа = ИСТИНА
    И НЕ Номенклатура.ПометкаУдаления

Чтобы получить одну конкретную группу по наименованию, добавьте в секцию ГДЕ условие Номенклатура.Наименование = &Наименование и передайте параметр через Запрос.УстановитьПараметр("Наименование", "Услуги"). Результат удобно получать методом Выбрать() или Выгрузить() в таблицу значений.

Для проверки принадлежности элемента группе с учётом всех вложенных подгрупп используется оператор В ИЕРАРХИИ. Он незаменим в отборах отчётов и динамических списков: ГДЕ Номенклатура.Ссылка В ИЕРАРХИИ(&Группа). Условие вернёт истину и для самих элементов группы, и для элементов всех её подгрупп любого уровня вложенности.

Ограничение по уровню вложенности

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

Как создать группу, если её нет

Типовой приём «найди или создай» выглядит так: сначала выполняется поиск, а если группа не найдена — создаётся новая через СоздатьГруппу(). Обязательно укажите родителя, если группа должна лежать внутри другой папки, иначе она попадёт в корень справочника.

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

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

Как проверить, что элемент входит в группу

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

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

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

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

Ссылка на группу получена
Норма

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

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

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

Принадлежность элемента группе
Норма

Запрос с В ИЕРАРХИИ возвращает элемент

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

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

Новая группа создана
Норма

Группа видна в списке справочника в нужном родителе

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

Группа появилась в корне или не сохранилась

Как получить группу доступа и выдать права пользователю

Если под «получить группу» понимается доступ к данным, в типовых конфигурациях на БСП (библиотеке стандартных подсистем) права настраиваются через профили и группы доступа. Путь в интерфейсе: «Администрирование» → «Настройка прав и пользователей» → «Профили групп доступа» и «Группы доступа». Пользователь включается в группу доступа, а профиль определяет набор ролей.

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

Маршрут решения

Как выбрать действие

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

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

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

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

В крупных базах удобно хранить ссылки на часто используемые группы в константах или в регистре сведений с настройками. Тогда администратор может поменять группу через интерфейс, не привлекая разработчика и не меняя код.
ПЗ
Практическое замечание

Ещё одна рабочая практика — при поиске групп учитывать регистр и лишние пробелы. Наименование «Услуги » с пробелом в конце не будет найдено точным сравнением. Перед поиском применяйте СокрЛП к строке поиска, а при критичности результата — ищите через запрос с ПОДОБНО и последующей ручной проверкой кандидатов.

Итог

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

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

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

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

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

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

Чаще всего причины три: лишние пробелы или невидимые символы в наименовании, поиск без флага точного соответствия при частичном совпадении, либо группа находится в другой информационной базе или в обмене ещё не загружена. Проверьте наименование через запрос с ПОДОБНО и сравните посимвольно.

Можно ли получить группу по коду справочника?

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

Как запретить выбирать группу в документе?

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

Чем группа пользователей отличается от группы доступа?

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

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

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