Создание групп в 1С:Предприятие программным способом — одна из самых востребованных задач при автоматизации рутинных операций. В отличие от ручного добавления через интерфейс, программный метод позволяет массово создавать структуры справочников, настраивать права доступа и интегрировать процессы с внешними системами. Эта статья подробно разберёт все этапы: от подготовки среды до обработки ошибок, с учётом особенностей разных конфигураций (1С:Бухгалтерия, 1С:Управление торговлей, 1С:Зарплата и управление персоналом).

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

1. Подготовка к программному созданию групп

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

Важный момент: не все справочники поддерживают группы. Например, в справочнике ФизическиеЛица (из 1С:Зарплата) групп быть не может, а в Номенклатура (1С:Управление торговлей) — можно создавать многоуровневую иерархию. Проверьте свойства справочника в конфигураторе:

  • 🔹 Иерархический — если включено, группы поддерживаются.
  • 🔹 Владельцы — определяет, могут ли группы принадлежать другим элементам (например, группы номенклатуры внутри папки "Товары").
  • 🔹 Предопределённые элементы — некоторые группы могут быть закреплены в конфигурации и не подлежат программному изменению.

Также убедитесь, что у пользователя, от имени которого будет выполняться код, есть права на Добавление и Изменение в данном справочнике. Отсутствие прав — самая частая причина ошибок при программном создании.

📊 Какую конфигурацию 1С вы используете?
1С:Бухгалтерия
1С:Управление торговлей
1С:Зарплата и управление персоналом
1С:ERP
Другую

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

Минимальный код для создания группы выглядит так:

Справочник = Справочники.Номенклатура;

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

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

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

Разберём этот код по строкам:

  1. Справочник = Справочники.Номенклатура; — получаем ссылку на нужный справочник. Замените Номенклатура на имя вашего справочника (например, Контрагенты или Сотрудники).
  2. НоваяГруппа = Справочник.СоздатьГруппу(); — создаём новый объект группы. Метод СоздатьГруппу() автоматически устанавливает свойство ЭтоГруппа = Истина.
  3. НоваяГруппа.Наименование = "..."; — задаём имя группы. Оно должно быть уникальным в пределах родительского элемента (если справочник иерархический).
  4. НоваяГруппа.Записать(); — сохраняем изменения в базе. Без этой строки группа не появится в справочнике.

Критическая особенность: если справочник иерархический, но вы не указали родительскую группу, новая группа будет создана в корне справочника. Чтобы поместить её внутрь другой группы, используйте свойство Родитель:

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

Всегда проверяйте существование родительской группы перед присвоением. Если указать несуществующий родитель, 1С выдаст ошибку "Не найден объект справочника".

3. Продвинутые сценарии: массовое создание и обработка ошибок

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

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

СписокГрупп = Новый Массив;

СписокГрупп.Добавить("Электроника");

СписокГрупп.Добавить("Бытовая техника");

СписокГрупп.Добавить("Мебель");

Для Каждого ИмяГруппы Из СписокГрупп Цикл

Попытка

РодительскаяГруппа = Справочники.Номенклатура.Товары; // Укажите актуальную родительскую группу

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

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

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

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

Сообщить("Группа '" + ИмяГруппы + "' создана успешно");

Исключение

Сообщить("Ошибка при создании группы '" + ИмяГруппы + "': " + ОписаниеОшибки());

КонецПопытки;

КонецЦикла;

Обратите внимание на ключевые моменты:

  • 🔹 Попытка-Исключение — позволяет продолжить выполнение кода даже если одна из групп не создастся (например, из-за дубля имени).
  • 🔹 Родительская группа — если не указать, группы будут создаваться в корне справочника, что может нарушить логику хранения данных.
  • 🔹 Массив имён — удобно, когда список групп загружается из файла или другой системы.
Как ускорить массовое создание групп?

Для ускорения используйте НачатьТранзакцию() и ЗафиксироватьТранзакцию():

НачатьТранзакцию();

Для Каждого ИмяГруппы Из СписокГрупп Цикл

// Код создания группы

КонецЦикла;

ЗафиксироватьТранзакцию();

Это сократит количество обращений к базе данных в 5-10 раз.

Если вам нужно создать группы с дополнительными реквизитами (например, Комментарий или Ответственный), используйте точечную нотацию:

НоваяГруппа.Комментарий = "Создана автоматически " + ТекущаяДата();

