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