v8: Проверка типов Ключевые слова: тип, вид, менеджер, перебор
Прошу коллег добавить комментарии и свои функции по определению типов объектов.
Функция Типизация_СправочникСписок_ВидСправочника(ТипСправочникСписок) Экспорт
Для Каждого Эл Из Метаданные.Справочники Цикл
Если Тип("СправочникСписок."+Эл.Имя)=ТипСправочникСписок Тогда
Возврат Эл.Имя;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Функция Типизация_ДокументСписок_ВидДокумента(ТипДокументСписок) Экспорт
Для Каждого Эл Из Метаданные.Документы Цикл
Если Тип("СправочникСписок."+Эл.Имя)=ТипДокументСписок Тогда
Возврат Эл.Имя;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Функция Типизация_МетаданныеФормы(Форма) Экспорт
Рез=Новый Структура();
Рез.Вставить("Класс", Неопределено);
Рез.Вставить("Тип", Неопределено);
Рез.Вставить("Вид", Неопределено);
Рез.Вставить("Список", Неопределено);
Если Форма.ЭлементыФормы.Найти("ДокументОбъект")<>Неопределено Тогда
Рез.Класс="Документ";
Рез.Вид=Форма.ДокументОбъект.Метаданные().Имя;
Рез.Список=ложь;
ИначеЕсли Форма.ЭлементыФормы.Найти("СправочникОбъект")<>Неопределено Тогда
Рез.Класс="Справочник";
Рез.Вид=Форма.СправочникОбъект.Метаданные().Имя;
Рез.Список=ложь;
ИначеЕсли Форма.ЭлементыФормы.Найти("СправочникСписок")<>Неопределено Тогда
Рез.Класс="Справочник";
Рез.Вид=Типизация_СправочникСписок_ВидСправочника(ТипЗнч(Форма.СправочникСписок));
Рез.Список=ложь;
ИначеЕсли Форма.ЭлементыФормы.Найти("СправочникСписок")<>Неопределено Тогда
Рез.Класс="Справочник";
Рез.Вид=Типизация_СправочникСписок_ВидСправочника(ТипЗнч(Форма.ДокументСписок));
Рез.Список=ложь;
КонецЕсли;
Возврат Рез;
КонецФункции
Функция Типизация_ЭтоВнешняяОбработка(Тип)
//Взято из регламентированных отчетов
ЭтоВнешняяОбработка = (Лев(СтроковоеПредставлениеТипаОбъекта, 24) = "Внешняя обработка объект");
КонецФункции
Нашел ошибку - Форма.ЭлементыФормы.Найти("ДокументОбъект") и Форма.ЭлементыФормы.Найти("СправочникОбъект") - неправильная запись. Невозможно проверить, это форма документа-объекта или справочника-объекта без Попытка-Исключение. Так что нужно использовать в этой функции Попытка-Исключение. Позже исправлю. |