В процессе разработки или оптимизации конфигурации 1С часто возникает задача поиска объектов (реквизитов справочников, документов, ресурсов регистров), тип которых определен как «Любая ссылка». Это важно не только для поддержания порядка в метаданных, но и для обеспечения производительности системы. В этой статье мы подробно разберем, как программно и интерактивно вычислить такие объекты, и почему их наличие может быть критичным для базы данных.
Прежде всего, проанализируем терминологию, так как на форумах часто возникает путаница. Значение Неопределено — это специфическое значение типа ТипЗнч(Неопределено), которое обычно принимает реквизит с составным типом, если он не заполнен. Однако, когда мы говорим о поиске в конфигураторе, чаще всего подразумевается поиск реквизитов, у которых в палитре свойств не выбран конкретный объект, а установлена общая категория ссылочных типов. Рассмотрим, как это выглядит в коде.
Для того чтобы найти такие объекты программно, нам необходимо создать эталонный объект ОписаниеТипов, который будет содержать в себе все возможные ссылочные типы конфигурации. Затем мы сможем сравнить типы каждого реквизита с этим эталоном. Разберем по шагам, как сформировать такое описание.
Рассмотрим пример формирования полного описания всех ссылочных типов:
// Создаем пустое описание типов
ВсеСсылкиОписание = Новый ОписаниеТипов;
// Последовательно добавляем все типы ссылок по коллекциям метаданных
ВсеСсылкиОписание = Новый ОписаниеТипов(ВсеСсылкиОписание, Справочники.ТипВсеСсылки().Типы());
ВсеСсылкиОписание = Новый ОписаниеТипов(ВсеСсылкиОписание, Документы.ТипВсеСсылки().Типы());
ВсеСсылкиОписание = Новый ОписаниеТипов(ВсеСсылкиОписание, Перечисления.ТипВсеСсылки().Типы());
ВсеСсылкиОписание = Новый ОписаниеТипов(ВсеСсылкиОписание, ПланыСчетов.ТипВсеСсылки().Типы());
ВсеСсылкиОписание = Новый ОписаниеТипов(ВсеСсылкиОписание, ПланыВидовХарактеристик.ТипВсеСсылки().Типы());
ВсеСсылкиОписание = Новый ОписаниеТипов(ВсеСсылкиОписание, Задачи.ТипВсеСсылки().Типы());
ВсеСсылкиОписание = Новый ОписаниеТипов(ВсеСсылкиОписание, ПланыВидовРасчета.ТипВсеСсылки().Типы());
ВсеСсылкиОписание = Новый ОписаниеТипов(ВсеСсылкиОписание, ПланыОбмена.ТипВсеСсылки().Типы());
ВсеСсылкиОписание = Новый ОписаниеТипов(ВсеСсылкиОписание, БизнесПроцессы.ТипВсеСсылки().Типы());
ВсеСсылкиОписание = Новый ОписаниеТипов(ВсеСсылкиОписание, БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().Типы());
После формирования такого объекта ВсеСсылкиОписание, мы можем организовать цикл по метаданным. Проанализируем ситуацию: если количество типов в реквизите совпадает или близко к количеству типов в нашем эталоне, вероятно, перед нами «Любая ссылка».
Существует более изящный способ собрать все ссылки, используя коллекцию Метаданные.Объекты (если ваша версия платформы поддерживает подобные обращения). Посмотрим на пример кода:
ЭталонноеОписание = Новый ОписаниеТипов;
Для каждого Коллекция Из Метаданные Цикл
// Проверяем наличие метода ТипВсеСсылки у коллекции
Попытка
ТипыКоллекции = Коллекция.ТипВсеСсылки().Типы();
ЭталонноеОписание = Новый ОписаниеТипов(ЭталонноеОписание, ТипыКоллекции);
Исключение
// Коллекция не является ссылочной (например, константы или регистры)
КонецПопытки;
КонецЦикла;
Если нет желания писать обработку, выясним причину и воспользуемся встроенными инструментами конфигуратора. Рассмотрим два эффективных метода:
Конфигурация — Отчет по конфигурации. В настройках укажем только интересующие нас объекты (справочники, документы) и их реквизиты. После формирования отчета в текстовом виде достаточно нажать Ctrl + F и выполнить поиск по фразе «Любая ссылка».Конфигурация — Выгрузить конфигурацию в файлы. В полученной папке с помощью любого текстового редактора (например, Notepad++), поддерживающего поиск по файлам, ищем теги <Type>, которые не содержат конкретных ссылок на объекты метаданных, или специфические идентификаторы, отвечающие за неопределенный ссылочный тип.Проанализируем возможности современной среды разработки EDT. Если ваша конфигурация импортирована в проект EDT, поиск упрощается в разы. В панели Search можно настроить фильтры по свойствам объектов метаданных. Использование запросов XPath позволяет мгновенно отобрать все реквизиты, у которых тип данных соответствует максимально широкому набору ссылок.
Выясним, чем опасен такой тип данных с точки зрения системного администрирования и производительности:
Любая ссылка выделяется избыточное количество колонок (для каждого возможного типа) или используется тип данных sql_variant, что значительно увеличивает размер таблиц и замедляет выполнение запросов.Любая ссылка, что может привести к длительной реструктуризации базы данных.Совет: Всегда старайтесь ограничивать состав типов в ОписаниеТипов только теми объектами, которые действительно необходимы для решения бизнес-задачи. Если же вам все же нужно найти все такие места в старой конфигурации, используйте приведенный выше программный метод перебора Метаданные.Справочники, Метаданные.Документы и т.д., проверяя свойство Тип у каждого реквизита.