НоваяГруппа.Ответственный = Справочники.Пользователи.ТекущийПользователь();

💡

Всегда проверяйте обязательные реквизиты справочника перед записью. Если в конфигурации добавлено новое обязательное поле, код перестанет работать.

4. Особенности для разных конфигураций 1С

Хотя принципы создания групп универсальны, в популярных конфигурациях есть нюансы, которые стоит учитывать.

Конфигурация Справочник Особенности создания групп Типичные ошибки
1С:Бухгалтерия Контрагенты Группы используются для классификации (например, "Поставщики", "Покупатели"). При создании проверяйте поле ВидКонтрагента. Ошибка "Не заполнен вид контрагента" при попытке создать группу без указания типа.
1С:Управление торговлей Номенклатура Поддерживает многоуровневую иерархию. Группы могут иметь дополнительные реквизиты (например, ТипНоменклатуры). Зацикливание при рекурсивном поиске родительских групп.
1С:Зарплата и управление персоналом Сотрудники Группы используются для структурных подразделений. Важно заполнять ВидПодразделения. Ошибка "Не указан вид подразделения" при сохранении.
1С:ERP Проекты Группы проектов могут иметь привязку к бизнес-процессам. Проверяйте права доступа к бизнес-объектам. Ошибки интеграции с модулем "Бизнес-процессы".

Для 1С:Управление торговлей 11 и 1С:ERP 2.5 актуальна проблема с длинными именами групп. Если наименование превышает 150 символов, платформа обрежет его без предупреждения. Всегда проверяйте длину строки перед записью:

Если СтрДлина(ИмяГруппы) > 150 Тогда

ИмяГруппы = Лев(ИмяГруппы, 150);

КонецЕсли;

🔹 Убедиться, что справочник поддерживает группы|🔹 Проверить права пользователя на запись|🔹 Определить родительскую группу (если справочник иерархический)|🔹 Проверить уникальность имени группы|🔹 Заполнить обязательные реквизиты

-->

5. Работа с предопределёнными группами

В некоторых конфигурациях есть предопределённые группы — они создаются автоматически при обновлении базы и не должны изменяться программно. Например, в 1С:Бухгалтерия это группы "Поставщики" и "Покупатели" в справочнике Контрагенты.

Чтобы проверить, является ли группа предопределённой, используйте свойство Предопределённый:

Если НоваяГруппа.Предопределенный Тогда

Сообщить("Эту группу нельзя изменять программно!");

Прервать;

КонецЕсли;

Если вам нужно добавить подгруппу в предопределённую группу, указывайте её как родителя:

РодительскаяГруппа = Справочники.Контрагенты.Поставщики; // Предопределённая группа

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

НоваяГруппа.Наименование = "Поставщики электроники";

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

⚠️ Внимание: Изменение предопределённых групп может привести к ошибкам при обновлении конфигурации. Всегда создавайте новые группы, а не модифицируйте существующие.

В 1С:Управление торговлей предопределённые группы часто используются для классификации номенклатуры (например, "Товары", "Услуги"). Их нельзя удалить, но можно добавлять в них подгруппы.

6. Интеграция с внешними системами

Часто группы в 1С создаются на основе данных из Excel, JSON или других систем. Рассмотрим пример импорта групп из файла CSV:

Допустим, у нас есть файл groups.csv со структурами:

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

Товары;Электроника

Товары;Бытовая техника

Услуги;Консалтинг

Код для обработки такого файла:

Текст = Новый ЧтениеТекста("C:\import\groups.csv", КодировкаТекста.UTF8);

Строка = "";

Пока Текст.ПрочитатьСтроку(Строка) Цикл

Данные = РазложитьСтрокуВМассивСтрок(Строка, ";");

Родитель = Справочники.Номенклатура.НайтиПоНаименованию(Данные[0]);

Если Родитель = Неопределено Тогда

Сообщить("Не найдена родительская группа: " + Данные[0]);

Продолжить;

КонецЕсли;

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

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

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

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

КонецЦикла;

При интеграции с REST API или веб-сервисами используйте HTTPСервис для получения данных:

HTTPСоединение = Новый HTTPСоединение("api.example.com");

Ответ = HTTPСоединение.Получить("/groups");

Данные = JSON.Прочитать(Ответ.ПолучитьТекст());

Для Каждого ГруппаJSON Из Данные.группы Цикл

// Код создания группы на основе ГруппаJSON.наименование

КонецЦикла;

