Как настроить иерархию в подчинённом справочнике 1С 8.2 и программно создать группы?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Разберём подробнее, с какими ограничениями можно столкнуться при использовании иерархии в подчинённом справочнике, почему в форме может быть недоступна кнопка «Создать группу» и как правильно создавать папки программным путём.

Особенности иерархии в подчинённых справочниках

В платформе 1С установлен ряд жёстких правил для объектов конфигурации, совмещающих иерархию и подчинение:

  1. Обязательность владельца для группы: У каждой дочерней или корневой папки подчинённого справочника обязательно должен быть заполнен реквизит Владелец. Создать общую «сквозную» группу для всех организаций без привязки к конкретному владельцу стандартным механизмом иерархии не получится.
  2. Совпадение владельца: Владелец любого элемента или вложенной группы обязан совпадать с владельцем родительской папки (Родитель.Владелец = Объект.Владелец). Попытка поместить элемент одной организации в папку другой организации приведёт к ошибке записи.
  3. Настройка подчинения в Конфигураторе: На вкладке «Владельцы» у справочника в свойстве «Использование подчинения» должно быть выбрано значение Группам и элементам. Если там указано Элементам, создание групп для подчинённых объектов будет заблокировано.

Почему в форме не отображается команда «Создать группу»

Рассмотрим ситуацию, когда галочка «Иерархический» в Конфигураторе установлена, но пользователю недоступно добавление папок через интерфейс или по нажатию клавиш Ctrl+F9. Это происходит по следующим причинам:

  1. Параметр выбора формы: Если форма справочника открывается в режиме выбора, платформа проверяет параметр ПараметрВыборГруппИЭлементов (тип ИспользованиеГруппИЭлементов). Если значение установлено в Элементы, кнопка создания группы и сама возможность выбора папки автоматически скрываются.
  2. Отбор по владельцу: В динамо-списке или табличной части формы установлен жесткий отбор по конкретному владельцу (например, Отбор.Владелец). В этом случае отображаются только те группы, у которых реквизит Владелец заполнен именно этим значением. Папки без владельца в этот список не попадут.

Проанализируем обработчик выбора из формы подбора, который управляет поведением групп при клике:


Процедура СправочникСписокОбработкаЗаписиНовогоОбъекта(Элемент, Объект, СтандартнаяОбработка)
    Если РежимВыбора Тогда
        Если ПараметрВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.ГруппыИЭлементы 
           ИЛИ ((НЕ Объект.ЭтоГруппа) И ПараметрВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы) 
           ИЛИ (Объект.ЭтоГруппа И ПараметрВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Группы) Тогда
            ОповеститьОВыборе(Объект.Ссылка);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

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

Рассмотрим базовый пример создания группы для подчинённого справочника БанковскиеСчета:


Попытка
    НовСпр = Справочники.БанковскиеСчета.СоздатьГруппу();
    НовСпр.Наименование = "2024г";
    НовСпр.Владелец = СсылкаНаВладельца; // Обязательное заполнение владельца (Организация или Контрагент)
    НовСпр.Записать();
    Сообщить("Успешно создана группа: " + НовСпр);
Исключение
    Сообщить("Ошибка при создании группы: " + ОписаниеОшибки());
КонецПопытки;

Для массового создания структурных папок по всем контрагентам или организациям проанализируем пример обхода элементов в цикле с помощью запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Организации.Ссылка КАК Владелец
    |ИЗ
    |	Справочник.Организации КАК Организации";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    
    ГруппаОбъект = Справочники.БанковскиеСчета.СоздатьГруппу();
    ГруппаОбъект.Наименование = "Счета 2024";
    ГруппаОбъект.Владелец = Выборка.Владелец;
    
    Попытка
        ГруппаОбъект.Записать();
    Исключение
        ЗаписьЖурналаРегистрации("ОшибкаСозданияГруппы", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    КонецПопытки;

КонецЦикла;

Как проверить наличие существующих групп в базе

Для проверки того, созданы ли уже группы в подчинённом справочнике, выполним простой запрос по признаку ЭтоГруппа:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	БС.Наименование КАК Наименование,
    |	БС.Владелец КАК Владелец
    |ИЗ
    |	Справочник.БанковскиеСчета КАК БС
    |ГДЕ
    |	БС.ЭтоГруппа = ИСТИНА
    |УПОРЯДОЧИТЬ ПО
    |	Наименование";

РезультатЗапроса = Запрос.Выполнить();
ВыборкаБС = РезультатЗапроса.Выбрать();

Пока ВыборкаБС.Следующий() Цикл
    Сообщить("Группа: " + ВыборкаБС.Наименование + " (Владелец: " + ВыборкаБС.Владелец + ")");
КонецЦикла;

Альтернативное решение без включения иерархии

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

  1. Оставить справочник БанковскиеСчета неиерархическим.
  2. Добавить в справочник новый реквизит (например, КатегорияСчета или ГруппаУчета), ссылающийся на отдельный классификатор.
  3. В формах списка и подбора настроить группировку динамического списка по этому реквизиту. Это сохранит гибкость отображения и избавит от проблем с реквизитом Владелец.

Совет при работе с Журналом регистрации: Если требуется выяснить, кем и когда были созданы группы, избегайте поиска по всей базе без фильтров — в файловых информационных базах 1С 8.2 это может привести к завершению работы программы из-за нехватки памяти. Всегда ограничивайте интервал дат перед выполнением поиска.

← На главную