|
Небольшое изменение в платформе, с весьма неприятными последствиями... | ☑ | ||
---|---|---|---|---|
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++.
ну или я чего-то не понимаю в их клиент-серверном взаимодействии |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |