В практике разработчика 1С при работе с типовыми конфигурациями на обычных формах, такими как «Управление торговлей 10.3» или «Управление производственным предприятием 1.3», часто возникает ситуация: мы добавляем новый вид документа или используем нетиповое расширение конфигурации, создаем документ на основании существующего, но при просмотре структуры подчиненности (дерева связей) видим разрыв. Например, из дочернего документа (корректировки) родитель виден, а из родительского документа (поступления) дочерний — нет. Разберем подробно, почему так происходит и как восстановить ссылочную целостность визуального дерева связей.
Для начала проанализируем, как платформа 1С строит дерево связей. В отличие от некоторых других систем, 1С не сканирует все таблицы базы данных в поисках ссылок на выбранный объект в реальном времени, так как это вызвало бы колоссальные задержки. Вместо этого используется специальный объект метаданных — КритерийОтбора. В типовых конфигурациях он чаще всего называется СвязанныеДокументы.
Этот объект представляет собой некий «индекс», который заранее знает, в каких реквизитах каких документов могут храниться ссылки на другие объекты. Если вы добавили документ «руками» (через конфигуратор), система еще не знает, что новый документ нужно включать в этот индекс.
Выясним основную причину проблемы. Если документ «Корректировка поступления» был добавлен в конфигурацию самостоятельно, необходимо явно указать системе, по какому полю строить связь. Рассмотрим последовательность действий:
Общие — Критерии отбора — СвязанныеДокументы.КорректировкаПоступления).ДокументОснование, Сделка или ДокументПоступления.Важный нюанс: У этого реквизита в самом документе должен быть установлен составной тип данных, включающий тип родительского документа (в нашем примере — ДокументСсылка.ПоступлениеТоваровУслуг), либо общий тип ДокументСсылка. Если тип реквизита не совпадает с типом объекта, для которого мы смотрим структуру, связь не будет обнаружена.
Для того чтобы запрос к критерию отбора отрабатывал корректно и быстро, поле связи должно быть проиндексировано. Проанализируем настройки реквизита в вашем новом документе:
Индексировать или Индексировать с дополнительным упорядочиванием.Без этого платформа может игнорировать записи при построении дерева в высоконагруженных системах или при определенных программных фильтрах.
Иногда даже после настройки метаданных документ не появляется в списке. Рассмотрим ситуацию, характерную для УПП 1.3 или доработанных УТ 10.3. В этих конфигурациях за вывод дерева отвечает общая форма или специальная обработка (например, СтруктураПодчиненности или ВыводСтруктурыПодчиненности).
В модуле этой обработки может присутствовать жесткий программный фильтр. Разберем пример кода, который может блокировать вывод вашего документа:
// Пример возможного фильтра в модуле обработки
Если ТипЗнч(ТекСсылка) = Тип("ДокументСсылка.КорректировкаПоступления") И НЕ ВыводитьКорректировки Тогда
Продолжить;
КонецЕсли;
Проанализируем модуль обработки вывода. Если там обнаружен массив разрешенных типов или условий, в него необходимо добавить ваш новый тип документа. Также стоит проверить, не вызывается ли при построении дерева исключение из-за отсутствия прав доступа к метаданным нового документа.
Если все настройки верны, но связи все равно «двуликие» (из одного документа видно, из другого нет), выясним, нет ли проблем на уровне базы данных. В процессе разработки или при некорректном обмене данными могут возникнуть «битые ссылки» или рассогласование индекса критерия отбора.
Рассмотрим процедуру восстановления:
Администрирование — Тестирование и исправление....Это позволит системе перестроить внутренние таблицы связей, которые использует КритерийОтбора.
Не забудем про влияние платформенных механизмов. Если вы внесли изменения в конфигураторе, а пользователь их не видит, попробуем следующее:
1. Очистка кэша: Платформа кэширует структуру метаданных. При изменении состава критерия отбора рекомендуется очистить локальный кэш пользователя (папки в %AppData%\1C\1Cv8).
2. Права доступа (RLS): Если в системе настроены права на уровне записей (RLS), пользователь может видеть родительский документ («Поступление»), но не иметь прав на «Корректировку». В этом случае при построении дерева из корректировки родитель будет виден (так как на него права есть), а при просмотре из поступления система просто отфильтрует дочерний документ, на который у пользователя нет прав. Проверим роли пользователя и ограничения доступа к новому объекту.
3. Проверка ведущего реквизита: Убедимся, что в критерий отбора добавлен именно тот реквизит, который заполняется при создании «на основании». Если в корректировке есть два похожих реквизита (Сделка и ДокументОснование), а вы заполнили один, но добавили в критерий другой — связь не отобразится.
Подводя итог, отметим: для корректного отображения связи в типовых конфигурациях 1С 8.2/8.3 на обычных формах ключевым действием является регистрация реквизита связи в объекте метаданных КритерийОтбора.СвязанныеДокументы с обязательным включением индексации этого реквизита.