Как организовать визуальный выбор и хранение объектов метаданных на форме в 1С?

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

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

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

Ограничения платформы при работе с метаданными

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

Для сохранения информации о выбранном объекте метаданных используют следующие подходы:

  1. Строковый идентификатор или полное имя: сохранение полного имени объекта метаданных (например, Документ.РеализацияТоваровУслуг.Реквизит.Контрагент) или относительного пути к данным в виде обычной строки.
  2. Справочник «Идентификаторы объектов метаданных»: использование типового справочника библиотеки стандартных подсистем (БСП).
  3. Сериализованная структура (JSON, XML или ХранилищеЗначения): упаковка полного пути и дополнительных параметров реквизита в выгружаемую структуру.

Использование готовых механизмов БСП и платформы

Если в конфигурации интегрирована Библиотека Стандартных Подсистем (БСП), в ней уже присутствуют готовые инструменты для решения задач выбора метаданных.

Рассмотрим основной функционал БСП:

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

Важная деталь: справочник ИдентификаторыОбъектовМетаданных хранит информацию только об объектах верхнего уровня (документы, справочники, регистры). Если задача требует выбора конкретных реквизитов, табличных частей или отдельных колонок документа, штатного справочника БСП будет недостаточно, и потребуется реализовать хранение строковых путей или дочернее дерево реквизитов.

Построение собственного дерева реквизитов на форме

Для реализации визуального выбора реквизитов и табличных частей документа (по аналогии с конструктором запросов) разберем создание элемента формы типа ДеревоЗначений.

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


&НаСервере
Процедура ЗаполнитьДеревоРеквизитовНаСервере(ИмяДокумента)
    
    ДеревоОбъект = РеквизитФормыВЗначение("ДеревоРеквизитов");
    ДеревоОбъект.Строки.Очистить();
    
    МетаданныеДокумента = Метаданные.Документы[ИмяДокумента];
    
    // Добавляем реквизиты верхнего уровня
    СтрокаРеквизиты = ДеревоОбъект.Строки.Добавить();
    СтрокаРеквизиты.Представление = "Реквизиты";
    
    Для Каждого Реквизит Из МетаданныеДокумента.Реквизиты Цикл
        НоваяСтрока = СтрокаРеквизиты.Строки.Добавить();
        НоваяСтрока.Имя = Реквизит.Имя;
        НоваяСтрока.Представление = Реквизит.Синоним;
        НоваяСтрока.ПутьКДанным = Реквизит.Имя;
    КонецЦикла;
    
    // Добавляем табличные части и их реквизиты
    СтрокаТЧ = ДеревоОбъект.Строки.Добавить();
    СтрокаТЧ.Представление = "Табличные части";
    
    Для Каждого ТабличнаяЧасть Из МетаданныеДокумента.ТабличныеЧасти Цикл
        ПодчиненнаяТЧ = СтрокаТЧ.Строки.Добавить();
        ПодчиненнаяТЧ.Имя = ТабличнаяЧасть.Имя;
        ПодчиненнаяТЧ.Представление = ТабличнаяЧасть.Синоним;
        
        Для Каждого РеквизитТЧ Из ТабличнаяЧасть.Реквизиты Цикл
            СтрокаРеквизитаТЧ = ПодчиненнаяТЧ.Строки.Добавить();
            СтрокаРеквизитаТЧ.Имя = РеквизитТЧ.Имя;
            СтрокаРеквизитаТЧ.Представление = РеквизитТЧ.Синоним;
            СтрокаРеквизитаТЧ.ПутьКДанным = ТабличнаяЧасть.Имя + "." + РеквизитТЧ.Имя;
        КонецЦикла;
    КонецЦикла;
    
    ЗначениеВРеквизитФормы(ДеревоОбъект, "ДеревоРеквизитов");

КонецПроцедуры

Использование Компоновщика настроек СКД

Еще один практичный способ дать пользователю интерактивный выбор полей — использование механизма Схемы компоновки данных (СКД).

Проанализируем преимущества этого подхода:

  1. Программно создается схема компоновки данных, в которую добавляется объект метаданных (или набор данных - запрос).
  2. На форму выводится `КомпоновщикНастроекКомпоновкиДанных` (поля выбора или отбора).
  3. Платформа автоматически строит дерево полей с возможностью раскрытия ссылочных реквизитов «через точку».
  4. Настройки пользователя сериализуются платформенным методом СериализаторXDTO или сохраняются в ХранилищеЗначения.

Рекомендации по надежности хранения

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

Чтобы избежать ошибок выполнения программы, рекомендуем соблюдать следующие правила:

  1. Проверка валидности при чтении: перед использованием сохраненного пути проверяйте существование реквизита через глобальный контекст Метаданные.НайтиПоПолномуИмени().
  2. Использование JSON вместо двоичных данных: сохраняйте структуры настроек в виде строк JSON. Это облегчает отладку и миграцию данных между базами по сравнению с бинарным ХранилищеЗначения.
← На главную