|   |   | 
| 
 | Небольшое изменение в платформе, с весьма неприятными последствиями... | ☑ | ||
|---|---|---|---|---|
| 0
    
        vitolt 10.05.12✎ 02:42 | 
        Здравствуйте форумчане.
  Возможно у меня глюки но: Сегодня на платформе 8.2.15.301 заметил что код: Ссылка = Справочники.Контрагенты.ПолучитьСсылку(GUID); Если ЗначениеЗаполнено(ССылка) ТОгда Метка1 КонецЕслИ; Всегда будет приходить на Метку1 - даже если элемента с таким гуидом в конфе нет. Доподлинно помню что на 8.2.14... Этот вариант отлично отрабатывал отсутствие ссылки. Поправьте если я неправ, а то немало кода придется инспектировать... :( | |||
| 1
    
        Dethmont 10.05.12✎ 03:31 | 
        Так ты  же этим кодом не проверяешь есть ли ссылка, а получаешь ссылку. Естесно она не будет никогда пустой.     | |||
| 2
    
        Гот 10.05.12✎ 03:36 | 
        (0) Быдлокодерство какое, а...     | |||
| 3
    
        Alex375 10.05.12✎ 04:12 | 
        А вот я как помню такой код ни когда не возвращал пустых ссылок в случае ненайденного объекта.     | |||
| 4
    
        Defender aka LINN 10.05.12✎ 04:26 | 
        (0) "Доподлинно помню что на 8.2.14... Этот вариант отлично отрабатывал отсутствие ссылки." = врешь и не краснеешь. Никакого "отсутствия ссылки" тут не будет, если, конечно, ГУИД из нулей не передавать     | |||
| 5
    
        gavrikprog 10.05.12✎ 06:09 | 
        всегда делал проверку, на пустую ссылку.
  Проверка на ЗначениеЗаполнено делал только для реквизита | |||
| 6
    
        gavrikprog 10.05.12✎ 06:10 | 
        (5) всегда делал проверку, на пустую ссылку. для кода в (0)     | |||
| 7
    
        gavrikprog 10.05.12✎ 06:12 | 
        ах, да (5) - почти вообще не использую =)     | |||
| 8
    
        kosts 10.05.12✎ 06:14 | 
        (0) Еще в более ранних версиях такое же поведение наблюдал.     | |||
| 9
    
        mikeA 10.05.12✎ 06:16 | 
        (6) вот хз как оно раньше было, сейчас оно точно заполнено не пустая, там сидит "объект не найден"
  так что остаётся Лев(Ссылка, 18) = "<Объект не найден>" или Ссылка.ПолучитьОбъект() = Неопределено второй по идее должен работать дольше, первыможет есть какие-то более кошерные способы? | |||
| 10
    
        mikeA 10.05.12✎ 06:17 | 
        (9)+ oops...
  второй по идее должен работать дольше, первый как-то коряво выглядит | |||
| 11
    
        Aleksey 10.05.12✎ 06:19 | 
        (10) конечно коряво. Будет работать пока 1С не поменяет представление таких вот битых ссылок. В теории запросом кошернее     | |||
| 12
    
        Alex375 10.05.12✎ 06:19 | 
        Такое поведение вполне логично: надо тебе создать утерянный объект по УИДу - пожалуйста. А так же может быть у пользователя НЕТ ПРАВ на просмотр указанного объекта, а вы хотите пустую ссылку получить - не верно это!     | |||
| 13
    
        Живой Ископаемый 10.05.12✎ 06:20 | 
        2(9) facepalm:
  =Справочники.Контрагенты.ПустаяССылка() | |||
| 14
    
        mikeA 10.05.12✎ 06:32 | 
        (11) запросом конечно да, но по представлению вроде бы в базу не лезет?
  (13) во, точно! ты знал... ))) | |||
| 15
    
        mikeA 10.05.12✎ 06:38 | 
        (13) хотя, как их отличать от существующих объектов? у существующих ведь тоже будет не равно ПустаяСсылка.     | |||
| 16
    
        Cube 10.05.12✎ 06:52 | 
        (15) Можно привязаться к ВерсияДанных (Если Ссылка.ВерсияДанных = "" Тогда), но не знаю, на сколько это надежно. Сам делаю через ПолучитьОбъект().     | |||
| 17
    
        Живой Ископаемый 10.05.12✎ 06:56 | 
        2(15) да, у существующих будет не равно ПустаяССылка(). а как надо?     | |||
| 18
    
        Рэйв 10.05.12✎ 07:03 | 
        (15)....Ссылка.Пустая()     | |||
| 19
    
        Defender aka LINN 10.05.12✎ 08:00 | 
        (16) А вам какая-то религия мешает сделать запрос к базе? Точнее, не так. Вам какая-то религия мешает сделать запрос, который будет получать ОДНО поле, и заставляет делать запрос, который получает ВСЕ поля объекта?     | |||
