1С: Программное получение структуры подчиненности

Время от времени прилетают задачки, связанные с получением подчиненных объектов. Последний раз было необходимо автоматизировано проконтролировать весь ли набор документов был создан на основании заказа.

Один из способов контроля – это использование структуры подчиненности. Но структура подчиненности в чистом виде удобна для использования в пользовательских режимах, но не очень удобная для программистов.

Рассматриваем на примере 1С: УНФ 3.0 (одна из наиболее простых конфигураций).

Стоит начать с того, что под капотом структура подчиненности работает на базе объектов конфигурации «Критерии отбора»

Где основные настройки находятся в разделах «Данные» и «Состав»

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

Кодом:

Запросом:

На примере 1С: УНФ, с виду простой простой запрос, всё равно преобразуется в длиннющий SQL запрос к базе данных.

На уровне СУБД запрос становится таким длинным, так как он объединяется по всем возможным источникам связи указанным в конфигураторе в нашем критерии отбора. Хотя сам по себе запрос выполнится оптимально, так как оптимизатор на уровне СУБД более менее гарантированно будет искать данные по индексам, а не простым перебором.

Но давайте представим, что у нас есть задача найти все расходные накладные к которым привязан наш заказ покупателя. На первый взгляд лучшим решением будет написать запрос на подобии такого:

На уровне СУБД он будет выглядеть так:

Выглядит компактнее. И в случае с УНФ он будет вполне оптимальным, потому что платформа создала индексы для реквизита Заказ, потому что он включен в состав критерия расчета “Связанные документы”. Хотя сам реквизит “Заказ” не является индексируемым.

Подробнее об индексах можно почитать на портале ИТС https://its.1c.ru/db/metod8dev/content/1590/hdoc

Это всё замечательно, однако пора вернуться к структуре подчиненности. Порой нужно рекурсивно получить не просто связанные с каким-то одним документом объекты, а подчиненные, подчиненные на подчиненные, подчиненные на подчиненные на подчиненные и далее по рекурсии объекты.

На Инфостарте у Максима Хмелева есть интересная, хоть и немного устаревшая статья. https://infostart.ru/1c/articles/205090/

Главный недостаток в этой статье – изменение поведения платформы начиная с версии 8.3.10 при вызове метода ПравоДоступа(). Но можно просто обернуть вызов права доступа в попытку и теперь мы можем рекурсивно получать родительские и подчиненные объекты.

Немного правим получившийся код (результат можно скачать чуть ниже по ссылке)

chevron_left
chevron_right