В процессе длительного развития и доработки конфигураций 1С неизбежно накапливаются устаревшие и неиспользуемые объекты метаданных: справочники, документы, перечисления и регистры. Они усложняют поддержку кода, замедляют обновление конфигурации и создают визуальный шум. Разберем по шагам, как выявить такие заброшенные объекты, найти все зависимости и корректно вывести их из эксплуатации.
Штатная проверка конфигурации не всегда выявляет неиспользуемые объекты метаданных целиком, если на них нет явных битых ссылок. Для поиска мест, где тип конкретного справочника или перечисления назначен реквизитом, измерением или ресурсом других объектов, можно использовать программный обход дерева метаданных.
Рассмотрим пример функции, которая анализирует стандартные реквизиты, реквизиты табличных частей, измерения и ресурсы основных коллекций метаданных на предмет вхождения проверяемого типа:
&НаСервереБезКонтекста
Функция ПоискСсылокНаОбъект(ОбъектМетаданных, СтрСвязей)
Коллекции = Новый Массив;
Коллекции.Добавить(Метаданные.Справочники);
Коллекции.Добавить(Метаданные.Документы);
Коллекции.Добавить(Метаданные.РегистрыБухгалтерии);
Коллекции.Добавить(Метаданные.РегистрыНакопления);
Коллекции.Добавить(Метаданные.РегистрыСведений);
Сч = 2;
Для Каждого Коллекция Из Коллекции Цикл
Для Каждого Объект Из Коллекция Цикл
// Проверка стандартных реквизитов
Попытка
Для Каждого Реквизит Из Объект.СтандартныеРеквизиты Цикл
Если Реквизит.Имя = "Ссылка" Тогда
Продолжить;
КонецЕсли;
Для Каждого ТипРеквизита Из Реквизит.Тип.Типы() Цикл
Если ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипРеквизита) Тогда
СтрСвязей = СтрСвязей + Объект.ПолноеИмя() + "." + Реквизит.Имя + Символы.ПС;
Продолжить;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Исключение
КонецПопытки;
// Проверка основных реквизитов
Попытка
Для Каждого Реквизит Из Объект.Реквизиты Цикл
Для Каждого ТипРеквизита Из Реквизит.Тип.Типы() Цикл
Если ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипРеквизита) Тогда
СтрСвязей = СтрСвязей + Объект.ПолноеИмя() + "." + Реквизит.Имя + Символы.ПС;
Продолжить;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Исключение
КонецПопытки;
// Проверка измерений регистров
Попытка
Для Каждого Реквизит Из Объект.Измерения Цикл
Для Каждого ТипРеквизита Из Реквизит.Тип.Типы() Цикл
Если ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипРеквизита) Тогда
СтрСвязей = СтрСвязей + Объект.ПолноеИмя() + "." + Реквизит.Имя + Символы.ПС;
Продолжить;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Исключение
КонецПопытки;
// Проверка ресурсов регистров
Попытка
Для Каждого Реквизит Из Объект.Ресурсы Цикл
Для Каждого ТипРеквизита Из Реквизит.Тип.Типы() Цикл
Если ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипРеквизита) Тогда
СтрСвязей = СтрСвязей + Объект.ПолноеИмя() + "." + Реквизит.Имя + Символы.ПС;
Продолжить;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Исключение
КонецПопытки;
КонецЦикла;
КонецЦикла;
Возврат СтрСвязей;
КонецФункции
С помощью метода Метаданные.НайтиПоТипу() мы сопоставляем тип реквизита с исследуемым объектом метаданных. Это позволяет сформировать список прямых реквизитных связей в конфигурации.
Прежде чем анализировать код, оценим фактическое наличие данных в таблицах информационной базы. Если справочник или регистр пуст, вероятность того, что он заброшен, существенно возрастает.
Выполним быструю проверку на наличие записей с помощью динамического запроса вида:
ВЫБРАТЬ ПЕРВЫЕ 1
1 КАК Поле1
ИЗ
Справочник.ИмяСправочника КАК ИмяСправочника
Если таблица содержит записи, проанализируем дату последней активности (например, максимальную дату документов или дату создания элементов). Если движений по объекту не было в течение нескольких лет, объект можно рассматривать как кандидата на удаление.
Объект может не иметь реквизитных связей, но активно вызываться в программном коде, запросах или макетах компоновки данных. Для полного анализа используем следующие инструменты:
Проанализируем неочевидные места, где может использоваться удаляемый объект, даже если прямой поиск по реквизитам дал пустой результат:
Метаданные.НайтиПоПолномуИмени() или формирование имени таблицы склейкой строк в запросах.Удаление объектов напрямую из рабочей базы без предварительной подготовки несет риски потери данных или сбоев в бизнес-процессах. Рекомендуется придерживаться двухэтапного регламента:
Переименовываем объект, добавляя префикс (например, Удалить_ИмяСправочника). Снимаем видимость объекта в подсистемах и командном интерфейсе. Очищаем данные таблицы в базе и удаляем предопределенные элементы. В таком виде конфигурация передается в рабочую среду на 1–2 релизных цикла.
После того как по журналу регистрации и обращениям пользователей подтверждено полное отсутствие попыток обращения к переименованному объекту, выполняем окончательное удаление объекта из метаданных на копии базы, проверяем целостность структуры и накатываем изменения на рабочую базу.