| 20
    
        Cube 10.05.12✎ 08:06 | 
        (19) Просто как-то следую правилу "запрос в цикле - зло" =)) Не, я всё прекрасно понимаю, что ПолучитьОбъект() это тоже чтение объекта из базы со всеми его полями, но в данном случае не знаю, что предпочтительнее: запрос в цикле или ПолучитьОбъект() в цикле...     | |||
| 21
    
        Fragster гуру 10.05.12✎ 08:08 | 
        я понял, это небольшое изменение платформы с 7.7, потому как в 8.0 уже было как в (0)     | |||
| 22
    
        mikeA 10.05.12✎ 08:11 | 
        (19) запрос к базе это обращение к базе. это конечно лучше чем чтение всех полей и таблиц объекта, но может быть есть способ определения битой ссылки без обращения к базе?     | |||
| 23
    
        Песец 10.05.12✎ 08:17 | 
        (0) ртфм:
  ЗначениеЗаполнено (ValueIsFilled) Синтаксис: ЗначениеЗаполнено(<Значение>) Параметры: <Значение> (обязательный) Тип: Произвольный. Значение для сравнения. Возвращаемое значение: Тип: Булево. Для значений типа Булево всегда возвращается Истина. Для значений типа Строка возвращается Истина, если в строке есть не пробельные символы. Для массивов и коллекций возвращается Истина, если в них есть хотя бы 1 элемент. Описание: Функция проверяет, отличается ли переданное значение от значения по умолчанию того же типа. Не работает с мутабельными значениями. При передаче мутабельного значения функция вызывает исключение. | |||
| 24
    
        Нуф-Нуф 10.05.12✎ 08:19 | 
        Быдлокодинг детектед     | |||
| 25
    
        Песец 10.05.12✎ 08:29 | 
        (23+) Проверять что ссылкой созданной по по уиду попали в объект надо либо через Ссылка.ПолучитьОбъект() = неопределено, либо через Найти(Строка(Ссылка),"Объект не найден")>0, но тут надо учитывать в частности какой язык установлен, например получить заведомо битую ссылку и прочитать что в ней написано.     | |||
| 26
    
        Живой Ископаемый 10.05.12✎ 08:48 | 
        (22)что такое "битая ссылка", и как можно что-то получить не обращаясь к базе? например в тонком клиенте?     | |||
| 27
    
        Живой Ископаемый 10.05.12✎ 08:49 | 
        2(20) имелось в виду, получить в запросе ДО того как.. Короче сразу делать запрос таким, который не возвращает пустых ссылок.     | |||
| 28
    
        Defender aka LINN 10.05.12✎ 08:59 | 
        (22) У тебя есть ссылка на запись в таблице. Тебе надо узнать, есть ли такая запись в таблице, или нет. Ты хоть как изворачивайся, но в базу заглянуть придется.     | |||
| 29
    
        vmv 10.05.12✎ 08:59 | 
        согласен, чистый г-код в (0), но какое живое обсуждение вызвало у поклонников этого чудо-стиля)     | |||
| 30
    
        vmv 10.05.12✎ 09:02 | 
        да и использование "Ссылка" в качестве имени переменной аццкий показатель низкой квалификации     | |||
| 31
    
        Cube 10.05.12✎ 09:11 | 
        (27) Если ДО того как, то тогда придется два раза один и тот же цикл обходить - в первый раз для получения массива ссылок и сверки с базой-приемником, а второй раз для выгрузки. Это может не очень эффективно работать... Проще в одном цикле всё проверить и всё сделать. Но тогда мы возвращаемся к (20).
  Как пример, выгрузка документа "Отражение зарплаты в регламентированном учете" из ЗиУП в УПП, там субконто в проводках - мама не горюй... | |||
| 32
    
        Живой Ископаемый 10.05.12✎ 09:17 | 
        2(31) э... стоп, в каком месте нарисовалась база-приемник?     | |||
| 33
    
        Cube 10.05.12✎ 09:26 | 
        (32) Ну а в каком случае ещё нужно искать объекты по ГУИДу, если не при обмене? :)     | |||
| 34
    
        Defender aka LINN 10.05.12✎ 09:30 | 
        (31) Разрешаю предварительно собрать все ссылки в таблицу значений и сделать ОДИН запрос для проверки их всех.     | |||
| 35
    
        Sammo 10.05.12✎ 09:34 | 
        (31) На множественных поисках запрос работает быстрее, чем ПолучитьОбъект и проверить его на Неопределено.     | |||
| 36
    
        Cube 10.05.12✎ 09:35 | 
        (34) Недостающие объекты создать, а также создать все сопутствующие объекты к этим недостающим объектам? Стоит ли овчинка выделки?...     | |||
