Как создать отчет в 1С, который показывает типы объектов (документы, справочники), реально используемые в базе данных?

Программист 1С v8.3 (Управляемые формы)
← На главную

Разработка отчета, который отображает типы объектов метаданных, для которых фактически существуют данные в информационной базе, является актуальной задачей для многих специалистов 1С. Такой отчет позволяет получить точное представление об активном использовании тех или иных частей конфигурации, выявить неиспользуемые объекты и оптимизировать структуру системы. В этой статье мы подробно рассмотрим различные подходы к решению данной задачи, начиная от программной реализации и заканчивая использованием встроенных инструментов.

Прежде всего, давайте уточним ключевое понятие, которое часто вызывает путаницу: различие между "существующими" и "используемыми" объектами.

Задача нашего отчета — показать именно используемые объекты.

Подход 1: Программная реализация отчета для определения используемых объектов

Наиболее точный и гибкий способ получить список используемых объектов — это написать специальный программный механизм. Мы будем перебирать метаданные конфигурации и для каждого типа объекта проверять наличие данных в информационной базе.

Шаг 1: Доступ к метаданным

Встроенный язык 1С предоставляет нам удобный доступ к структуре метаданных конфигурации через глобальный контекст Метаданные. Мы можем получить доступ к коллекциям всех справочников через Метаданные.Справочники и всех документов через Метаданные.Документы. Эти коллекции предоставляют нам информацию о структуре объектов, такую как их имя, синоним, состав реквизитов и табличных частей.

Доступ к метаданным предназначен только для чтения, что позволяет нам создавать универсальные алгоритмы, способные работать с любой конфигурацией без ее изменения.

Для начала, мы можем получить список всех документов и справочников, определенных в нашей конфигурации:


// Получаем коллекцию всех справочников
КоллекцияСправочниковМетаданных = Метаданные.Справочники;

// Получаем коллекцию всех документов
КоллекцияДокументовМетаданных = Метаданные.Документы;

Шаг 2: Перебор метаданных и проверка наличия данных

После того как мы получили коллекции объектов метаданных, нам необходимо перебрать каждый элемент этих коллекций. Для каждого элемента мы будем формировать и выполнять запрос к базе данных, чтобы проверить, есть ли хоть одна запись, соответствующая данному типу объекта.

Для каждого объекта метаданных (например, справочника или документа) мы должны программно проверить наличие записей в базе данных. Это можно сделать, выполнив запрос к соответствующей таблице данных. Например, для справочника "Номенклатура" нужно проверить, есть ли в таблице Справочник.Номенклатура хоть одна запись. Аналогично для документов.

Мы будем использовать объект Запрос для взаимодействия с базой данных. В запросе мы просто попытаемся посчитать количество записей. Если количество будет больше нуля, значит, объект используется.

Рассмотрим структуру запроса для справочников:


// Пример запроса для проверки наличия элементов справочника
ТекстЗапросаСправочника = "ВЫБРАТЬ ПЕРВЫЕ 1 Т1.Ссылка ИЗ &ИмяТаблицы КАК Т1";

И для документов:


// Пример запроса для проверки наличия документов
ТекстЗапросаДокумента = "ВЫБРАТЬ ПЕРВЫЕ 1 Т1.Ссылка ИЗ &ИмяТаблицы КАК Т1";

Обратите внимание на &ИмяТаблицы — это параметр запроса, который мы будем подставлять динамически. ПЕРВЫЕ 1 используется для оптимизации: нам не нужно знать точное количество записей, достаточно узнать, есть ли хотя бы одна, что значительно ускоряет выполнение запроса на больших таблицах.

Шаг 3: Динамическое формирование и выполнение запросов

Теперь объединим эти шаги в единый алгоритм для получения списка используемых справочников и документов. Мы создадим две функции, по одной для каждого типа метаданных, которые будут возвращать список используемых объектов.

Алгоритм для справочников:

  1. Перебираем каждый СправочникМетаданных в Метаданные.Справочники.
  2. Для каждого справочника формируем текст запроса, используя его полное имя (например, "Справочник.Номенклатура").
  3. Выполняем запрос и проверяем, есть ли результат (хотя бы одна запись).
  4. Если результат есть, добавляем имя справочника в список используемых.

Пример кода для справочников:


Функция ПолучитьИспользуемыеСправочники()

    СписокИспользуемыхСправочников = Новый СписокЗначений();

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

    Возврат СписокИспользуемыхСправочников;

КонецФункции

Алгоритм для документов:

  1. Перебираем каждый ДокументМетаданных в Метаданные.Документы.
  2. Для каждого документа формируем текст запроса, используя его полное имя (например, "Документ.РеализацияТоваровУслуг").
  3. Выполняем запрос и проверяем, есть ли результат.
  4. Если результат есть, добавляем имя документа в список используемых.

Пример кода для документов:


Функция ПолучитьИспользуемыеДокументы()

    СписокИспользуемыхДокументов = Новый СписокЗначений();

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

    Возврат СписокИспользуемыхДокументов;

КонецФункции

Шаг 4: Вывод результатов в отчет

После того как мы получили списки используемых справочников и документов, нам необходимо вывести их в удобном для пользователя виде. Это может быть таблица на форме обработки или программно сформированный табличный документ.

Мы можем создать новую внешнюю обработку или отчет, добавить на форму кнопку "Сформировать", и при ее нажатии вызывать наши функции. Результаты можно вывести в табличное поле на форме или в табличный документ.

