В процессе доработки и сопровождения сложных конфигураций (таких как «1С:Документооборот», «1С:ERP» или «1С:Комплексная автоматизация») разработчики регулярно сталкиваются с необходимостью выяснить, как логически и физически связаны между собой два объекта метаданных. Например, требуется определить, как справочник ДействияИсполнения связан с документом ДействиеЗадачи, если в реквизитах прямого указания друг на друга нет. Разберем доступные инструменты и алгоритмы решения этой задачи.
Штатный конфигуратор платформы «1С:Предприятие» умеет искать ссылки в метаданных только на один шаг вглубь через контекстное меню «Поиск ссылок в объекте» или «Поиск ссылок на объект». Однако в среде разработки 1C:Enterprise Development Tools (EDT) присутствует встроенный визуальный механизм — Схема данных.
Проанализируем возможности схемы данных EDT:
Этот инструмент позволяет визуализировать структуру метаданных, увидеть направления ссылочных связей и быстро понять, через какие промежуточные таблицы соединены сущности.
Если разработка ведется в классическом конфигураторе или требуется автоматизировать поиск пути произвольной длины между двумя произвольными объектами конфигурации, построим ориентированный граф метаданных и найдем кратчайший путь с помощью алгоритма поиска в ширину (BFS).
Разберем по шагам, как устроен этот механизм:
Тип.Типы().Метаданные.НайтиПоТипу() сопоставим каждый ссылочный тип с целевым объектом конфигурации.Посмотрим на пример функции для поиска объектов, на которые ссылается переданный объект метаданных:
Функция ПолучитьСвязанныеОбъектыМетаданных(ОбъектМетаданных)
Связанные = Новый Соответствие;
// Проверяем реквизиты объекта
Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл
Для Каждого ТекТип Из Реквизит.Тип.Типы() Цикл
ЦелевойОбъект = Метаданные.НайтиПоТипу(ТекТип);
Если ЦелевойОбъект <> Неопределено Тогда
Связанные.Вставить(ЦелевойОбъект, Истина);
КонецЕсли;
КонецЦикла;
КонецЦикла;
// Проверяем реквизиты табличных частей
Для Каждого ТабличнаяЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл
Для Каждого РеквизитТЧ Из ТабличнаяЧасть.Реквизиты Цикл
Для Каждого ТекТип Из РеквизитТЧ.Тип.Типы() Цикл
ЦелевойОбъект = Метаданные.НайтиПоТипу(ТекТип);
Если ЦелевойОбъект <> Неопределено Тогда
Связанные.Вставить(ЦелевойОбъект, Истина);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Возврат Связанные;
КонецФункции
Полученную структуру зависимостей можно выгрузить в формат Graphviz (DOT), PlantUML или Mermaid для последующей отрисовки интерактивного графа.
Для крупных конфигураций анализ связей внутри сеанса 1С может занимать значительное время. В таких сценариях эффективен экспорт структуры метаданных во внешние графовые базы данных, например Neo4j:
shortestPath, которая моментально выводит всю цепочку промежуточных объектов между источником и приемником.Статический анализ метаданных не всегда дает полное понимание бизнес-логики. В таких конфигурациях, как «1С:Документооборот», эффективнее исследовать зависимости на конкретных экземплярах данных в рабочей или тестовой базе.
Рассмотрим порядок действий:
НайтиПоСсылкам(), передав в него массив с нашей ссылкой.НайтиПоСсылкам() для найденных ссылок на 2–3 уровня вглубь.Посмотрим на пример обхода зависимостей на уровне данных:
МассивДляПоиска = Новый Массив;
МассивДляПоиска.Добавить(СсылкаНаОбъект);
ТаблицаСсылок = НайтиПоСсылкам(МассивДляПоиска);
Для Каждого Стр Из ТаблицаСсылок Цикл
// Стр.Данные содержит объект, который ссылается на СсылкаНаОбъект
МетаданныеИсточника = Стр.Данные.Метаданные();
Сообщить("Связь через: " + МетаданныеИсточника.ПолноеИмя());
КонецЦикла;
Такой подход позволяет сразу увидеть реальные маршруты движения информации, включая записи независимых регистров сведений, без необходимости вручную просматривать структуру каждого регистра.
Выясним причину, почему простой поиск зависимостей в конфигурации «1С:Документооборот» часто выдает ложные результаты:
ХранилищеЗначения. Такие зависимости выявляются только отладкой и анализом модулей менеджеров и подписок на события.