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