При разработке подсистем настройки печатных форм, динамических отчетов или механизмов адресации часто возникает необходимость давать пользователю или администратору возможность визуально выбирать объекты метаданных (справочники, документы, их реквизиты и табличные части) и сохранять этот выбор в базе данных.
Разберем основные трудности, с которыми сталкиваются разработчики при решении этой задачи, а также проанализируем проверенные архитектурные подходы и готовые механизмы платформы 1С:Предприятие.
Главная особенность платформы состоит в том, что объект типа ОбъектМетаданных существует исключительно в оперативной памяти во время работы сеанса. Он не является ссылочным типом данных базы 1С. По этой причине его нельзя напрямую записать в реквизит справочника или документ типа Ссылка без предварительного преобразования.
Для сохранения информации о выбранном объекте метаданных используют следующие подходы:
Документ.РеализацияТоваровУслуг.Реквизит.Контрагент) или относительного пути к данным в виде обычной строки.Если в конфигурации интегрирована Библиотека Стандартных Подсистем (БСП), в ней уже присутствуют готовые инструменты для решения задач выбора метаданных.
Рассмотрим основной функционал БСП:
ВыборОбъектовМетаданных: встроенная форма, предоставляющая древовидный интерфейс для выбора объектов конфигурации. Она позволяет выбрать справочники, документы, отчеты и другие элементы верхнего уровня.ИдентификаторыОбъектовМетаданных: предназначен для хранения ссылок на объекты метаданных верхнего уровня. Его удобнее всего использовать в качестве типа реквизита, когда требуется сослаться на конкретный справочник или документ.Важная деталь: справочник ИдентификаторыОбъектовМетаданных хранит информацию только об объектах верхнего уровня (документы, справочники, регистры). Если задача требует выбора конкретных реквизитов, табличных частей или отдельных колонок документа, штатного справочника БСП будет недостаточно, и потребуется реализовать хранение строковых путей или дочернее дерево реквизитов.
Для реализации визуального выбора реквизитов и табличных частей документа (по аналогии с конструктором запросов) разберем создание элемента формы типа ДеревоЗначений.
Посмотрим на пример процедур заполнения дерева реквизитов для выбранного документа на сервере:
&НаСервере
Процедура ЗаполнитьДеревоРеквизитовНаСервере(ИмяДокумента)
ДеревоОбъект = РеквизитФормыВЗначение("ДеревоРеквизитов");
ДеревоОбъект.Строки.Очистить();
МетаданныеДокумента = Метаданные.Документы[ИмяДокумента];
// Добавляем реквизиты верхнего уровня
СтрокаРеквизиты = ДеревоОбъект.Строки.Добавить();
СтрокаРеквизиты.Представление = "Реквизиты";
Для Каждого Реквизит Из МетаданныеДокумента.Реквизиты Цикл
НоваяСтрока = СтрокаРеквизиты.Строки.Добавить();
НоваяСтрока.Имя = Реквизит.Имя;
НоваяСтрока.Представление = Реквизит.Синоним;
НоваяСтрока.ПутьКДанным = Реквизит.Имя;
КонецЦикла;
// Добавляем табличные части и их реквизиты
СтрокаТЧ = ДеревоОбъект.Строки.Добавить();
СтрокаТЧ.Представление = "Табличные части";
Для Каждого ТабличнаяЧасть Из МетаданныеДокумента.ТабличныеЧасти Цикл
ПодчиненнаяТЧ = СтрокаТЧ.Строки.Добавить();
ПодчиненнаяТЧ.Имя = ТабличнаяЧасть.Имя;
ПодчиненнаяТЧ.Представление = ТабличнаяЧасть.Синоним;
Для Каждого РеквизитТЧ Из ТабличнаяЧасть.Реквизиты Цикл
СтрокаРеквизитаТЧ = ПодчиненнаяТЧ.Строки.Добавить();
СтрокаРеквизитаТЧ.Имя = РеквизитТЧ.Имя;
СтрокаРеквизитаТЧ.Представление = РеквизитТЧ.Синоним;
СтрокаРеквизитаТЧ.ПутьКДанным = ТабличнаяЧасть.Имя + "." + РеквизитТЧ.Имя;
КонецЦикла;
КонецЦикла;
ЗначениеВРеквизитФормы(ДеревоОбъект, "ДеревоРеквизитов");
КонецПроцедуры
Еще один практичный способ дать пользователю интерактивный выбор полей — использование механизма Схемы компоновки данных (СКД).
Проанализируем преимущества этого подхода:
СериализаторXDTO или сохраняются в ХранилищеЗначения.При хранении строковых путей к реквизитам метаданных важно учитывать, что реквизиты конфигурации могут переименовываться или удаляться в процессе доработок.
Чтобы избежать ошибок выполнения программы, рекомендуем соблюдать следующие правила:
Метаданные.НайтиПоПолномуИмени().ХранилищеЗначения.