Как программно перебрать реквизиты и табличные части документов и справочников в 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Понятие метаданных и коллекций объектов

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

Реализация обхода через подписку на событие

Автор вопроса изначально планировал использовать Подписку на событие. Это мощный инструмент, который позволяет выполнить код автоматически при записи или проведении объекта. Рассмотрим, как правильно организовать обработчик в общем модуле.

Важно помнить: если мы поместим тяжелый цикл перебора всей базы внутрь подписки ПриЗаписи, система будет зависать при сохранении каждого документа. Поэтому в рамках подписки мы обычно анализируем только один объект — тот, который записывается в данный момент (параметр Источник). Но если задача стоит именно в «пробежке» по всем метаданным, разберем универсальный код.

Шаг 1: Получение списка объектов метаданных

Выясним, как составить список всех справочников и документов. Мы можем создать массив строк с именами классов метаданных и перебирать их. Посмотрим на пример кода:


Процедура ОбходВсехМетаданных() Экспорт
    МассивКлассов = Новый Массив;
    МассивКлассов.Добавить("Справочники");
    МассивКлассов.Добавить("Документы");

    Для Каждого ИмяКласса Из МассивКлассов Цикл
        Для Каждого ОбъектМетаданных Из Метаданные[ИмяКласса] Цикл
            Сообщить("Анализируем тип: " + ИмяКласса + " - " + ОбъектМетаданных.Имя);
            
            // Здесь мы будем вызывать процедуру анализа реквизитов
            АнализироватьРеквизитыОбъекта(ОбъектМетаданных);
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Шаг 2: Анализ реквизитов и типов данных

Теперь разберем подробнее, как заглянуть внутрь конкретного объекта метаданных. У каждого объекта есть коллекции Реквизиты и ТабличныеЧасти. Нам нужно пройтись по ним циклом и вывести информацию о типе каждого поля. Рассмотрим реализацию этой логики:


Процедура АнализироватьРеквизитыОбъекта(ОбъектМетаданных)
    // 1. Обход обычных реквизитов
    Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл
        ИмяРеквизита = Реквизит.Имя;
        ТипРеквизита = Реквизит.Тип;
        Сообщить("  Реквизит: " + ИмяРеквизита + "; Тип: " + ТипРеквизита);
    КонецЦикла;

    // 2. Обход табличных частей
    Для Каждого ТЧ Из ОбъектМетаданных.ТабличныеЧасти Цикл
        Сообщить("  Табличная часть: " + ТЧ.Имя);
        
        // Внутри ТЧ тоже есть свои реквизиты
        Для Каждого РеквизитТЧ Из ТЧ.Реквизиты Цикл
            Сообщить("    Реквизит ТЧ: " + РеквизитТЧ.Имя + "; Тип: " + РеквизитТЧ.Тип);
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Шаг 3: Работа с реальными данными через запрос

Если задача состоит не только в анализе структуры (метаданных), но и в проверке заполненности реквизитов в конкретных документах, нам потребуется работа с данными. Как было предложено в обсуждении на форуме, наиболее эффективный способ — использование менеджеров объектов и запросов. Проанализируем пример, который выбирает все ссылки объектов и проверяет их содержимое.


Запрос = Новый Запрос;
ТекстЗапросаШаблон = "ВЫБРАТЬ Ссылка ИЗ &ИмяТаблицы";

Для Каждого Менеджер Из Документы Цикл
    Мета = Менеджер.ПустаяСсылка().Метаданные();
    ИмяОбъекта = Мета.ПолноеИмя();
    
    Запрос.Текст = СтрЗаменить(ТекстЗапросаШаблон, "&ИмяТаблицы", ИмяОбъекта);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        ОбъектСсылка = Выборка.Ссылка;
        Сообщить("Документ: " + ОбъектСсылка);
        
        // Обходим заполненные реквизиты объекта
        Для Каждого Рек Из Мета.Реквизиты Цикл
            Значение = ОбъектСсылка[Рек.Имя];
            Сообщить(" - " + Рек.Имя + " = " + Значение);
        КонецЦикла;
        
        // Проверяем табличные части
        Для Каждого ТЧМета Из Мета.ТабличныеЧасти Цикл
            Таблица = ОбъектСсылка[ТЧМета.Имя].Выгрузить();
            Если Таблица.Количество() > 0 Тогда
                Сообщить(" -- ТЧ " + ТЧМета.Имя + " заполнена, строк: " + Таблица.Количество());
            Иначе
                Сообщить(" -- ТЧ " + ТЧМета.Имя + " ПУСТАЯ");
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецЦикла;

Важные нюансы при работе с реквизитами

При реализации подобных механизмов стоит обратить внимание на следующие моменты:

  1. Стандартные реквизиты: Кроме тех реквизитов, что мы создали сами, у объектов есть СтандартныеРеквизиты (например, Код, Наименование, Дата, Номер). Они хранятся в отдельной коллекции метаданных.
  2. Производительность: Перебор всех документов в цикле через ОбъектСсылка[...] может быть очень медленным в больших базах. Если нужно просто проверить заполненность, лучше делать это целиком через Запрос.
  3. Права доступа: Используйте функцию ПравоДоступа("Чтение", ОбъектМетаданных), чтобы избежать ошибок при обращении к объектам, на которые у текущего пользователя нет прав.
  4. Тип значения: Для определения типа программно используйте функцию ТипЗнч() или обращайтесь к свойству метаданных Тип, которое возвращает объект ОписаниеТипов.

Использование отладчика

Для понимания того, как устроены «потроха» объектов, настоятельно рекомендуем использовать Отладчик. Поставьте точку останова на строке с объектом метаданных, добавьте его в «Табло» и раскройте дерево свойств. Вы увидите все коллекции (Реквизиты, ТабличныеЧасти, Макеты и т.д.), что позволит вам лучше ориентироваться в иерархии метаданных 1С.

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

← На главную