При работе со справочниками в платформе 1С 8.2 (и более новых версиях платформы в режиме обычных форм) часто возникает необходимость сгруппировать записи по определенным критериям — например, разбить банковские счета по годам или банкам. Однако, если справочник является подчинённым (как справочник БанковскиеСчета, где владельцами выступают Организации и Контрагенты), включение иерархии имеет особенности, связанные со спецификой работы платформы.
Разберём подробнее, с какими ограничениями можно столкнуться при использовании иерархии в подчинённом справочнике, почему в форме может быть недоступна кнопка «Создать группу» и как правильно создавать папки программным путём.
В платформе 1С установлен ряд жёстких правил для объектов конфигурации, совмещающих иерархию и подчинение:
Владелец. Создать общую «сквозную» группу для всех организаций без привязки к конкретному владельцу стандартным механизмом иерархии не получится.Родитель.Владелец = Объект.Владелец). Попытка поместить элемент одной организации в папку другой организации приведёт к ошибке записи.Группам и элементам. Если там указано Элементам, создание групп для подчинённых объектов будет заблокировано.Рассмотрим ситуацию, когда галочка «Иерархический» в Конфигураторе установлена, но пользователю недоступно добавление папок через интерфейс или по нажатию клавиш Ctrl+F9. Это происходит по следующим причинам:
ПараметрВыборГруппИЭлементов (тип ИспользованиеГруппИЭлементов). Если значение установлено в Элементы, кнопка создания группы и сама возможность выбора папки автоматически скрываются.Отбор.Владелец). В этом случае отображаются только те группы, у которых реквизит Владелец заполнен именно этим значением. Папки без владельца в этот список не попадут.Проанализируем обработчик выбора из формы подбора, который управляет поведением групп при клике:
Процедура СправочникСписокОбработкаЗаписиНовогоОбъекта(Элемент, Объект, СтандартнаяОбработка)
Если РежимВыбора Тогда
Если ПараметрВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.ГруппыИЭлементы
ИЛИ ((НЕ Объект.ЭтоГруппа) И ПараметрВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы)
ИЛИ (Объект.ЭтоГруппа И ПараметрВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Группы) Тогда
ОповеститьОВыборе(Объект.Ссылка);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если группы в базе отсутствуют или их требуется сформировать автоматически (например, с помощью внешней обработки или групповой обработки справочников), используем метод СоздатьГруппу(). Главное условие — перед вызовом метода Записать() обязательно переопределить реквизит Владелец.
Рассмотрим базовый пример создания группы для подчинённого справочника БанковскиеСчета:
Попытка
НовСпр = Справочники.БанковскиеСчета.СоздатьГруппу();
НовСпр.Наименование = "2024г";
НовСпр.Владелец = СсылкаНаВладельца; // Обязательное заполнение владельца (Организация или Контрагент)
НовСпр.Записать();
Сообщить("Успешно создана группа: " + НовСпр);
Исключение
Сообщить("Ошибка при создании группы: " + ОписаниеОшибки());
КонецПопытки;
Для массового создания структурных папок по всем контрагентам или организациям проанализируем пример обхода элементов в цикле с помощью запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Организации.Ссылка КАК Владелец
|ИЗ
| Справочник.Организации КАК Организации";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ГруппаОбъект = Справочники.БанковскиеСчета.СоздатьГруппу();
ГруппаОбъект.Наименование = "Счета 2024";
ГруппаОбъект.Владелец = Выборка.Владелец;
Попытка
ГруппаОбъект.Записать();
Исключение
ЗаписьЖурналаРегистрации("ОшибкаСозданияГруппы", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Для проверки того, созданы ли уже группы в подчинённом справочнике, выполним простой запрос по признаку ЭтоГруппа:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| БС.Наименование КАК Наименование,
| БС.Владелец КАК Владелец
|ИЗ
| Справочник.БанковскиеСчета КАК БС
|ГДЕ
| БС.ЭтоГруппа = ИСТИНА
|УПОРЯДОЧИТЬ ПО
| Наименование";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаБС = РезультатЗапроса.Выбрать();
Пока ВыборкаБС.Следующий() Цикл
Сообщить("Группа: " + ВыборкаБС.Наименование + " (Владелец: " + ВыборкаБС.Владелец + ")");
КонецЦикла;
Если плодить одинаковые папки под каждого отдельного владельца (организацию/контрагента) неудобно, рекомендуется использовать альтернативный подход:
БанковскиеСчета неиерархическим.КатегорияСчета или ГруппаУчета), ссылающийся на отдельный классификатор.Владелец.Совет при работе с Журналом регистрации: Если требуется выяснить, кем и когда были созданы группы, избегайте поиска по всей базе без фильтров — в файловых информационных базах 1С 8.2 это может привести к завершению работы программы из-за нехватки памяти. Всегда ограничивайте интервал дат перед выполнением поиска.