Определить ссылку по УИДу, не зная вида

База знаний
  1. 7 г. назад

    Сейчас нахожу так:
    ЭлементСправочника = Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(УИД));

    А как определить, если мы заранее не знаем вид справочника?

    ЗЫ
    сорри за тупняк

    ЗЫЗЫ
    только у меня миста лежит?

  2. Цикл по всем видам справочника.

    Ответы: (3)
  3. http://webhamster.ru/mytetrashare/index/mtb0/1355391258v2dg8vuf67

    Ответы: (3) (5)
  4. 21.04.2016 12:21:31 отредактировано 1Сергей

    (1), (2) Спасибо!

    ЗЫ
    Так миста только у меня лежит или у всех?

    Ответы: (4)
  5. (3) только у тебя...

  6. Чуть допилил (2), до нормального состояния

    Функция ПолучитьСсылкуПоУИД(УИД, ОбъектыМенеджер = Неопределено)
    	
    	УникальныйИдентификатор = Новый УникальныйИдентификатор(УИД);
    	
    	Если ОбъектыМенеджер = Неопределено Тогда
    		
    		СсылкаНаОбъектГуид = ПолучитьСсылкуПоУИД(УИД, Справочники);
    		
    		Если СсылкаНаОбъектГуид = Неопределено Тогда
    			СсылкаНаОбъектГуид = ПолучитьСсылкуПоУИД(УИД, Документы);
    		КонецЕсли;
    		
    		Если СсылкаНаОбъектГуид = Неопределено Тогда
    			СсылкаНаОбъектГуид = ПолучитьСсылкуПоУИД(УИД, ПланыВидовХарактеристик);
    		КонецЕсли;
    		
    		Если СсылкаНаОбъектГуид = Неопределено Тогда
    			СсылкаНаОбъектГуид = ПолучитьСсылкуПоУИД(УИД, ПланыСчетов);
    		КонецЕсли;
    		
    		Если СсылкаНаОбъектГуид = Неопределено Тогда
    			СсылкаНаОбъектГуид = ПолучитьСсылкуПоУИД(УИД, ПланыОбмена);
    		КонецЕсли;
    		
    		Если СсылкаНаОбъектГуид = Неопределено Тогда
    			СсылкаНаОбъектГуид = ПолучитьСсылкуПоУИД(УИД, БизнесПроцессы);
    		КонецЕсли;
    		
    		Если СсылкаНаОбъектГуид = Неопределено Тогда
    			СсылкаНаОбъектГуид = ПолучитьСсылкуПоУИД(УИД, Задачи);
    		КонецЕсли;
    		
    		Возврат СсылкаНаОбъектГуид;
    		
    	Иначе
    		
    		Для Каждого Менеджер Из ОбъектыМенеджер Цикл
    			СсылкаНаОбъектГуид = Менеджер.ПолучитьСсылку(УникальныйИдентификатор);
    			Если СсылкаНаОбъектГуид.ПолучитьОбъект() <> Неопределено Тогда
    				Возврат СсылкаНаОбъектГуид;
    			КонецЕсли;
    		КонецЦикла;
    		
    		Возврат Неопределено;
    		
    	КонецЕсли;
    	
    КонецФункции
    Ответы: (6)
  7. (5) это капец какой то, умудрится этот поиск еще и рекурсивно сделать

    Ответы: (8)
  8. Можно сделать циклом без рекурсий и без перечисления портянкой видов объектов
    Если бы ты этот вопрос задал на мисте, я бы тебе скинул код как это делал у себя.

    ЗЫ: УИДы - хороший способ передавать ссылки на объекты 1с между пользователями по скайпу.

  9. (6) мсье не любит рекурсию?

    Ответы: (9) (11)
  10. (8) Кто же ее любит? Если на собеседовании в приличную контору на должность программиста решишь задачу через рекурсию, то сразу отказ получишь.

    Ответы: (10)
  11. (9) я люблю. почему отказ?

    Ответы: (15)
  12. (8) люблю, но только там где надо. Здесь же описывается способ, который при утрировании, позволяет вообще все функции в одну запихнуть
    Было

    Функция А(парам) ;
    .... 
    Функция Б(парам) ;
    ... 
    X=А(п) ;
    Y=Б(X) ;
    

    Стало

    Функция ВсеФункции(парам, имяфункции) 
    ... 
    X=ВсеФункции(п, "А") ;
    Y= ВсеФункции(X," Б") ;
    

    И когда из одной функции надо вызвать другую, возникает рекурсия.
    А оно надо тут?

    Ответы: (12)
  13. sda553 люблю, но только там где надо

    Так это ж не рекурсия. Что это за рекурсия в которой максимум 1 переход может быть?

  14. Да, это не рекурсия

  15. по сути, это вариант записи в синтаксисе 1с перегрузки функции

  16. 23.04.2016 17:32:49 отредактировано admin govnoforuma

    (10) Потому что не любят программистов которые любят рекурсию. Считается дурным тоном.

    А при большой вложенности рекурсия более прожорливая до ресурсов чем циклы. Отсюда и пошел негатив к ней.

    Ответы: (16)
  17. admin govnoforuma Считается дурным тоном.

    мусье трындит

    Ответы: (19) (21)
  18. 24.04.2016 07:06:53 отредактировано NewTesla

    Сцуко обезьяна умнее чем вы оказывается

  19. (16) Еще один любитель рекурсии. Поздравляю, ты бы тоже не прошел тест.

    Ответы: (20)
  20. (19) ты у меня тоже тест не пройдёшь

    Ответы: (25)
  21. (16) Не совсем. Рекурсивные вызовы любят кушать стэк. Вышедший из под контроль рекурсивный алгоритм способен подвесить систему.

    Ответы: (22)
  22. ТеньД способен подвесить систему.

    прошли те времена. stack overflow

    ТеньД Вышедший из под контроль рекурсивный алгоритм

    вышедший из-под контроля цикл тоже ничего хорошего не сулит

  23. вот очень мне интересно, как вы будете писать, например, программу обхода бинарного дерева на циклах

    Ответы: (24) (26)
  24. 24.04.2016 23:32:05 отредактировано sda553

    (23) ну, навскидку

    Таб=Новый ТаблицаЗначений;
    Таб.колонки.добавить("УзелДерева");
    Таб.Колонки.Добавить("Обработан");
    НоваяСтрока = Таб. Добавить();
    НоваяСтрока.УзелДерева = корень:
    НоваяСтрока.Обработан=ложь;
    
    пока Истина Цикл
      Для каждого Эл из Таб Цикл
        Если эл.Обработан Тогда
           Таб.Удалить(эл);
         Иначе
            Если ЗначениеЗаполнено(эл.УзелДерева.Левый) Тогда
                нс=Таб.Добавить():
                нс.УзелДерева=эл.УзелДерева.Левый;
                нс.Обработан=Ложь;
            КонецЕсли
            Если ЗначениеЗаполнено(эл.УзелДерева.Правый) Тогда
               нс=Таб.Добавить();
               нс.УзелДерева=эл.УзелДерева.Правый;
               нс.Обработан=Ложь;
            КонецЕсли
            эл.Обработан=Истина;
       КонецЕсли
     КонецЦикла;
     Если таб.Количество()=0 тогда
        превать;
     КонецЕсли;
    КонецЦикла;

    Но согласен, рекурсией приятнее

  25. (20) Точно. Потому что мне это не нужно

  26. (23) В нормальных конторах часто задают задачу обхода бинарного дерева. Но, как мы уже выяснили, ты бы не прошел такую проверку, потому что рекурсиофил.

  27. встретились как-то рекурсиофил и рекурсофоб :)

  28. вышедшая из под контроля рекурсия забила стек, сожгла блок питания и набила морду программисту

    Ответы: (30)
  29. У попа была собака, он её любил...

  30. (28) Потом вернулась в прошлое убить мать программиста чтобы тот не родился.

  31. Прикольно. Если в гугле набить "рекурсия", то он заботливо Вам предложит: "Возможно, вы имели в виду: рекурсия"

  32. "To iterate is human, to recurse, divine"
    — James O. Coplien, Bell Labs

    Примерный перевод: Человеку свойственны итерации, рекурсия - удел богов

    Ответы: (33)
  33. 1Сергей рекурсия - удел богов

    +100500

    Бог решил сотворить человека по образу и подобию Своему ©

  34. -image-

  35. в теории одна и та же сс ылка может быть и в справочнике, и в документе

    Ответы: (36) (37) (38) (40)
  36. (35) капец, ты проснулся

  37. (35) не ссылка, а уид

  38. (35) Вроде, если не создавать объекты с указанными уидами, то не может быть

    Ответы: (39)
  39. 25.04.2016 08:38:35 отредактировано sda553

    (38) в теории все может быть. Что не противоречит принципу Паули.

  40. (35) я больше скажу - может быть два элемента справочников разных типов с одним uuid

    Ответы: (44)
  41. за тип ссылки отвечает rref
    http://its.1c.ru/db/metod8dev#content:1828:hdoc

    Ответы: (42) (45)
  42. (41) насколько я помню одинэсную бд, там три поля описывали ссылку на уровне базы данных. Тип,уид и еще что то было

    Ответы: (48)
  43. по сути, rref не указывает явно, что это ссылка на документ или справочник.
    rref указывает индекс таблицы, а вот уже в описании таблицы указано, что это за метаданные

    так что, с точки зрения rref, что документ и справочник, что справочник.контрагенты или справочник.номенклатура - суть разные сущности

    Ответы: (49)
  44. (40) да

  45. (41) а для поля не составного типа всё равно есть тип ?

    Ответы: (46) (47)
  46. 25.04.2016 09:05:08 отредактировано sda553

    (45) нет, там просто уид

  47. (45) нет. а зачем? там тип однозначно определён в метаданных

  48. (42) есть ещё type, но он не относится к типу ссылки, а относится к типу самого поля

  49. andrewks по сути, rref

    опечатка. tref
    rref - сам uid

  50. Уид формироуется из номер сеанса + счётчик. Т.е. в пределах одного сеанса не может быть создано двух одинаковых уидов. А номера сеансов тоже уникальны

    Ответы: (51)
  51. (50) Это не так.

  52. Вообще, задача странноватая, на самом деле я могу создать объект с произвольным UIDoм.
    Например, могу создать элемент справочника, документ, с УИдом пользователя ИБ.

или зарегистрируйтесь чтобы ответить!