В процессе разработки на платформе 1С:Предприятие 7.7 часто возникает задача не просто вывести стандартную структуру подчиненности, а найти абсолютно все объекты, которые ссылаются на конкретный документ. Это необходимо для корректного удаления объектов, анализа взаимосвязей или построения сложных отчетов. В отличие от стандартного дерева подчиненности, поиск всех ссылок охватывает любые реквизиты (включая табличные части и реквизиты неопределенного типа), где может быть выбран наш документ.
Разберем подробно, как реализовать этот механизм программно, какие штатные средства использовать и как обойти ограничения платформы 7.7.
Самый простой и надежный способ найти все упоминания документа в базе данных — это использование встроенного метода НайтиСсылки. Этот метод имитирует поведение системы при проверке ссылок перед удалением объекта. Он перебирает все таблицы метаданных и ищет вхождения идентификатора нашего объекта.
Проанализируем пример кода для работы с этой функцией:
// Создаем таблицу значений, куда будут выгружены результаты
СсылкиТЗ = СоздатьОбъект("ТаблицаЗначений");
// Подготавливаем список значений с искомым документом
СписокПоиска = СоздатьОбъект("СписокЗначений");
СписокПоиска.ДобавитьЗначение(ВыбДокумент); // ВыбДокумент - ссылка на искомый док
// Выполняем поиск
НайтиСсылки(СписокПоиска, СсылкиТЗ);
// Теперь СсылкиТЗ содержит колонки:
// 1. Объект - ссылка на найденный объект
// 2. Ссылка - ссылка на искомый объект (из СписокПоиска)
// 3. Метаданные - описание метаданных, где найдена ссылка
После выполнения этого кода в СсылкиТЗ окажутся все документы, справочники и другие объекты, в реквизитах которых указан наш документ. Рассмотрим, почему это эффективнее ручного перебора: метод НайтиСсылки автоматически обрабатывает реквизиты типа Документ неопределенного вида, что крайне сложно реализовать простым перебором через ВыбратьДокументы.
Если наша задача — построить полное дерево связей (связанные документы связанных документов), нам потребуется рекурсивный алгоритм. Проанализируем ситуацию: документ А ссылается на Б, а Б ссылается на В. Чтобы увидеть всю цепочку, нужно запустить поиск для каждого найденного элемента.
При реализации рекурсии важно учитывать следующие моменты:
СсылкиТЗ, так как НайтиСсылки может вернуть ссылки из справочников или констант, которые нам не нужны для дерева документов.Штатный метод НайтиСсылки на больших объемах данных работает достаточно медленно, так как сканирует абсолютно все таблицы. Если мы знаем, что нас интересуют только связи между документами, мы можем оптимизировать процесс, проанализировав объект Метаданные.
Рассмотрим алгоритм оптимизации:
ВыбратьДокументы с фильтром по реквизиту.Такой подход позволяет сократить время поиска в десятки раз, так как исключается сканирование справочников, бухгалтерских итогов и регистров.
Стандартная ТаблицаЗначений в 1С 7.7, к сожалению, не умеет отображать дерево с возможностью сворачивания веток. Выясним, какие есть варианты для вывода результатов пользователю:
FormEx, которая позволяет внедрять полноценный элемент управления TreeView. Это обеспечит привычный пользователям вид проводника.При работе с прямыми запросами (если используется версия SQL) или при ручном разборе идентификаторов, важно помнить, что в 1С 7.7 ссылка в базе данных хранится в виде 36-ричного идентификатора. В неопределенных реквизитах к этому ID добавляется код типа объекта. При сравнении значений программно всегда используйте функцию ТипЗначенияСтр, чтобы убедиться, что вы сравниваете именно ссылки на документы.
Важно: Поиск ссылок — ресурсоемкая операция. Настоятельно рекомендуем выполнять такие процедуры в периоды низкой активности пользователей, так как массовое чтение таблиц может вызвать блокировки и снизить общую производительность системы.