Имя: Пароль:
1C
1С v8
Небольшое изменение в платформе, с весьма неприятными последствиями...
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++.
ну или я чего-то не понимаю в их клиент-серверном взаимодействии
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший