При разработке и доработке конфигураций 1С часто возникает задача сгруппировать элементы подчиненного справочника (например, ДоговорыКонтрагентов или ДоговорыВзаиморасчетов) не по конкретным владельцам, а по общим сквозным признакам: территориям, типам взаиморасчетов, ответственным менеджерам или регионам. Рассмотрим, можно ли создать группы без владельца в подчиненном справочнике и как правильно решить задачу классификации данных.
Проанализируем базовые правила и системные механизмы платформы 1С:Предприятие при работе с подчиненными справочниками:
Владелец является строго обязательным. Создать группу с пустым владельцем в рамках стандартной логики невозможно.Элемент.Владелец = Элемент.Родитель.Владелец. Нельзя переместить договор контрагента «А» в группу, принадлежащую контрагенту «Б» или группе контрагентов. При попытке программного или интерактивного назначения родителем группы другого владельца платформа выдает ошибку несовпадения владельцев либо ошибку «Зацикливание ссылок».Разберем наиболее надежное и архитектурно верное решение задачи группировки. Если требуется классифицировать элементы подчиненного справочника по произвольным разрезам (например, по регионам или категориям), не следует ломать типовую структуру подчиненности.
Выполним следующие шаги:
Регионы, Территории или КатегорииДоговоров).В обычном приложении для отображения договоров в виде единой сквозной структуры без отбора по конкретному владельцу можно использовать элемент управления ТабличноеПоле с типом данных ДеревоЗначений.
Посмотрим на пример заполнения дерева с группировкой по территориям и контрагентам с помощью запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Договоры.Владелец КАК Контрагент,
| Договоры.Владелец.Территория КАК Территория,
| Договоры.Ссылка КАК Договор,
| Договоры.НомерДоговора КАК Номер,
| Договоры.Дата КАК Дата
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК Договоры
|ИТОГИ ПО
| Территория,
| Контрагент";
РезультатЗапроса = Запрос.Выполнить();
ДеревоДоговоров = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
ЭлементыФормы.ТабличноеПолеДерево.Значение = ДеревоДоговоров;
ЭлементыФормы.ТабличноеПолеДерево.СоздатьКолонки();
При таком подходе пользователи получают привычный иерархический вид данных с любым количеством уровней группировки, а открытие карточки договора выполняется программно в обработчике события Выбор табличного поля.
Если пользователям требуется регулярно анализировать договоры в различных разрезах без фиксированной структуры, оптимальным вариантом будет создание формы отчета на базе Системы компоновки данных (СКД).
Преимущества данного подхода: