При переносе отдельных объектов метаданных (справочников, документов, обработок) из одной конфигурации в другую разработчики часто сталкиваются с задачей: как быстро выявить все зависимости переносимого объекта от остальной конфигурации. Попытка воспользоваться стандартной командой Конфигуратора Поиск ссылок в объекте или Поиск ссылок на объект приводит к разочарованию — список найденных элементов оказывается неполным, а обращения в программном коде игнорируются. Разберем по шагам, почему так происходит, и рассмотрим эффективные практические способы выявления всех связей.
Проанализируем логику работы встроенных механизмов платформы. Штатный инструмент Конфигуратора Поиск ссылок в объекте анализирует исключительно декларативную структуру метаданных информационной базы. Он проверяет:
Для платформы текст модулей (модуль объекта, модуль менеджера, модули форм) — это неструктурированный текст. Платформа 1С:Предприятие в классическом Конфигураторе не выполняет синтаксический разбор текста модулей для построения графа метаданных. Точно так же программный метод НайтиПоСсылкам() предназначен исключительно для контроля ссылочной целостности данных в режиме 1С:Предприятие на уровне записей таблиц БД, но не для объектов конфигурации в режиме разработки.
Поэтому ожидать, что штатный поиск отобразит строку вида Справочники.Номенклатура.НайтиПоКоду() или открытие формы чужой обработки, нельзя. Посмотрим, какими методами можно решить эту задачу на практике.
Рассмотрим надежный практический сценарий, не требующий установки сторонних утилит, который доступен в стандартном Конфигураторе. Разберем его по шагам:
.cf) через меню Конфигурация → Сохранить конфигурацию в файл.....cf, допереносим выявленные недостающие объекты (общие модули, перечисления, регистры) и повторяем проверку до тех пор, пока модули не скомпилируются без ошибок.Если для разработки используется среда 1C:Enterprise Development Tools (EDT), задача решается значительно быстрее. В основе EDT лежит абстрактное синтаксическое дерево (AST) и семантическая модель проекта. В отличие от стандартного Конфигуратора, EDT непрерывно индексирует и анализирует весь BSL-код.
Рассмотрим возможности EDT для поиска зависимостей:
Когда требуется быстро проанализировать объемный программный код переносимого объекта без ручной вычитки, воспользуемся выгрузкой конфигурации в файлы XML/BSL (меню Конфигурация → Выгрузить конфигурацию в файлы...).
Открыв выгруженные файлы модуля в любом продвинутом текстовом редакторе или IDE, мы можем применить поиск по регулярным выражениям. Разберем шаблоны регулярных выражений, позволяющие отловить обращения к другим объектам конфигурации:
\b(Справочники|Документы|РегистрыСведений|РегистрыНакопления|РегистрыБухгалтерии|РегистрыРасчета|ПланыВидовХарактеристик|ПланыСчетов|ПланыОбменов|Перечисления|Обработки|Отчеты)\.[A-Za-zА-Яа-я0-9_]+
Справочники.Контрагенты, Документы.Приход, РегистрыСведений.ЦеныНоменклатуры.
\b(Справочник|Документ|РегистрСведений|РегистрНакопления|РегистрБухгалтерии|ПланВидовХарактеристик|Перечисление)\.[A-Za-zА-Яа-я0-9_]+
Справочник.Номенклатура или Документ.ПриходнаяНакладная внутри многострочных литералов запросов.Проанализируем еще один подход: поиск связей внешней обработкой в режиме 1С:Предприятие. В базе-источнике мы можем программно обойти коллекцию Метаданные и проверить наличие имен объектов в исходном коде переносимого модуля. Посмотрим на пример кода, демонстрирующий логику сопоставления:
Процедура НайтиЗависимостиВТексте(ТекстМодуля)
МассивКоллекций = Новый Массив;
МассивКоллекций.Добавить(Метаданные.Справочники);
МассивКоллекций.Добавить(Метаданные.Документы);
МассивКоллекций.Добавить(Метаданные.РегистрыСведений);
МассивКоллекций.Добавить(Метаданные.Обработки);
Для Каждого Коллекция Из МассивКоллекций Цикл
Для Каждого ОбъектМетаданных Из Коллекция Цикл
ИмяОбъекта = ОбъектМетаданных.Имя;
Если СтрНайти(ТекстМодуля, ИмяОбъекта) > 0 Тогда
Сообщить("Найдено вхождение объекта: " + ОбъектМетаданных.ПолноеИмя());
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Даже если синтаксическая проверка и поиск по менеджерам не показывают ошибок, код может содержать неявные связи, приводящие к ошибкам во время исполнения (в Runtime). Разберем, на что обратить особое внимание:
Новый ОписаниеТипов("СправочникСсылка.Организации") или вызовы Тип("ДокументСсылка.ПоступлениеТоваровУслуг"). В них имя передается строковым литералом, который не проверяется синтаксическим контролем.ОбщегоНазначения.ПолучитьЗначениеРеквизита(Ссылка, "ИмяРеквизита") или вызовы ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма").ПередЗаписью или ОбработкаПроведения), привязанные к источнику СправочникОбъект.ИмяСправочника. При переносе объекта без подписок поведение системы изменится без видимых синтаксических ошибок.Выполнить() и Вычислить(), а также обращения через Метаданные.НайтиПоПолномуИмени().Таким образом, наилучший результат дает совмещение способов: первичный перенос с синтаксической проверкой модулей, поиск по регулярным выражениям для обнаружения таблиц в запросах и последующее обязательное функциональное тестирование перенесенного алгоритма в пользовательском режиме.