Как найти прямые и косвенные связи между объектами метаданных в 1С

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

В процессе доработки и сопровождения сложных конфигураций (таких как «1С:Документооборот», «1С:ERP» или «1С:Комплексная автоматизация») разработчики регулярно сталкиваются с необходимостью выяснить, как логически и физически связаны между собой два объекта метаданных. Например, требуется определить, как справочник ДействияИсполнения связан с документом ДействиеЗадачи, если в реквизитах прямого указания друг на друга нет. Разберем доступные инструменты и алгоритмы решения этой задачи.

Использование схемы данных в 1C:Enterprise Development Tools (1С:EDT)

Штатный конфигуратор платформы «1С:Предприятие» умеет искать ссылки в метаданных только на один шаг вглубь через контекстное меню «Поиск ссылок в объекте» или «Поиск ссылок на объект». Однако в среде разработки 1C:Enterprise Development Tools (EDT) присутствует встроенный визуальный механизм — Схема данных.

Проанализируем возможности схемы данных EDT:

  1. Откроем проект конфигурации в среде 1С:EDT.
  2. Создадим или откроем элемент «Схема данных» (Data Schema) для интересующей подсистемы или набора объектов.
  3. Перенесем на рабочую область исследуемые объекты (документы, справочники, регистры). EDT автоматически анализирует типы реквизитов, табличных частей и измерений, отображая связи и внешние ключи между таблицами на диаграмме.

Этот инструмент позволяет визуализировать структуру метаданных, увидеть направления ссылочных связей и быстро понять, через какие промежуточные таблицы соединены сущности.

Программный поиск цепочки связей через модель метаданных

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

Разберем по шагам, как устроен этот механизм:

  1. Обойдем коллекции метаданных: справочники, документы, регистры сведений, регистры накопления, бизнес-процессы и задачи.
  2. Для каждого реквизита, табличной части или измерения получим типы через свойство Тип.Типы().
  3. С помощью метода Метаданные.НайтиПоТипу() сопоставим каждый ссылочный тип с целевым объектом конфигурации.
  4. Сформируем список смежности (граф зависимостей) и запустим поиск цепочки от узла А к узлу Б.

Посмотрим на пример функции для поиска объектов, на которые ссылается переданный объект метаданных:


Функция ПолучитьСвязанныеОбъектыМетаданных(ОбъектМетаданных)
    Связанные = Новый Соответствие;
    
    // Проверяем реквизиты объекта
    Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл
        Для Каждого ТекТип Из Реквизит.Тип.Типы() Цикл
            ЦелевойОбъект = Метаданные.НайтиПоТипу(ТекТип);
            Если ЦелевойОбъект <> Неопределено Тогда
                Связанные.Вставить(ЦелевойОбъект, Истина);
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    // Проверяем реквизиты табличных частей
    Для Каждого ТабличнаяЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл
        Для Каждого РеквизитТЧ Из ТабличнаяЧасть.Реквизиты Цикл
            Для Каждого ТекТип Из РеквизитТЧ.Тип.Типы() Цикл
                ЦелевойОбъект = Метаданные.НайтиПоТипу(ТекТип);
                Если ЦелевойОбъект <> Неопределено Тогда
                    Связанные.Вставить(ЦелевойОбъект, Истина);
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
    
    Возврат Связанные;
КонецФункции

Полученную структуру зависимостей можно выгрузить в формат Graphviz (DOT), PlantUML или Mermaid для последующей отрисовки интерактивного графа.

Анализ графа через внешние базы данных

Для крупных конфигураций анализ связей внутри сеанса 1С может занимать значительное время. В таких сценариях эффективен экспорт структуры метаданных во внешние графовые базы данных, например Neo4j:

  1. Выгрузим метаданные конфигурации в файлы XML/JSON штатными средствами выгрузки или через утилиты скриптинга.
  2. Загрузим полученный список узлов (объектов) и ребер (ссылочных реквизитов) в Neo4j.
  3. Выполним поиск пути с помощью стандартной функции shortestPath, которая моментально выводит всю цепочку промежуточных объектов между источником и приемником.

Трассировка реальных связей по данным в базе

Статический анализ метаданных не всегда дает полное понимание бизнес-логики. В таких конфигурациях, как «1С:Документооборот», эффективнее исследовать зависимости на конкретных экземплярах данных в рабочей или тестовой базе.

Рассмотрим порядок действий:

  1. Создадим тестовый сценарий (например, создадим конкретное действие и выполним связанную задачу).
  2. Получим ссылку на созданный объект.
  3. Используем метод платформы НайтиПоСсылкам(), передав в него массив с нашей ссылкой.
  4. Рекурсивно вызовем НайтиПоСсылкам() для найденных ссылок на 2–3 уровня вглубь.

Посмотрим на пример обхода зависимостей на уровне данных:


МассивДляПоиска = Новый Массив;
МассивДляПоиска.Добавить(СсылкаНаОбъект);

ТаблицаСсылок = НайтиПоСсылкам(МассивДляПоиска);
Для Каждого Стр Из ТаблицаСсылок Цикл
    // Стр.Данные содержит объект, который ссылается на СсылкаНаОбъект
    МетаданныеИсточника = Стр.Данные.Метаданные();
    Сообщить("Связь через: " + МетаданныеИсточника.ПолноеИмя());
КонецЦикла;

Такой подход позволяет сразу увидеть реальные маршруты движения информации, включая записи независимых регистров сведений, без необходимости вручную просматривать структуру каждого регистра.

Особенности и подводные камни конфигурации «1С:Документооборот»

Выясним причину, почему простой поиск зависимостей в конфигурации «1С:Документооборот» часто выдает ложные результаты:

  1. Составные и определяемые типы. В «1С:Документооборот» многие механизмы используют определяемые типы для хранения предметов задач и процессов. Если алгоритм обходит все типы из таких объединений, любой документ свяжется практически с любым справочником через 1–2 шага. При построении графа составные типы следует отфильтровывать или исключать из первого приоритета поиска.
  2. Связующие объекты общего назначения. Почти каждый объект метаданных ссылается на справочники пользователей, физических лиц и организаций. Если не исключить эти справочники из алгоритма поиска пути, кратчайший путь всегда будет строиться через автора документа или организацию.
  3. Связи через регистры сведений. Задачи, процессы и действия часто не содержат прямых реквизитов друг на друга. Связь между ними обеспечивается через регистры сведений (например, соответствия процессов, очереди задач или история исполнения), где оба объекта выступают параллельными измерениями. При анализе метаданных важно регистрировать взаимную связь между всеми измерениями одного регистра.
  4. Неявные программные связи. Определенная часть связей между объектами в «1С:Документооборот» реализуется исключительно в программном коде: через алгоритмы условий маршрутизации, подписки на события или хранение данных в сериализованном виде (XML/JSON) в реквизитах с типом ХранилищеЗначения. Такие зависимости выявляются только отладкой и анализом модулей менеджеров и подписок на события.
← На главную