Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Определить "описание" прикладного объекта по непосредственно объекту или ссылке на него
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.1 (8.0)
Dmitriy-CoDy
Все привет....

Оч нужна помощь в решении следующей задачи:

как можно определить принадлежность объекта к Справочникам, РегистрамНакопления, Документам......?


То есть у меня есть экземпляр прикладного объекта или ссылка на него, нужно получить к чему он относится.

Например:
// Тип этого объекта(): Справочник объект: Склад.
Объект = Справочники.Склад.СоздатьЭлемент();
// Мне нужно получить следующее:
// Имя прикладного объекта: = Склад
// Тип прикладного объекта: = Справочник
// Класс прикладного объекта: объект


// Тип этого объекта(): Справочник ссылка: Склад.
Объект = Справочники.Склад.ПустаяСсылка();
// Мне нужно получить следующее:
// Имя прикладного объекта: = Склад
// Тип прикладного объекта: = Справочник
// Класс прикладного объекта: ссылка


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


Но щас столкнулся с определением описания для такого объекта:
// Тип этого объекта(): Регистр накопления набор записей: Товаров на складах.
Объект = РегистрыНакопления.ТоваровНаСкладах.СоздатьНаборЗаписей();
// Мне нужно получить следующее:
// Имя прикладного объекта: = Товаров на складах
// Тип прикладного объекта: = РегистрНакопления
// Класс прикладного объекта: набор записей


Такую строчку распарсить не получается.

Есть ли нормальный метод определения нужных мне данных, а не такие костыли как я использую?
Только не спрашивайте зачем мне это нужно.. smile.gif)
Vofka
Цитата
как можно определить принадлежность объекта к Справочникам, РегистрамНакопления, Документам......?

Наверное через
Метаданные()

и
Документы
,
Справочники

...

Времени сейчас нет разбираться и написать более точно, но думаю нужно смотреть в этом направлении
Dmitriy-CoDy
Не получилось сделать все по правилам sad.gif(.

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