8.х Получить имя справочника

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем WWW123, 28 ноя 2009.

  1. TopicStarter Overlay
    WWW123
    Offline

    WWW123 Опытный в 1С

    Регистрация:
    23 фев 2009
    Сообщения:
    181
    Симпатии:
    0
    Баллы:
    26
    Необходимо получить ссылку на справочник, в виде: Справочники.<НужныйСправочник>

    Имею:
    Код:
    // получить ссылку
    ссылка1 = <Документ>.Реквизиты.Получить(1).тип;
    
    получется:
    Справочник ссылка: Лицевые счета
    А надо хотя бы: ЛицевыеСчета , т.е. не синоним а имя справочника
    Само собой разумеется, что
    Код:
    ссылка1 = <Документ>.Реквизиты.Получить(1).имя 
    
    даст имя реквизита, а не справочника.
  2. tirk
    Offline

    tirk Опытный в 1С

    Регистрация:
    1 сен 2008
    Сообщения:
    1.142
    Симпатии:
    0
    Баллы:
    26
    ДОкументы.ВашДокумент.Метаданные().Имя

    Справочники.ВашСправочник.Метаданные().Имя
  3. TopicStarter Overlay
    WWW123
    Offline

    WWW123 Опытный в 1С

    Регистрация:
    23 фев 2009
    Сообщения:
    181
    Симпатии:
    0
    Баллы:
    26
    Может быть, я неправильно объяснил…

    У меня есть документ, в котором есть реквизит являющейся ссылкой на справочник.
    Надо получить Имя этого справочника.

    Конечно спасибо, за совет, но если сделать, как Вы сказали, то получается:

    Метод объекта не обнаружен (Метаданные)
    Сообщить(Справочники.ЛицевыеСчета.Метаданные().Имя )

    Да и собственно говоря, как раз не известно имя справочника.
  4. tirk
    Offline

    tirk Опытный в 1С

    Регистрация:
    1 сен 2008
    Сообщения:
    1.142
    Симпатии:
    0
    Баллы:
    26
    Ну что то и не знаю.. что то не то делаете)) может ссылка пустая??
  5. Svetatvt
    Offline

    Svetatvt

    Регистрация:
    29 ноя 2009
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Если есть ссылка, то
    Ссылка.Метаданные().Имя
  6. TopicStarter Overlay
    WWW123
    Offline

    WWW123 Опытный в 1С

    Регистрация:
    23 фев 2009
    Сообщения:
    181
    Симпатии:
    0
    Баллы:
    26
    Делаю так:

    Код:
    Ссылка = Документ.Метаданные().Реквизиты.Получить(2).тип;
    Сообщить(Ссылка);
    
    
    Где:
    Документ – поле ввода, тип значения: СправочникСсылка
    Получить(2) - номер нужного реквизита


    Получаю:
    Справочник ссылка: Лицевые счета

    Делаю по Вашему:

    Код:
    Ссылка = ВидДокумента1.Метаданные().Реквизиты.Получить(2).тип;
    сылка1=Ссылка.Метаданные().Имя;
    Сообщить(Ссылка1);
    
    

    Получаю:
    Метод объекта не обнаружен (Метаданные)
    ссылка1=Ссылка.Метаданные().Имя ;

    В конечном счёте мне нужно получить справочник, и найти в нём реквизит, на который ссылается реквизит документа.
  7. TopicStarter Overlay
    WWW123
    Offline

    WWW123 Опытный в 1С

    Регистрация:
    23 фев 2009
    Сообщения:
    181
    Симпатии:
    0
    Баллы:
    26
    Всё оказалось просто:
    Было:
    Справочник ссылка: Лицевые счета
    После:
    Код:
    СтрЗаменить(Ссылка," ","");
    
    
    Стало:
    Справочникссылка:Лицевыесчета
    Теперь обрезаем:
    Код:
    СсылкаДо = Сред(типРеквезита,20 ) ;
    
    
    И добираемся до реквизита справочника:
    Код:
    ЯчейкаСпр = Справочники[Ссылка].НайтиПоНаименованию(Ячейка);
    
    
  8. Svetatvt
    Offline

    Svetatvt

    Регистрация:
    29 ноя 2009
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    ссылка1 = <Документ>.Реквизиты.Получить(1).тип;
    получется:
    Справочник ссылка: Лицевые счета
    Если Найти(Ссылка1,"Справочник ссылка:") > 0 Тогда
    // в том случае если мы знаем что реквизит имеет тип справка заранее, иначе можно было бы найти слово ссылка, чтобы убедиться, что это не строка, не булево и не число ну это так отступление, потому что не знаю, что вам конкретно нужно//
    Синоним = СокрЛП(Сред(Ссылка1,19));

    ИмяСправочника = "";
    КоличествоОдинаковыхСинонимов = 0;

    Для Каждого Справочник Из Метаданные.Справочники Цикл
    Если Синоним = СокрЛП(Справочник.Синоним) Тогда
    ИмяСправочника = Справочник.Имя;
    КоличествоОдинаковыхСинонимов = КоличествоОдинаковыхСинонимов +1;
    КонецЕсли;
    КонецЦикла;

    КонецЕсли;
    //если КоличествоОдинаковыхСинонимов > 1 тогда уже нужно еще что-нить придумывать, а такое очень даже не исключено
    Конечно еще можно сделать пару извращений (Например, запросом получить ссылку накакой-нить существующий документ либо создать документ программным путем по ссылке из документа легко получить имя реквизита, а потом уж и имя справочника, но это все тоже очередное извращение), если ничего лучшего не придумаете, то .....
    а если придумаете, то обязательно сообщите, сама когда-то на такую тему заморачивалась...


    Так на будущее хотела вам предложить что-нить подобное, но дело в том что очень часто синонимы содержат не только пробелы, а могут и вообще не быть похожими на имя справочника, у вас получился частный удачный "финт ушами" :unsure:
  9. TopicStarter Overlay
    WWW123
    Offline

    WWW123 Опытный в 1С

    Регистрация:
    23 фев 2009
    Сообщения:
    181
    Симпатии:
    0
    Баллы:
    26
    Спасибо, очень интересно, на счёт синонимов согласен..
  10. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Мне кажется, что Вы неправильно представляете себе работу с метаданными просто. Вот смотрите, ваша строка:
    Код:
    Ссылка = Документ.Метаданные().Реквизиты.Получить(2).тип;
    
    Она возвращает не тип, а описание типов - т.е. массив типов, которые может принимать данный реквизит. В Вашем случае этот реквизит имеет несоставной тип данных, а конкретно "Справочники.ЛицевыеСчета" - поэтому Вы и получаете представление "Справочник ссылка: Лицевые счета". Если бы реквизит имел составной тип данных, то Вы получили бы описание всех типов этого реквизита через запятую.
    У описния типов есть метод "Типы", который возвращает массив типов. Поэтому, если Вам нужен именно тип, то нужно получать его из этого массива. В Вашем случае это можно сделать так:
    Код:
    ТипРеквизита = Документ.Метаданные().Реквизиты.Получить(2).Тип.Типы()[0];
    
    т.е. выбрать тип из первой строки массива.
    Стоить отметить, что если реквизит составного типа, а Вам нужен тип значения этого реквизита, то нужно получать именно тип значения. Через метаданные это будет, примерно, так:
    Код:
    ТипРеквизита = ТипЗнч(Документ[Документ.Метаданные().Реквизиты.Получить(2).имя])
    
    т.е. через метаданные получаем имя реквизита с нужным индексом, из Документ[] - значение этого реквизита, а через ТипЗнч() - уже тип.
    Далее Вам нужно найти объект метаданных, котрый этот тип описывает. Делается это так:
    Код:
    ОМ = Метаданные.НайтиПоТипу(ТипРеквизита);
    
    где ТипРеквизита - интересующий нас тип. Ну, а имя отсюда получаем через соответствующее свойство:
    Код:
    ИмяТипа = ОМ.Имя;
    
    Результатом всего этого можно воспользоваться в Вашей строке:
    Код:
    ЯчейкаСпр = Справочники[ИмяТипа].НайтиПоНаименованию(Ячейка);
    
    P.S. А вот определить к чему относится объект метаданных, по-моему, без перебора не удастся, но можно определить так:
    Код:
    ОМ = Метаданные.НайтиПоТипу(ТипРеквизита);
    Если Метаданные.Справочники.Содержит(ОМ) Тогда
    ЭлементКоллекции = "Справочники";
    ИначеЕсли Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
    ЭлементКоллекции = "Документы";
    // проверяем другие элементы коллекции...
    КонецЕсли;
    
  11. Svetatvt
    Offline

    Svetatvt

    Регистрация:
    29 ноя 2009
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Обращение идет не к ссылке документа, а к документу как объекту метаданных, по ссылке легко
  12. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    У автора ссылка на документ была в поле ввода. И вообще, если у реквизита несоставной тип данных, то делается все по приведенному алгоритму. А если составной, то без конкретного значения никак не определить какой тип нужно получить.

Поделиться этой страницей