| 37
    
        Cube 10.05.12✎ 09:39 | 
        (35) У меня каждая ссылка ищется только один раз, после этого кэшируется. При повторном поиске используются данные кэша.     | |||
| 38
    
        mikeA 10.05.12✎ 09:49 | 
        (28) Сообщить(Ссылка) вроде не обращается к базе. т.е. можно второй раз в базу не лезть, когда уже есть ссылка на объект. но придётся проверять по представлению, что не есть гуд в общем случае, хотя как правило срабатывает     | |||
| 39
    
        Serg_1960 10.05.12✎ 09:59 | 
        Ммм... просто так, имхо: По заверению методистов, в платформе "оптимизировано" :( понятия не имею об чём это они :) обращение к номеру, дате и представлению ссылки документа (не вызывает повторного обращения к базе).     | |||
| 40
    
        Defender aka LINN 10.05.12✎ 10:10 | 
        (36) Ты где у меня слово "создать" увидел?
  (38) Ага, а представление она из воздуха берет, да? | |||
| 41
    
        Cube 10.05.12✎ 10:13 | 
        (40) "Ты где у меня слово "создать" увидел?" - ну так, если ты заделался телепатом и, не разобравшись, выдаешь мне разрешения, то какие ко мне претензии?     | |||
| 42
    
        vitolt 10.05.12✎ 10:16 | 
        1. Код набран исключительно для примера, так что к стилю можно было и не придираться
  2. Если кто не к курсе - в запросе по GUID ничего из базы не вытащишь (или я совсем отстал от жизни) 3. Я не утверждаю с точностью до 100% что всегда так было - но в одной из версий точно. Т.к. есть некоторое количество кода которое работало. 4. Когда этот вариант работал - он очевидно был быстрее чем Ссылка.ПолучитьОбъект(). | |||
| 43
    
        Живой Ископаемый 10.05.12✎ 10:21 | 
        2(41) ты первый начал телепатить, серьезно.. :)     | |||
| 44
    
        vmv 10.05.12✎ 10:26 | 
        (42) да, ПолучитьОбъект() - это не рационально, особенное если объекты "массивны", прасинг и проверка строкового значениея гуид - тоже лажа.
  Сейчас в конфах на УФ принят такой стандард решения вашей задачи на запросе - это позволяет юзать РЛС - это быстрее чем через объект - это логичнее, наконец // Получает ссылку на объект - справочник по GUID // Функция НайтиЭлементСправочникаПоGUIDИСформироватьПредставление(GUID, ИмяСправочника, НайденоЗначение = Ложь) Если Строка(GUID) = XMLСтрока(Справочники[ИмяСправочника].ПустаяСсылка()) Тогда Возврат " "; КонецЕсли; Ссылка = Справочники[ИмяСправочника].ПолучитьСсылку(GUID); НайденоЗначение = ОбъектСуществует(Ссылка, "Справочник", ИмяСправочника); Возврат Строка(Ссылка); КонецФункции Функция ОбъектСуществует(Ссылка, КлассификаторСтрока, ИмяОМ) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ " + КлассификаторСтрока + "." + ИмяОМ + " ГДЕ Ссылка=&Ссылка"; Запрос.Параметры.Вставить("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли; КонецФункции | |||
| 45
    
        Живой Ископаемый 10.05.12✎ 10:30 | ||||
| 46
    
        Живой Ископаемый 10.05.12✎ 10:30 | 
        То есть (42), простите.     | |||
| 47
    
        Живой Ископаемый 10.05.12✎ 10:33 | 
        XMLЗначение(ИзXMLТипа("CatalogRef.Контрагенты",""),"5e925e48-ddca-11de-a6d8-002264f28848")=Справочники.Контрагенты.ПустаяССылка()
  В твоем случае: Ссылка = Справочники.Контрагенты.ПолучитьСсылку(GUID); Если Ссылка<>Справочники.Контрагенты.ПустаяССылка() ТОгда Метка1 КонецЕслИ; | |||
| 48
    
        vitolt 10.05.12✎ 10:34 | 
        Я собственно не собирался холивар разводить, просто хотел предупредить - мало ли кто попал на такие же грабли, чтобы имели ввиду.
  (44)(45) Спасибо. | |||
| 49
    
        mikeA 10.05.12✎ 13:00 | 
        (40) проверял в управляемой форме. когда есть ссылка в реквизите формы, Сообщить(Ссылка), вызванная из модуля формы на клиенте, счётчик обращений к серверу не увеличивает. видимо представление уже хранится в объекте Ссылка, я имею ввиду внутренний объект C++.
  ну или я чего-то не понимаю в их клиент-серверном взаимодействии | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |