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