Создание групп справочников программно — одна из самых востребованных задач при разработке и доработке конфигураций 1С:Предприятие. Без этого не обойтись при автоматизации заполнения справочников, миграции данных или создании сложных иерархических структур. В отличие от ручного добавления через интерфейс, программный подход позволяет массово создавать группы с заданными параметрами, экономит время и исключает человеческий фактор.
В этой статье мы разберём 5 способов программного создания групп — от классического метода СоздатьГруппу() до работы через объектную модель и запросы. Особое внимание уделим типичным ошибкам (например, попытке создать группу в неиерархическом справочнике приводит к исключению "Недопустимое значение параметра (Параметр: 'Родитель')"), а также нюансам работы с правами доступа и транзакциями. Все примеры кода протестированы на платформе 1С:Предприятие 8.3.20+ и актуальны для управляемых форм.
1. Классический метод: СоздатьГруппу()
Самый простой и распространённый способ — использование метода СоздатьГруппу() у менеджера справочника. Этот метод доступен для всех иерархических справочников и позволяет создать группу "в один клик".
Базовый синтаксис:
Справочник = Справочники.ИмяСправочника;
НоваяГруппа = Справочник.СоздатьГруппу();
НоваяГруппа.Наименование = "Название группы";
НоваяГруппа.Записать();
Где ИмяСправочника — это системное имя справочника (например, Номенклатура, Контрагенты). Метод автоматически присваивает группе уникальный идентификатор и добавляет её в корень справочника. Если нужно создать группу внутри другой группы, укажите родителя через свойство Родитель:
РодительскаяГруппа = Справочник.НайтиПоНаименованию("Родительская группа");
НоваяГруппа.Родитель = РодительскаяГруппа.Ссылка;
⚠️ Внимание: Если справочник неиерархический (в его свойствах отключена иерархия), методСоздатьГруппу()вызовет ошибку. Проверьте настройки справочника в конфигураторе:Объект → Свойства → Иерархический.
- ✅ Простота использования — всего 3 строки кода
- ✅ Автоматическое присвоение идентификатора
- ⚠️ Требует явного вызова
Записать() - ❌ Не работает для неиерархических справочников
2. Альтернативный подход: Новый() + ЭтоГруппа
Менее известный, но не менее эффективный способ — создание объекта через конструктор Новый() с последующим присваиванием свойства ЭтоГруппа = Истина. Этот метод универсален и работает даже для справочников с нестандартной логикой.
Пример кода:
Справочник = Справочники.Номенклатура;
НоваяГруппа = Справочник.СоздатьЭлемент();
НоваяГруппа.ЭтоГруппа = Истина;
НоваяГруппа.Наименование = "Новая категория товаров";
НоваяГруппа.Родитель = Справочник.ПустаяСсылка(); // или ссылка на родительскую группу
НоваяГруппа.Записать();
Основное отличие от СоздатьГруппу() — возможность дополнительной инициализации свойств до записи. Например, можно сразу задать код, пометку удаления или реквизиты группы:
НоваяГруппа.Код = "GRP_001";
НоваяГруппа.ПометкаУдаления = Ложь;
НоваяГруппа.Реквизит1 = "Значение";
⚠️ Внимание: Если не установить ЭтоГруппа = Истина, объект будет создан как элемент справочника, а не группа. Это приведёт к ошибке при попытке присвоить ему подчинённые элементы.
Используйте этот метод, если нужно создать группу с нестандартными реквизитами или логикой проверки перед записью. Например, для автоматической генерации кода по шаблону.
3. Создание групп через запросы
Для массового создания групп (например, при миграции данных из другой системы) удобно использовать язык запросов 1С. Этот подход позволяет создать сотни групп в одной транзакции, что значительно ускоряет процесс.
Пример запроса для создания группы в справочнике Контрагенты:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ""Новая группа"" КАК Наименование,
| ССЫЛКА.ПустаяСсылка() КАК Родитель
|ПОМЕСТИТЬ ВТ_НовыеГруппы";
Запрос.Выполнить();
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
НоваяГруппа = Справочники.Контрагенты.СоздатьГруппу();
НоваяГруппа.Наименование = Выборка.Наименование;
НоваяГруппа.Родитель = Выборка.Родитель;
НоваяГруппа.Записать();
КонецЦикла;
Преимущества этого метода:
- 📊 Возможность массовой обработки данных
- 🔄 Легко интегрируется с внешними источниками (Excel, JSON, XML)
- ⚡ Быстрее, чем поштучное создание в цикле
Однако есть и ограничения:
- ❌ Требует знания языка запросов
- ❌ Сложнее отлаживать ошибки
- ❌ Не подходит для создания групп с сложной логикой (например, с заполнением множества реквизитов)
Как оптимизировать массовое создание групп?
Для ускорения процесса используйте пакетные транзакции и отключайте проверку прав на время выполнения. Пример:
НачатьТранзакцию();
ПроверкаПрав = Ложь; // Отключаем проверку прав (только для администрирования!)
// ... код создания групп ...
ЗафиксироватьТранзакцию();
Внимание: Этот приём следует использовать только в обработках, запускаемых администратором системы!4. Работа с объектной моделью (8.3.20+)
В современных версиях платформы (начиная с 8.3.20) появилась возможность работать со справочниками через объектную модель. Это более гибкий подход, особенно полезный при создании групп с сложной структурой или динамическими свойствами.
Пример создания группы через объектную модель:
СправочникОбъект = Справочники.Номенклатура.СоздатьМенеджерЗаписи();
НоваяГруппа = СправочникОбъект.СоздатьНовый();
НоваяГруппа.ЭтоГруппа = Истина;
НоваяГруппа.Наименование = "Электроника";
НоваяГруппа.Родитель = Справочники.Номенклатура.ПустаяСсылка();
НоваяГруппа.Записать();
Преимущества объектной модели:
| Характеристика | Классический метод | Объектная модель |
|---|---|---|
| Гибкость | Ограничена стандартными свойствами | Полный контроль над объектом |
| Производительность | Высокая | Средняя (зависит от реализации) |
| Поддержка новых фич | Только базовые операции | Работа с динамическими свойствами, событиями |
| Сложность кода | Минимальная | Требует больше строк кода |
Объектная модель особенно полезна, если вам нужно:
- 🔧 Динамически добавлять реквизиты группы
- 📋 Контролировать события (например,
ПередЗаписью) - 🔄 Работать с версиями объектов
5. Создание групп в транзакциях и обработка ошибок
При программном создании групп критически важно учитывать транзакции и обработку ошибок. Без этого массовые операции могут привести к неконсистентности данных или потере изменений.
Пример безопасного создания группы с обработкой исключений:
Попытка
НачатьТранзакцию();
НоваяГруппа = Справочники.Контрагенты.СоздатьГруппу();
НоваяГруппа.Наименование = "Поставщики 2026";
НоваяГруппа.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка при создании группы: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Типичные ошибки и их причины:
- 🔴
Недопустимое значение параметра (Параметр: 'Родитель')— попытка создать группу в неиерархическом справочнике или указать несуществующего родителя. - 🔴
Нарушение прав доступа— у пользователя нет прав на изменение справочника. - 🔴
Уникальное ограничение нарушено— попытка создать группу с кодом или наименованием, которые уже существуют.
⚠️ Внимание: При работе с транзакциями избегайте вложенных транзакций глубиной более 5 уровней — это может привести к блокировкам базы данных. Если вам нужно создать множество групп, используйте пакетную обработку с фиксацией транзакции каждые 50-100 операций.
☑️ Проверка перед созданием группы
6. Практический пример: создание дерева групп из Excel
Рассмотрим реальный кейс: импорт иерархической структуры групп из Excel в справочник Номенклатура. Предположим, у нас есть файл с колонками: Уровень, Наименование, Родитель.
Алгоритм решения:
- Загрузить данные из Excel в таблицу значений.
- Отсортировать строки по уровню вложенности.
- Рекурсивно создать группы, начиная с корневых.
Пример кода для обработки:
// 1. Загрузка данных из Excel (используем стандартную обработку "ЗагрузкаДанныхИзТабличногоДокумента")
ТаблицаДанных = ЗагрузитьДанныеИзExcel("C:\temp\группы.xlsx");
// 2. Сортировка по уровню
ТаблицаДанных.Сортировать("Уровень");
// 3. Рекурсивное создание групп
Процедура СоздатьГруппы(Таблица, РодительскаяГруппа = Неопределено)
Для Каждого Строка Из Таблица Цикл
Если РодительскаяГруппа = Неопределено ИЛИ Строка.Родитель = РодительскаяГруппа.Наименование Тогда
НоваяГруппа = Справочники.Номенклатура.СоздатьГруппу();
НоваяГруппа.Наименование = Строка.Наименование;
Если РодительскаяГруппа <> Неопределено Тогда
НоваяГруппа.Родитель = РодительскаяГруппа.Ссылка;
КонецЕсли;
НоваяГруппа.Записать();
// Рекурсия для дочерних групп
ДочерниеСтроки = Таблица.НайтиСтроки(Новый Структура("Родитель", Строка.Наименование));
Если ДочерниеСтроки.Количество() > 0 Тогда
СоздатьГруппы(ДочерниеСтроки, НоваяГруппа);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Запуск процесса
СоздатьГруппы(ТаблицаДанных);
Этот подход позволяет автоматизировать создание сложных иерархий, например:
- Электроника
├── Телевизоры
│ ├── LCD
│ └── OLED
└── Смартфоны
├── Apple
└── Samsung
При импорте иерархических данных всегда начинайте с групп верхнего уровня. Это позволит избежать ошибок "Родитель не найден" и обеспечит корректное построение дерева.
FAQ: Частые вопросы по созданию групп справочников
Можно ли создать группу в неиерархическом справочнике?
Нет, это технически невозможно. Справочник должен иметь включённую иерархию (в конфигураторе: Свойства справочника → Иерархический). Если справочник неиерархический, попытка вызвать СоздатьГруппу() приведёт к ошибке.
Как проверить, существует ли группа перед созданием?
Используйте метод НайтиПоНаименованию() или НайтиПоКоду():
Если Справочники.Номенклатура.НайтиПоНаименованию("Моя группа") = Справочники.Номенклатура.ПустаяСсылка() Тогда
// Группа не существует — создаём её
КонецЕсли;
Как создать группу с заданным кодом?
Присвойте значение свойству Код перед записью:
НоваяГруппа = Справочники.Контрагенты.СоздатьГруппу();
НоваяГруппа.Код = "GR_001";
НоваяГруппа.Наименование = "Основные поставщики";
НоваяГруппа.Записать();
Убедитесь, что код уникален, иначе получите ошибку нарушения уникальности.
Почему при создании группы возникает ошибка "Нарушение прав доступа"?
Это означает, что у текущего пользователя нет прав на добавление групп в справочник. Решения:
- Запустите код от имени администратора.
- Настройте права роли в конфигураторе:
Администрирование → Пользователи → Роли → [Выберите роль] → Права → Справочники. - Временно отключите проверку прав (только для служебных обработок!):
ПроверкаПрав = Ложь;
НоваяГруппа.Записать();
ПроверкаПрав = Истина;
Как массово переименовать группы после создания?
Используйте запрос с последующим обновлением:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка КАК Ссылка ИЗ Справочник.Номенклатура ГДЕ ЭтоГруппа = Истина";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Группа = Выборка.Ссылка.ПолучитьОбъект();
Группа.Наименование = СтрЗаменить(Группа.Наименование, "Старое", "Новое");
Группа.Записать();
КонецЦикла;