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

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

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

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

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

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

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

Проверка настроек справочника перед созданием группы

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

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

Также проверьте длину наименования и кода. Если наименование группы из внешнего источника длиннее допустимого, платформа обрежет его или выдаст ошибку в зависимости от настроек. Лучше обрезать строку в коде явно с помощью Лев().

Базовый код создания группы

Минимальный сценарий состоит из трёх шагов: получить новый объект группы, заполнить реквизиты, записать. Метод СоздатьГруппу() вызывается у менеджера справочника и возвращает объект типа «СправочникОбъект» с признаком ЭтоГруппа = Истина.

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

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

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

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

Если у справочника есть дополнительные реквизиты, обязательные для заполнения, заполните их до вызова Записать(). Иначе сработает проверка заполнения, и запись будет отклонена с сообщением об ошибке.

bsl
НоваяГруппа = Справочники.Номенклатура.СоздатьГруппу();
НоваяГруппа.Наименование = "Строительные материалы";
НоваяГруппа.Записать();
Сообщить("Создана группа: " + НоваяГруппа.Ссылка);

Создание группы внутри другой группы

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

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

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

НоваяПодгруппа.Наименование = "Сухие смеси";

НоваяПодгруппа.Родитель = РодительскаяГруппа;

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

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

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

Проверка на дубли перед созданием

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

Функция ПолучитьГруппу(НаименованиеГруппы, Родитель)

Найденная = Справочники.Номенклатура.НайтиПоНаименованию(

НаименованиеГруппы, Истина, Родитель);

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

Возврат Найденная;

КонецЕсли;

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

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

НоваяГруппа.Родитель = Родитель;

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

Возврат НоваяГруппа.Ссылка;

КонецФункции

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

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

Особенности: клиент-сервер, транзакции и права

В управляемом приложении код создания групп должен выполняться на сервере. Директива &НаСервере или серверная процедура общего модуля — обязательное условие, поскольку обращение к Справочники на клиенте недоступно. При вызове с клиента передавайте на сервер только примитивные данные (наименования, уникальные идентификаторы).

Если создаётся много групп в рамках одной операции, оберните цикл в транзакцию (НачатьТранзакцию() … ЗафиксироватьТранзакцию()). Тогда при сбое в середине база не останется с частично созданной структурой. Учтите: длинные транзакции блокируют данные, поэтому для очень больших загрузок разумнее фиксировать порциями.

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

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

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

Нужно создать одну-две группы разовоИспользуйте простой код с СоздатьГруппу() в консоли кода или внешней обработке
Загружается многоуровневый классификатор из файлаНапишите функцию поиска-или-создания с кэшем в соответствии и транзакцией
Группы создаются регулярно при обменеИщите по уникальному идентификатору или коду, а не по наименованию
Справочник не иерархический, а группировка нужнаНе меняйте метаданные сразу — рассмотрите вариант отдельного реквизита-категории

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

Самая частая ошибка — вызов СоздатьГруппу() у неиерархического справочника. Платформа сообщит, что метод недоступен. Решение — включить иерархию в конфигураторе или пересмотреть структуру данных.

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

Также к типичным относятся дубли при повторном запуске обработки без поиска и потеря вложенности из-за поиска по наименованию без родителя. Обе проблемы решаются функцией «найти или создать», показанной выше.

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

Проверка результата

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

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

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

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

Группа в дереве справочника
Норма

Отображается как папка в нужной ветке

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

Группа в корне или не видна — проверьте Родителя и режим просмотра

Признак ЭтоГруппа
Норма

Истина у созданного объекта

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

Ложь — был создан элемент, а не группа

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

Одна группа в каждом родителе

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

Дубли — обработка запускалась без поиска существующих

Итог

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

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

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

Чем отличается СоздатьГруппу() от СоздатьЭлемент()?

Оба метода создают объект справочника, но СоздатьГруппу() возвращает объект с признаком ЭтоГруппа = Истина. Группа может быть родителем других объектов, элемент — нет. У групп также обычно недоступна часть реквизитов, если в конфигураторе для них установлено использование «Для элемента».

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

Напрямую — никак: метод СоздатьГруппу() будет недоступен. Варианты: включить свойство «Иерархический» в конфигураторе (с тестированием на копии) либо добавить реквизит «Категория» и группировать данные через него без изменения структуры метаданных.

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

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

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

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

Почему группа создаётся, но не видна в списке?

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

Как безопасно удалить созданные по ошибке группы?

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