В процессе оптимизации или рефакторинга конфигурации 1С часто возникает задача поиска реквизитов, имеющих обобщенные типы данных, такие как ЛюбаяСсылка, СправочникСсылка или ДокументСсылка. Использование таких типов может негативно сказываться на производительности базы данных (особенно при использовании RLS) и усложнять структуру таблиц SQL. Рассмотрим подробнее все доступные методы поиска этих типов — от простых встроенных инструментов до продвинутого анализа файлов конфигурации.
Самый гибкий способ — написать небольшую обработку, которая переберет все интересующие нас объекты. Разберем логику: нам необходимо проверить состав типов у каждого реквизита. Если количество типов в объекте ОписаниеТипов совпадает с общим количеством справочников или документов в системе, значит, перед нами СправочникСсылка или ДокументСсылка соответственно.
Рассмотрим пример кода для поиска таких полей:
Процедура НайтиОбобщенныеТипы()
// Получаем массивы всех типов ссылок для сравнения
ВсеСправочники = Справочники.ТипВсеСсылки().Типы();
ВсеДокументы = Документы.ТипВсеСсылки().Типы();
// Перебираем, например, документы и их реквизиты
Для Каждого МетаДанноеДокумент Из Метаданные.Документы Цикл
Для Каждого Реквизит Из МетаДанноеДокумент.Реквизиты Цикл
ТипыРеквизита = Реквизит.Тип.Типы();
// Проверка на ДокументСсылка (через сравнение массивов типов)
Если ОбщегоНазначенияКлиентСервер.РазностьМассивов(ВсеДокументы, ТипыРеквизита).Количество() = 0 Тогда
Сообщить("Документ: " + МетаДанноеДокумент.Имя + ", Реквизит: " + Реквизит.Имя + " имеет тип ДокументСсылка");
КонецЕсли;
// Проверка на ЛюбаяСсылка (очень много типов в массиве)
Если ТипыРеквизита.Количество() > 500 Тогда // Условный порог для большой конфигурации
Сообщить("Обнаружен подозрительно широкий составной тип в: " + Реквизит.ПолноеИмя());
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Если вы не хотите писать код, можно воспользоваться штатным функционалом платформы. Выясним, как это сделать за несколько шагов:
.txt) или в табличный документ (.mxl).Этот метод хорош тем, что не требует навыков программирования, но может быть трудоемким при очень большом объеме метаданных.
Проанализируем более современный подход, который используют опытные разработчики. При выгрузке конфигурации в файлы вся структура объектов представляется в виде XML. Это открывает возможность использования мощных текстовых поисковиков.
Пошаговый алгоритм:
cfg:AnyRef — соответствует типу ЛюбаяСсылка;cfg:CatalogRef — соответствует типу СправочникСсылка;cfg:DocumentRef — соответствует типу ДокументСсылка.Этот метод является самым быстрым и точным для поиска во всей конфигурации сразу, включая формы, макеты и параметры команд.
Если ваша разработка ведется в среде EDT, задача упрощается в разы. Благодаря глубокой индексации проекта, вы можете воспользоваться глобальным поиском по типам. EDT понимает связи между объектами и позволяет найти все места использования базовых типов ссылок через панель поиска, отфильтровав результаты по метаданным.
Существует популярный пакет внешних обработок "Инструменты разработчика" (автор С. Старостин). В его составе есть Консоль метаданных. Рассмотрим, чем она полезна:
в консоли можно задать произвольный фильтр по свойствам объектов. Например, можно вывести список всех реквизитов, у которых тип данных совпадает с нужным базовым типом. Это избавляет от необходимости писать собственные циклы перебора Метаданные.Документы.
Проанализируем ситуацию, если база данных работает на SQL-сервере. В структуре таблиц 1С поля с составными типами или обобщенными ссылками выглядят специфично. Как правило, они состоят из нескольких колонок:
_RRRef — двоичный идентификатор ссылки;_TRef — идентификатор типа (таблицы).Посмотрев на структуру таблиц через INFORMATION_SCHEMA.COLUMNS или системную таблицу _ConfigTable, можно косвенно вычислить реквизиты, имеющие "широкие" типы, так как они всегда создают мультиколоночную структуру в базе данных.
Разберем одну тонкость: часто разработчики создают Определяемый тип (например, ОпределяемыйТип.ВладелецФайла) и устанавливают ему тип ЛюбаяСсылка. В этом случае поиск по строке ЛюбаяСсылка в реквизитах документов ничего не даст, так как реквизиты будут ссылаться на сам ОпределяемыйТип.
Рекомендация: Всегда начинайте анализ с раздела метаданных Общие — Определяемые типы. Если там найдены объекты с обобщенными ссылками, следующим шагом ищите использование этих конкретных определяемых типов по всей конфигурации (через команду "Поиск ссылок в конфигурации").
Для разовой проверки небольшой базы идеально подойдет Отчет по конфигурации. Для регулярного аудита кода лучше использовать скрипт перебора метаданных или анализ XML-выгрузки. Если же вы работаете в крупном проекте, внедрение EDT или инструментов статического анализа кода станет лучшим долгосрочным решением для контроля качества типов данных.