Пример обработки результатов:


&НаКлиенте
Процедура СформироватьОтчет(Команда)
    
    Результат = ПолучитьДанныеСервера(); // Вызов серверной функции

    Если Результат.ИспользуемыеСправочники.Количество() > 0 Тогда
        Сообщить("Используемые справочники:");
        Для Каждого Элемент Из Результат.ИспользуемыеСправочники Цикл
            Сообщить("  - " + Элемент.Представление);
        КонецЦикла;
    Иначе
        Сообщить("Используемые справочники не найдены.");
    КонецЕсли;
    
    Если Результат.ИспользуемыеДокументы.Количество() > 0 Тогда
        Сообщить("Используемые документы:");
        Для Каждого Элемент Из Результат.ИспользуемыеДокументы Цикл
            Сообщить("  - " + Элемент.Представление);
        КонецЦикла;
    Иначе
        Сообщить("Используемые документы не найдены.");
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Функция ПолучитьДанныеСервера()
    
    СтруктураРезультата = Новый Структура();
    СтруктураРезультата.Вставить("ИспользуемыеСправочники", ПолучитьИспользуемыеСправочники());
    СтруктураРезультата.Вставить("ИспользуемыеДокументы", ПолучитьИспользуемыеДокументы());
    
    Возврат СтруктураРезультата;
    
КонецФункции

Для более продвинутого отчета, мы можем расширить функционал:

Такой программный подход позволяет создать очень точный и настраиваемый отчет, который отвечает специфическим требованиям по определению "используемых" объектов.

Подход 2: Использование существующих инструментов и режимов

Платформа 1С:Предприятие предлагает ряд встроенных инструментов, которые могут быть полезны для анализа объектов метаданных. Однако важно понимать их ограничения в контексте нашей задачи — определения *используемых* объектов.

1. Режим технического специалиста

Режим технического специалиста (доступен через "Главное меню" - "Функции для технического специалиста" или по горячей клавише Ctrl+Alt+Shift+T) предоставляет доступ к общему списку *всех* объектов конфигурации. Здесь вы увидите константы, справочники, документы, регистры, обработки, отчеты и другие элементы в виде древовидной структуры, аналогичной конфигуратору.

Преимущества:

Ограничения для нашей задачи:

Таким образом, режим технического специалиста полезен для обзора структуры конфигурации, но не решает задачу определения *используемых* типов объектов.

2. Отчет по конфигурации

В режиме "Конфигуратор" доступен "Отчет по конфигурации" (меню Конфигурация – Отчет по конфигурации). Этот инструмент генерирует очень детальный отчет, описывающий структуру объектов метаданных и их свойства: реквизиты, табличные части, формы, модули, роли и права доступа. Это мощный инструмент для документации конфигурации и анализа ее структуры.

Преимущества:

Ограничения для нашей задачи:

Этот отчет незаменим для разработчиков и архитекторов, но не помогает конечным пользователям или аналитикам понять, какие типы объектов реально содержат данные.

3. Стандартная обработка "Поиск ссылок на объекты"

Эта стандартная обработка (доступна через "Функции для технического специалиста" – "Стандартные обработки") позволяет найти, где *конкретный экземпляр* объекта базы данных используется другими объектами. Например, вы можете выбрать конкретный элемент справочника "Номенклатура" и узнать, в каких документах он был использован.

Преимущества:

Ограничения для нашей задачи:

Таким образом, "Поиск ссылок на объекты" — ценный инструмент для детального анализа связей данных, но не предназначен для решения нашей задачи.

Подход 3: Использование специализированных внешних отчетов и обработок

На различных ресурсах, таких как Инфостарт, доступны внешние отчеты и обработки, специально предназначенные для анализа *используемых* объектов метаданных в базе данных. Эти решения часто разрабатываются опытными специалистами и учитывают множество нюансов, таких как производительность, удобство вывода информации и дополнительные возможности.

Преимущества специализированных решений:

Как найти и использовать:

Этот подход является наиболее удобным, если вы не хотите тратить время на самостоятельную разработку или нуждаетесь в более продвинутом функционале, чем тот, что можно быстро реализовать. Однако, всегда следует внимательно проверять такие решения перед использованием в продуктивной базе.

Заключение

Мы рассмотрели несколько подходов к созданию отчета, показывающего типы объектов (документы, справочники), используемые в базе 1С. Каждый из них имеет свои особенности:

  1. Программная реализация предоставляет максимальную гибкость и точность. Это самый полный и верный путь, если требуется индивидуальный или высокопроизводительный отчет, учитывающий специфические требования. Она позволяет четко отделить "используемые" объекты от "существующих", что является основной задачей.
  2. Встроенные инструменты (Режим технического специалиста, Отчет по конфигурации, Поиск ссылок на объекты) полезны для обзора структуры метаданных или анализа конкретных данных, но не позволяют получить общую картину используемых типов объектов. Они показывают либо *все* объекты конфигурации, либо *связи между экземплярами* данных.
  3. Специализированные внешние отчеты предлагают готовые, часто расширенные решения, которые могут сэкономить время и предоставить богатый функционал. Это отличный вариант, если подходящее решение уже существует и не требует значительных доработок.

Выбор подхода зависит от ваших целей, доступных ресурсов и требуемой детализации отчета. В большинстве случаев, если вам нужен точный и настраиваемый список именно *используемых* объектов, то программная реализация будет оптимальным решением, позволяющим полностью контролировать логику определения и вывода данных.

← На главную