⚠️ Внимание: При импорте из внешних источников всегда проверяйте кодировку файла. Несоответствие кодировки (например, UTF-8 vs Windows-1251) приведёт к кракузям в именах групп.

7. Типичные ошибки и их решение

Даже опытные разработчики сталкиваются с ошибками при программном создании групп. Разберём самые распространённые:

  • 🔹 "Не найден объект справочника" — возникает, если вы пытаетесь указать несуществующего родителя. Всегда проверяйте существование родительской группы с помощью НайтиПоНаименованию() или НайтиПоРеквизиту().
  • 🔹 "Нарушение прав доступа" — пользователь, от имени которого выполняется код, не имеет прав на запись. Решение: временно повысьте права или выполните код от имени администратора.
  • 🔹 "Не уникальное наименование" — в пределах одной родительской группы имена должны быть уникальны. Используйте ПроверкаУникальности() перед созданием.
  • 🔹 "Обязательное поле не заполнено" — в конфигурации добавлен новый обязательный реквизит (например, ВидНоменклатуры), который не заполнен в коде.

Для отладки используйте Сообщить() или ЗаписьЖурналаРегистрации:

Сообщить("Пытаемся создать группу: " + ИмяГруппы);

Сообщить("Родитель: " + ?(Родитель = Неопределено, "Не указан", Родитель.Наименование));

Если ошибка возникает при записи, проверьте триггеры справочника. Возможно, в модуле объекта есть процедура ПередЗаписью(), которая блокирует создание групп с определёнными параметрами.

8. Оптимизация и лучшие практики

При работе с большими объёмами данных (сотни или тысячи групп) следуйте этим рекомендациям:

  1. Используйте транзакции — как показано ранее, это ускоряет запись в 5-10 раз.
  2. Кэшируйте родительские группы — если вы создаёте много подгрупп внутри одной родительской группы, найдите её один раз и используйте ссылку:
РодительскаяГруппа = Справочники.Номенклатура.НайтиПоНаименованию("Товары");

Для Каждого Имя Из СписокИмен Цикл

НоваяГруппа.Родитель = РодительскаяГруппа; // Используем кэшированную ссылку

// ... остальной код

КонецЦикла;

  1. Проверяйте существование перед созданием — это избежит дублей и ускорит выполнение:
Если Справочники.Номенклатура.НайтиПоНаименованию(ИмяГруппы, Истина) = Неопределено Тогда

// Создаём группу только если её нет

КонецЕсли;

  1. Используйте фоновые задания — для массового создания групп (более 1000) запускайте код в фоновом задании, чтобы не блокировать интерфейс:
ФоновоеЗадание = ФоновыеЗадания.СоздатьФоновоеЗадание(

"ОбновлениеСправочников.СоздатьГруппы",

Структура,

"Создание групп номенклатуры",

Истина);

ФоновоеЗадание.Выполнить();

Если группы создаются регулярно (например, ежемесячно), вынесите логику в обработку и настройте её вызов по расписанию через РегламентныеЗадания.

⚠️ Внимание: При массовом создании групп в 1С:Управление торговлей может сработать ограничение на количество элементов в справочнике (настраивается в параметрах учета). Перед запуском проверьте лимиты.

FAQ: Частые вопросы по программному созданию групп

Можно ли создать группу в справочнике, который не поддерживает иерархию?

Нет. Если справочник не помечен как Иерархический в конфигураторе, группы в нём создать нельзя. Attempt to do so will result in an error. You can check this property in the metadata tree (Справочники → [YourCatalog] → Иерархический).

Как создать группу с определённым кодом?

Используйте свойство Код перед записью:

НоваяГруппа.Код = "GRP001";

Убедитесь, что код уникален в пределах справочника. Если автонумерация включена, код будет проигнорирован.

Почему группа не отображается в интерфейсе после программного создания?

Вероятные причины:

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

Как перенести группы между базами?

Используйте ЗагрузкаДанных или ВыгрузкаДанных:

Выгрузка = Новый ВыгрузкаДанныхXML;

Выгрузка.Выгрузить(Справочники.Номенклатура.НайтиПоНаименованию("Электроника"));

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

Можно ли изменить тип элемента с группы на элемент справочника?

Нет, это невозможно. Свойство ЭтоГруппа устанавливается при создании и не может быть изменено позже. Если нужно "превратить" группу в элемент, создайте новый элемент и перенесите в него данные вручную или программно, затем удалите старую группу.