|
ЗначениеЗаполнено() за и против | ☑ | ||
---|---|---|---|---|
0
Adecvator
27.04.15
✎
15:28
|
Хочу спросить, кто чем пользуется, что бы проверить заполнено ли значение. Я не заморачиваюсь и использую всегда ЗначениеЗаполнено(), вместо пустой ссылки и тому подобное.
|
|||
1
Fram
27.04.15
✎
15:30
|
А я заморачиваюсь и не всегда использую ЗначениеЗаполнено()
|
|||
2
Defender aka LINN
27.04.15
✎
15:30
|
||||
3
Apokalipsec
27.04.15
✎
15:31
|
А есть ещё интересная штука, ПустаяСтрока()
|
|||
4
Adecvator
27.04.15
✎
15:31
|
(1) а в каких случаях, скажите пожалуйста.
|
|||
5
DrShad
27.04.15
✎
15:31
|
пошел за попкорном - годный вброс на холивар
|
|||
6
Apokalipsec
27.04.15
✎
15:32
|
(4) в случае когда (3) :)
|
|||
7
Garykom
гуру
27.04.15
✎
15:33
|
А почему бы свою "супербыструю" функцию не написать? :)
|
|||
8
Shurjk2
27.04.15
✎
15:33
|
(7) Лавры гения 1с не дают покоя?
|
|||
9
Shurjk2
27.04.15
✎
15:34
|
Считаю что с неявным приведением использовать универсальную функцию правильней.
|
|||
10
Aceforg
27.04.15
✎
15:34
|
Быстрее будет если запросом (с) )
|
|||
11
GROOVY
27.04.15
✎
15:35
|
ЗначениеЗаполнено() Работает как куча длинного Если, если тип такой и значение такое то истина, если такой и такое то истина иначе ложь.
Следовательно, если заранее известен тип значения проверяемого объекта, то использовать функцию не эффективно. |
|||
12
Garykom
гуру
27.04.15
✎
15:35
|
(10) это "если многа" будет быстрее, правильно то юзать платформенные функции объектов
|
|||
13
Garykom
гуру
27.04.15
✎
15:36
|
(12)+ во (11) правильно описал
|
|||
14
GROOVY
27.04.15
✎
15:37
|
А что, только я умею смотреть как в скуль методы платформы транслируются?
|
|||
15
Shurjk2
27.04.15
✎
15:37
|
(11) Откуда сведения о том как оно работает?
|
|||
16
DrShad
27.04.15
✎
15:37
|
(11) зато если в результате пост-обработки заранее известный тип сваливается в НЕопределено - получим критическую ошибку :))))
|
|||
17
Shurjk2
27.04.15
✎
15:38
|
(14) При чем здесь скуль?
|
|||
18
DrShad
27.04.15
✎
15:39
|
(17) через него проще смотреть планы запросов
|
|||
19
GROOVY
27.04.15
✎
15:39
|
(16) Ну это проблема разработчика :)
(17) Не обращай внимания, просто попроси разработчиков платформы ответить тебе как же оно работает. |
|||
20
Shurjk2
27.04.15
✎
15:40
|
(18) При чем здесь запросы?
|
|||
21
Shurjk2
27.04.15
✎
15:40
|
(19) Я с ними не знаком:(
|
|||
22
DrShad
27.04.15
✎
15:40
|
(20) ты не поверишь, но практически любой метод 1С это блин запрос к БД
|
|||
23
GROOVY
27.04.15
✎
15:41
|
(20) Может я тебя шокирую, но функция ЗначениеЗаполнено() сваливается в скулевый запрос.
|
|||
24
DrShad
27.04.15
✎
15:41
|
(23) и далеко не только она :)))))
|
|||
25
Aceforg
27.04.15
✎
15:41
|
(23) Даже на тонком клиенте?
|
|||
26
GROOVY
27.04.15
✎
15:42
|
(25) Смешно, сполз под стол :)
|
|||
27
Shurjk2
27.04.15
✎
15:43
|
(23) А если это проверка заполения реквизита на форме, опять же в описании функции сказано что она и на клиенте работает. Опять же в скулевом запросе нет кейсов.
|
|||
28
Garykom
гуру
27.04.15
✎
15:43
|
(25) особенно на тонком клиенте ))
|
|||
29
GROOVY
27.04.15
✎
15:43
|
(25) Тонкий клиент ни с чем кроме примитивных типов работать не умеет, все остальное происходит на стороне сервера.
|
|||
30
DrShad
27.04.15
✎
15:44
|
(29) Паша, вот тебе и новая тема интерактивного курса
|
|||
31
GROOVY
27.04.15
✎
15:44
|
Так, я вас покину на часа два, жгите!
|
|||
32
GROOVY
27.04.15
✎
15:44
|
(30) У меня уже такой есть.
|
|||
33
Shurjk2
27.04.15
✎
15:45
|
(31) Слив засчитан:)
|
|||
34
DrShad
27.04.15
✎
15:45
|
(32) респект, жаль я их не смотрю :)))
|
|||
35
DrShad
27.04.15
✎
15:46
|
(33) ну нужно человеку по делам, если что тут еще куча народу знакомых с запросами, так что пиши
|
|||
36
ViSo76
27.04.15
✎
15:46
|
(23) От куда дровишки?
|
|||
37
Анцеранана
27.04.15
✎
15:46
|
(0) Принимай меня в свой клуб, большой брат. Но уже сталкивался несколько раз, что у нас какие-то быдлокодеры или кто-то еще создают в общих модулях процедуру ЗначениеНЕЗаполнено. Вот ее я отовсюду выпиливал где встречал)
Раздражает она меня) |
|||
38
DrShad
27.04.15
✎
15:49
|
(37) она тянется еще с 8.0 - там не было типового метода определения пустого значения вот и писали функцию, которую ты и встречаешь
|
|||
39
Kyon8
27.04.15
✎
15:50
|
(23) Нафига там скулевый запрос? Пустую ссылку можно по GUID определить, не говоря уже про строки, числа и т.д.
|
|||
40
Shurjk2
27.04.15
✎
15:50
|
(35) Я не могу понять, как запосы работают на уровне интерфесных объектов и где в запросах есть кейсы.
|
|||
41
ssh2006
27.04.15
✎
15:51
|
(39) + 1
|
|||
42
DrShad
27.04.15
✎
15:52
|
(39) это к Нуралиеву Сергею
|
|||
43
ssh2006
27.04.15
✎
15:53
|
Проверил. 8.3.4.408
Нет запроса к базе |
|||
44
DrShad
27.04.15
✎
15:55
|
(43) ты еще файловую проверь - вообще ни одного не найдешь
|
|||
45
Kyon8
27.04.15
✎
15:57
|
ПустаяСтрока(), Ссылка.Пустая(), ЗначениеЗаполнено() -- доступны в тонком клиенте, про вызов сервера справка не упоминает.
|
|||
46
Garykom
гуру
27.04.15
✎
15:59
|
(45) в каждом клиенте у нутри встроен сервер... даже в тонком только порезанный
|
|||
47
DrShad
27.04.15
✎
16:01
|
(46) ну пусть бы сами дошли - мозг ведь может сломаться от такой инфы :)))))
|
|||
48
ssh2006
27.04.15
✎
16:07
|
В общем, эта функция не требует обращения к серверу, и запросов к БД не выполняется, что в общем-то неудивительно.
|
|||
49
User_Agronom
27.04.15
✎
16:08
|
(46) Мелко-мелко? Порезанный?
|
|||
50
Бубка Гоп
27.04.15
✎
16:12
|
(46) Сервер в каждом из нас.
прям заголовок для эпичной повести |
|||
51
Shurjk2
27.04.15
✎
16:13
|
(50) Главное верить.
|
|||
52
Kookish
27.04.15
✎
16:13
|
(49) Частыми слешами.
А что, самим слабО написать простенькую обработку и выяснить, что быстрее выполняется - ЗначениеЗаполнено() или какая другая? Обязательно мнение других спрашивать? |
|||
53
Shurjk2
27.04.15
✎
16:15
|
(52) Ну во первых результат ее выполнения нельзя будет явно оценить, к тому же если для чистоты эксперименты то писать ее надо для каждого типа, а то вдргу груви прав был и там на самом деле длиннющий кейс, хотя мне сдается там просто выполняется некое приведение к примитивному типу и уже по нему определяется (лично я бы так сделал)
|
|||
54
Бубка Гоп
27.04.15
✎
16:18
|
(50) +
Я сам себе и сервер и клиент, Голый, доволный клиент.. (а-ля Аукцыон) |
|||
55
ViSo76
27.04.15
✎
16:22
|
Вызов базы может быть только в случаях:
ЗначениеЗполненно( СсылкаНаОбъектИлиСправочник.ПолеОбъекта ) или ЗначениеЗполненно( СсылкаНаОбъект.ТабличнаяЧасть ) В общем лишь там, где для проверки предварительно идёт выборка и к функции это не относится. |
|||
56
Lama12
27.04.15
✎
16:27
|
(0)Пустую ссылку в com объекте проверишь?
|
|||
57
ViSo76
27.04.15
✎
16:28
|
(53) Не может быть в этой функции длиннющий кейс не смешите людей. Каждый объект в 1С ( будь то строки или число и т.д. ) имеет функцию которая определяет заполненность. При вызове данной функции просто вызывается метод данного типа объекта и всё.
|
|||
58
Бубка Гоп
27.04.15
✎
16:28
|
(55) так что, получается маленький сервер в любом в клиенте отменяется? я запутался
|
|||
59
Сильф
27.04.15
✎
16:29
|
(0) +1
|
|||
60
Shurjk2
27.04.15
✎
16:30
|
(57) про кейс это не мое. Это знающий человек сказал.
|
|||
61
ViSo76
27.04.15
✎
16:32
|
(60) Почему знающий человек не в кавычках. Неужели 1С разрабатывали не зная принципов ООП...
|
|||
62
DrShad
27.04.15
✎
16:32
|
(57) а у Неопределено какой тип? и какой метод вызывается?
|
|||
63
ssh2006
27.04.15
✎
16:36
|
(62) > а у Неопределено какой тип?
Неопределено |
|||
64
Kyon8
27.04.15
✎
16:37
|
(62) Из СП:
Неопределено (Undefined) Описание: ...Существует одно единственное значение данного типа, задаваемое литералом. Литералы: Неопределено (Undefined) |
|||
65
ViSo76
27.04.15
✎
16:37
|
(62) А ты думаешь что не определено это не объект? Я думаю что это начало дерево объектов всех объектов. Просто чтобы вызвать функцию ЗначениеЗаполнено используется полиморфизм. Изначально все объекты приводятся к базовому типу и вызывается перегруженный метод определения заполненности объекта.
|
|||
66
DrShad
27.04.15
✎
16:37
|
(63) а метод какой?
|
|||
67
ssh2006
27.04.15
✎
16:39
|
(66) уже проверил профайлером ЗначениеЗаполнено ?
|
|||
68
Shurjk2
27.04.15
✎
16:40
|
(61) Потому что это Груви.
|
|||
69
DrShad
27.04.15
✎
16:41
|
(67) а зачем?
|
|||
70
Shurjk2
27.04.15
✎
16:41
|
(57) И еще строки и прочие все таки не объекты.
|
|||
71
ssh2006
27.04.15
✎
16:44
|
(69) А зачем (24) ?
|
|||
72
ViSo76
27.04.15
✎
16:44
|
(70) Это твоё мнение или ты знаешь 100%. Я думаю что это объекты всё таки объекты.
|
|||
73
DrShad
27.04.15
✎
16:46
|
(71) потому что так и есть
|
|||
74
ssh2006
27.04.15
✎
16:49
|
(73) касаемо ЗначениеЗаполнено это не так
|
|||
75
DrShad
27.04.15
✎
16:51
|
(74) ждем Павла тогда
|
|||
76
ViSo76
27.04.15
✎
16:53
|
(75) ты хочешь дождаться чтобы он тебе сказал что функция ЗначениеЗаполнено ни при каких обстоятельствах не лезет в базу? По моему это и без него понятно.
|
|||
77
Shurjk2
27.04.15
✎
16:54
|
(72) Вообще то это я знаю:)
|
|||
78
Serg_1960
27.04.15
✎
16:55
|
(76) :)
|
|||
79
Shurjk2
27.04.15
✎
16:55
|
(76) Он уже сказал обратное, мы с самого начала ветку, сказал и технично слился.
|
|||
80
ssh2006
27.04.15
✎
16:57
|
Можно и без профайлера сделать вывод о том что запроса нет к базе.
Пример: ЗначениеЗаполнено(Справочники.Контрагенты.ПолучитьСсылку()) возвращает истина Т.е. просто проверяется на непустую ссылку |
|||
81
ViSo76
27.04.15
✎
16:57
|
(79) Я думаю что из него нужно изгнать дух невежества, предлагаю применить отделочные материалы.
|
|||
82
DrShad
27.04.15
✎
17:00
|
(80) *рукалицо*
|
|||
83
Kain_wrath
27.04.15
✎
17:00
|
Предлагаю сменить Павлу надпись, с ведущего на несведущего
|
|||
84
ssh2006
27.04.15
✎
17:03
|
(82) ок, жди Павла
|
|||
85
DrShad
27.04.15
✎
17:05
|
(84) обязательно дождусь :)
|
|||
86
Shurjk2
27.04.15
✎
17:06
|
(85) Сдается мне подставил он тебя.
|
|||
87
ViSo76
27.04.15
✎
17:08
|
(86) Сливает Украину :)
|
|||
88
and2
27.04.15
✎
17:10
|
(87) Херсон - не Украина.
Временно окупированная украми территория..... |
|||
89
ViSo76
27.04.15
✎
17:18
|
И мы плавно все преретикаем в ветку "OFF: Геополитика. Все идет по плану? (383)" OFF: Геополитика. Все идет по плану? (383)
|
|||
90
Shurjk2
27.04.15
✎
17:23
|
Все к хохлосрачу сводится в итоге:)
|
|||
91
Serg_1960
27.04.15
✎
17:35
|
Перевожу стрелки :)
Источник: http://downloads.v8.1c.ru/content/Platform/8_2_18_44/1cv8upd.htm "Ускорена работа функции ЗначениеЗаполнено() в том случае, если параметром функции выступает выражение, состоящее из получения свойства какой-либо переменной (как «через точку» так и с помощью операторного способа ([])) любого уровня вложенности" Это, как бы, намекает на то, что анализ переданного параметра происходит "внутри" функции и (11) где-то, как-то местами прав:) Ибо результат можно вернуть только после анализа переданного параметра. Логично? Логично. |
|||
92
GROOVY
27.04.15
✎
17:43
|
Ой нафлудили, а мне и проверить не на чем.
Верьте мне, тормозная это штука. По поводу скуля, я не имел ввиду, что идет обращение к БД, так как проверять мы можем и то что еще в БД нет. |
|||
93
Сильф
27.04.15
✎
17:44
|
(80) ПолучитьСсылку (GetRef)
Синтаксис: ПолучитьСсылку(<УникальныйИдентификатор>) Параметры: Примечание: Если параметр не указан, то будет сформирована новая уникальная ссылка. |
|||
94
ssh2006
27.04.15
✎
17:46
|
(93) Да.
|
|||
95
ssh2006
27.04.15
✎
17:47
|
(92) собственно и в СП к ЗначениеЗаполнено написано:
Примечание: Источники данных не проверяются, значение считается заполненным всегда. |
|||
96
ViSo76
27.04.15
✎
17:55
|
(95) Да детка ( без обид ) ты сделал их
|
|||
97
ViSo76
27.04.15
✎
18:00
|
(91) Ты реально считаешь что интерпретатор доходя до функции ЗначениеЗаполнено( далее всё идёт в функцию в виде текста и там парсится и вычисляется )?
|
|||
98
DrShad
27.04.15
✎
19:34
|
(88) и вам не хворать
|
|||
99
Serg_1960
27.04.15
✎
22:21
|
(97) Я реально считаю что, если в качестве параметра передаётся выражение - то оно рассчитывается, а результат - анализируется. Ваше "далее всё идёт в функцию в виде текста" - это Ваши фантазии и не мои проблемы.
|
|||
100
Лефмихалыч
28.04.15
✎
10:38
|
(57) >Каждый объект в 1С ( будь то строки или число и т.д. ) имеет функцию которая определяет заполненность
не смеши людей |
|||
101
rphosts
28.04.15
✎
11:32
|
(11) т.е. якобы на том-же самом железе ЗначениеЗаполнено() в УПП будет работать много дольше (при большой выборке для накопления статистики) чем ЗначениеЗаполнено() ну пусть в УНФ?
|
|||
102
rphosts
28.04.15
✎
11:33
|
(57) перезагрузка операций свойственна ООП, но 1С не ОПП
|
|||
103
jk3
28.04.15
✎
23:40
|
(0) +1
Ни разу не испытал проблем с производительностью из-за этой функции. Единственное, валится на мутабельных значениях, на всём остальном годна. |
|||
104
jsmith82
28.04.15
✎
23:41
|
предпочитаю проверку на неопределено, пустую ссылку и пустую строку
формалист |
|||
105
ViSo76
28.04.15
✎
23:53
|
(102) Ты считаешь что 1С написана на 1С? Я считал что на С++
|
|||
106
ViSo76
28.04.15
✎
23:57
|
(104) А тут идёт неявное преобразование типов скорее всего
|
|||
107
rphosts
29.04.15
✎
02:00
|
(105)какая разница каком компилятор использовался? А если не С++ а АСМ - 1С становится драйвером?
|
|||
108
ViSo76
29.04.15
✎
09:22
|
(107) Тебе нужно читать и понимать что написано а не писать хрень в посте (102) Я писал о том как возможно реализована функция на C++.
|
|||
109
фобка
29.04.15
✎
09:35
|
что подсказывает интуиция.. Строки лучше проверять на пустаястрока(), даты на дата(1,1,1), числа на = 9, коллекции на количество() = 0. Для ссылок видится более быстрым метод значениезаполнено() вместо .пустая().. Есть еще вариант с проверкой сравнения значения с вновь созданным значением этого типа. Как уж оно там на сиквеле не смотрел и не хочется без нужды
|
|||
110
фобка
29.04.15
✎
09:38
|
А по сути ЗначениеЗаполнено() не работает с мутабельными значениями. Это единственное ограничение. В остальных случаях применимо
|
|||
111
СвинТуз
29.04.15
✎
09:46
|
я думал эта функция для составных типов данных ...
а оно воно че ? Ссылка.Пустая()=ЗначениеЗаполнено() ... |
|||
112
фобка
29.04.15
✎
09:51
|
(111) = Не значениезаполнено(ссылка)
|
|||
113
СвинТуз
29.04.15
✎
10:09
|
(112)
можно вообще круто ... документ.дата='00010101' => НЕ ЗначениеЗаполнено(документ.дата) и т.п. на самом деле это стильно, и не напряжно используешь одну универсальную функцию и думать не нужно |
|||
114
vvp91
29.04.15
✎
10:43
|
Банальный тест на типовой демобазе в платформе 8.3.5.1517 дает такие результаты
ЗначениеЗаполнено: 3 650 400 из 3 796 416 за 58,64 сек. Прямые сравнения: 3 650 400 из 3 796 416 за 145,844 сек. Еще такой важный момент пропускают противники ЗначениеЗаполнено, что функция очень лаконична, а полноценную проверку на заполненность мало кто напишет.
|
|||
115
ЧеловекДуши
29.04.15
✎
10:58
|
(0) С датой не рискую, пишу "ЗначДаты <> Дата(1,1,1)" :)
А в остальном и ЗначениеЗаполнено() за глаза |
|||
116
Ненавижу 1С
гуру
29.04.15
✎
11:00
|
Одна претензия к методу
Почему ЗначениеЗаполнено(Ложь)=Истина? |
|||
117
ViSo76
29.04.15
✎
11:10
|
(116) Из хелпа
Возвращаемое значение: Тип: Булево. Для значений типа Булево всегда возвращается Истина. Скорее всего булево есть булево и этим всё сказано. |
|||
118
СвинТуз
29.04.15
✎
11:16
|
(116)
потому что ЛОЖЬ=0 |
|||
119
Ненавижу 1С
гуру
29.04.15
✎
11:19
|
(117) да читал я это, но по-моему это методолгически криво
для всех типов значение по-умолчанию дает Ложь, а для булева нет (118)и? |
|||
120
СвинТуз
29.04.15
✎
11:22
|
(119)
а 0 это пустое значение Истина = число больше >0 любое (114) в таком контексте конечно |
|||
121
СвинТуз
29.04.15
✎
11:23
|
(116)
хотя я опять путаю ... ) |
|||
122
фобка
29.04.15
✎
11:40
|
(116) дык можно написать свою функцию которая будет давать ложь) ложь это тоже значение. Трехзначная логика, ведь может быть и неопределено/null
|
|||
123
Ненавижу 1С
гуру
29.04.15
✎
11:42
|
(122) не о том речь
|
|||
124
rphosts
29.04.15
✎
11:44
|
(108) к себе примените
|
|||
125
фобка
29.04.15
✎
11:45
|
(118) сам тип булево это истина или ложь, а в БД уже применима трехзначная логика
|
|||
126
фобка
29.04.15
✎
11:46
|
125 к (119)
|
|||
127
Ненавижу 1С
гуру
29.04.15
✎
11:46
|
(125) и чего? к чему ты это написал?
|
|||
128
фобка
29.04.15
✎
11:54
|
(127) к тому что кривизны не вижу
|
|||
129
ViSo76
29.04.15
✎
12:50
|
(124) У тебя в профиле картинка 1 степень за флуд. В твоём случае лучше жевать чем говорить.
|
|||
130
ViSo76
29.04.15
✎
13:07
|
(114) Скорость исполнения скорее всего указывает на то что в функции ЗначениеЗаполненно нет батареи case. Да и само предположение такое опускает разработчиков 1С ниже плинтуса.
|
|||
131
rphosts
29.04.15
✎
13:36
|
(129)во первых - это не твоё дело, а во вторых первого достаточно
|
|||
132
фобка
29.04.15
✎
13:48
|
(114) тест неполный) нужно еще 3 вариант - прямое сравнение данных одного типа (например, дата) с пустым значением для этого типа
|
|||
133
Kyon8
29.04.15
✎
13:55
|
(130) Как вариант - case на С++ на котором написана платформа гораздо быстрее case на 1С.
|
|||
134
olegves
29.04.15
✎
14:10
|
(116) например, для реквизита составного типа(число, булево, ссылка) для значения булева ЛОЖЬ тебе чего возвращать?
|
|||
135
DEVIce
29.04.15
✎
14:12
|
(11) Зато не надо греть голову типизацией. Я всегда юзаю именно ЗначениеЗаполнено(), не думаю что это как-то значительно влияет на производительность.
|
|||
136
DEVIce
29.04.15
✎
14:13
|
(23) Да ладно? Даже при проверке примитивных типов?
|
|||
137
ViSo76
29.04.15
✎
14:18
|
(133) Ещё один (131) при чём тут язык 1С?
|
|||
138
боксер
29.04.15
✎
14:24
|
провел свои тест. испытания. проверка в цикле. результаты:
1 000 000 раз ,если док.Пустая()4сек. 1 000 000 раз ,если значениезаполнено(док)5сек. 1 000 000 раз ,если док.Пустая()4сек. 1 000 000 раз ,если значениезаполнено(док)5сек. ч.т.д. |
|||
139
боксер
29.04.15
✎
14:26
|
это на ноуте.файловая.
проверьте на своем: Процедура КнопкаВыполнитьНажатие(Кнопка) д=текущаядата(); н=1000000; Если Флажок1 Тогда Для инд=1 по н Цикл Если док.Пустая() Тогда КонецЕсли; КонецЦикла; Сообщить(""+н+" раз ,если док.Пустая()"+(текущаядата()-д)+"сек."); ИНАЧЕ Для инд=1 по н Цикл Если значениезаполнено(док) Тогда КонецЕсли; КонецЦикла; Сообщить(""+н+" раз ,если значениезаполнено(док)"+(текущаядата()-д)+"сек."); КонецЕсли; КонецПроцедуры |
|||
140
ViSo76
29.04.15
✎
14:33
|
(138) Я думаю что результат таков по тому что в 1-м случае сразу вызывается метод проверки на заполненности у объекта, а во втором идёт преобразование к базовому объекту и вызов того же самого метода ( механизм полиморфизма ) что требует несколько больших затрат.
|
|||
141
боксер
29.04.15
✎
14:35
|
естественно , универсальный метод более затратен
|
|||
142
ViSo76
29.04.15
✎
14:36
|
У тебя некорректный пример.
|
|||
143
фобка
29.04.15
✎
14:37
|
(138) прикольно, 1 сек разницы на 1млн записей
|
|||
144
ViSo76
29.04.15
✎
14:38
|
Это подтверждает что Архитектор 1С заслуживает своего титула Архитектор
|
|||
145
ViSo76
29.04.15
✎
14:39
|
Сама 1С написана в лучших традициях ООП
|
|||
146
DEVIce
29.04.15
✎
14:39
|
(141) Целая секунда разницы на миллионе итераций - существенная экономия, ага. :)
|
|||
147
ViSo76
29.04.15
✎
14:42
|
Чуваки выше пели по кучу case внутри функции ЗначениеЗаполненно. Если бы так писали такие программы как 1С то уже бы давно бы 1С развалился, так как поддерживать такой быдлокодинг было бы нереально.
|
|||
148
DEVIce
29.04.15
✎
14:51
|
(147) Ага, если там не case, то что? if? Думаешь перегрузка метода быстрее условия работает? Ой я сильно сомневаюсь.
|
|||
149
DEVIce
29.04.15
✎
14:53
|
Да и перегрузка она всяко чтобы вызвать нужную реализацию метода что-то сравнивает, т.е. таки case никуда не делся, просто на другом уровне работает, что в компиленном коде ни на что не влияет.
|
|||
150
DEVIce
29.04.15
✎
14:56
|
Что такое перегрузка метода? Это таблица вызовов, в которой записано соответствие сигнатуры с адресом вызова, т.е. таки чтобы вызвать нужную реализацию метода, надо сделать или case или полный перебор всех строк таблицы до попадания сигнатуры, что по сути тоже самое.
|
|||
151
ViSo76
29.04.15
✎
15:05
|
Никаких case и переборов нет в помине. При компиляции сразу подставляется смещение относительно таблицы берётся от туда адрес и происходит переход.
|
|||
152
ViSo76
29.04.15
✎
15:07
|
Базовый класс наверняка абстрактный был с абстактной функцией определения заполненности и типа которую в обязательном порядке потомки должны перегружать
|
|||
153
rphosts
29.04.15
✎
15:20
|
(137)чушь перестань нести!
|
|||
154
rphosts
29.04.15
✎
15:22
|
(133) причём тут язык? ЗначениеЗаполнено() выполняется не средствами языка 1С а готовым откомпилированным кодом.
|
|||
155
DEVIce
29.04.15
✎
15:25
|
(151) Каким образом берется? Раскрой нам секрет.
|
|||
156
rphosts
29.04.15
✎
15:26
|
Если-б мне нужно было-бы сделать быстрое определение заполненности то это реализовывалось-бы в 3 шага:
1.при старте конфигурации формировался массив пустых значений для каждого типа конфигурации. 2.при вызове сравнения по порядковому номеру типа выбиралось из массива соответствующее ему пустое значение. 3.сравнивался аргумент вызова Значение заполнено() с полученым на 2 шаге. |
|||
157
rphosts
29.04.15
✎
15:26
|
(155) кста, если копнуть возможно пустое значение для каждого нового/изменённого типа создаётся при сохранении конфигурации и хранится в ней
|
|||
158
DEVIce
29.04.15
✎
15:28
|
(152) Ты гонишь. Какое нафиг смещение? Как узнать на какое из сто тыщ мильенов реализаций метода надо сместиться? Идет сравнение сигнатуры метода. Не думаешь же ты что таблица индексируется и юзается хэш? Вычисление хыша займет на несколько порядков больше времени, нежели тупой и примитивный case.
|
|||
159
DEVIce
29.04.15
✎
15:29
|
(157) Ага, особенно если вспомнить, что 1С - это интерпретатор.
|
|||
160
rphosts
29.04.15
✎
15:30
|
(159) это запрещает хранить?
|
|||
161
DEVIce
29.04.15
✎
15:30
|
(152) У тебя же образование программиста? Ты же понимаешь, что все эти перегрузки, виртуальные функции и прочее в итоге превращаются в машинный код, где это все реализуется нашим любимым case'ом?
|
|||
162
DEVIce
29.04.15
✎
15:32
|
(160) Для всех возможных случаев, методанных то может быть много разных? Можно, но тогда это будет работать на уровне интерпретатора 1С и ниже уже не опуститься.
|
|||
163
rphosts
29.04.15
✎
15:37
|
(162)спрошу по другому: структура ссылки не кодирует в нескольких разрядах тип верхнего уровня (Документ, справочник...), а в некотором количестве следующих на ним порядковый номер из конфигурации?
|
|||
164
ViSo76
29.04.15
✎
15:47
|
(158) Так хватит нести пургу объясняю:
Есть объект потомок у него есть таблица перегруженных методов эта таблица создаётся в каждом экземпляре объекта. В этой таблице жёстко прописано: Начало таблицы: Смещение 0 относительно таблицы: 1. функция проверки на пустое значение. занимает к примеру 4 байта Смещение 4 относительно таблицы: 2. функция возврата типа объекта Нужно вызвать метод проверки пустого значения Для этого нужно знать адрес объекта + смещение в объекте на таблице перегруженных методов + смещение на функцию которая известна в каком порядке идёт. Call Object + Table + 1 * 4 ( Но Offset относительно функции вычисляется при компиляции ) |
|||
165
ViSo76
29.04.15
✎
15:51
|
(164) Точнее Call Object + Table + 0 * 4. Никакого case и в помине нет я долго сидел на assebler такая команда есть только в высокоуровневых языках. CASE реализуется командами jp с условиями
|
|||
166
Jokero
29.04.15
✎
15:53
|
(11) Ну вот, моя жизнь теперь никогда не будет прежней(
Сам всегда использую ЗначениеЗаполнено() - думал это фича, оказывается это баг( |
|||
167
olegves
29.04.15
✎
15:57
|
(156) а что твоя функция вернет для реквизита формы составного типа (например, документ.ссылка), где допустимые типы определяются при создании на сервере?
|
|||
168
rphosts
29.04.15
✎
16:03
|
(167) как конкретное значение может быть составного типа?
|
|||
169
ViSo76
29.04.15
✎
16:15
|
(168) Ты проверяешь реквизит формы к примеру который ещё не инициализированн
|
|||
170
rphosts
29.04.15
✎
16:18
|
(169) Если форма уже существует - её реквизиты уже инициализированы, по крайней мере в УФ.
|
|||
171
ViSo76
29.04.15
✎
16:18
|
(170) И составного типа которые ещё не заполнены?
|
|||
172
rphosts
29.04.15
✎
16:20
|
(171) Неопределено?
|
|||
173
ViSo76
29.04.15
✎
16:27
|
(172) Разуется но это не инициализация, а просто признак у объекта что он ещё не инициализировался
|
|||
174
Ненавижу 1С
гуру
29.04.15
✎
16:37
|
(173) стоять. Неопределено это значение вполне определенного типа (извините за каламбул, но это 1С) и этот тип - Неопределено
|
|||
175
rphosts
29.04.15
✎
16:43
|
(174) совершенно верно
|
|||
176
pessok
29.04.15
✎
17:13
|
дайте влезть уже, а то зачитался холивара. На определяемых типах уже тестили? :D
|
|||
177
ViSo76
29.04.15
✎
17:19
|
(174) Скорее всего Неопределено и есть базовый тип в иерархии объектов 1С.
|
|||
178
ДенисЧ
29.04.15
✎
17:20
|
(177) А NULL??
|
|||
179
pessok
29.04.15
✎
17:24
|
(178) *just for loolz* а NULL <> Неопределено?
/me подмигивает Ненавижу 1С |
|||
180
ViSo76
29.04.15
✎
17:25
|
(178) NULL это опеределёный тип базы данных и Неопределено это тоже базовый тип
|
|||
181
ДенисЧ
29.04.15
✎
17:28
|
(179) NULL вообще ничему не равно...
|
|||
182
pessok
29.04.15
✎
17:28
|
расскажите уже про определяемые типы, тестить лениво
|
|||
183
ViSo76
29.04.15
✎
17:29
|
(181) NULL = NULL
|
|||
184
pessok
29.04.15
✎
17:29
|
(183) не хочу тебя расстраивать
|
|||
185
ДенисЧ
29.04.15
✎
17:30
|
(183) неа...
|
|||
186
pessok
29.04.15
✎
17:31
|
(185) однако я проверил... NULL = NULL... Истина, пля... 8.3.5.1443
|
|||
187
pessok
29.04.15
✎
17:34
|
+(186) а так Ложь...
Запрос = Новый Запрос( "ВЫБРАТЬ | ВЫБОР | КОГДА Нуллы.Нулл1 = Нуллы.Нулл2 | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ КАК Результат |ИЗ | (ВЫБРАТЬ | NULL КАК Нулл1, | NULL КАК Нулл2) КАК Нуллы"); Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); Сообщить(Выборка.Результат); |
|||
188
ViSo76
29.04.15
✎
17:45
|
(187) В базе данных null проверяется только функцией и всегда null = null даёт null и разумеется в case ( ВЫБОР ) будет false
|
|||
189
ViSo76
29.04.15
✎
18:51
|
Так же как true = null результат null и т.д. любое сравнение с null даст null в базе данных null это неинициализированое значение
|
|||
190
rphosts
30.04.15
✎
01:56
|
(0) какой наманый вброс получился... прям для пятницы которая неа этой неделе в четверг
|
|||
191
Альбатрос
30.04.15
✎
05:20
|
Ну чо там? жду продолжения, я уже вторую корзину попкорна взял
|
|||
192
rphosts
30.04.15
✎
06:40
|
(191) нужно было пиво брать и диван... сейчас мск проснётся и понеслась!
|
|||
193
Ненавижу 1С
гуру
30.04.15
✎
08:13
|
(181) не ври, в коде 1С (не запросах) верно написали NULL=NULL
отсюда вывод, что модель 1С крайне кривая, поведение в разных местах различно а придумывая неопределено и пустые ссылки для записи в БД считаю порочной практикой от 1С! |
|||
194
pessok
30.04.15
✎
10:13
|
(193) +
|
|||
195
tznimble
30.04.15
✎
12:31
|
1. В 1С (следующей технологии .net) простые типы - объекты (пример http://referencesource.microsoft.com/#mscorlib/system/int32.cs,225942ed7b7a3252)
2. Таблица виртуальных методов (а все перегружаемые - виртуальны) содержит ссылки на выполняющие функции и привязана к экземпляру объекта. Если в пределах одного объекта делается перегрузка по набору параметров или их типу - создаются разные виртуальные функции. То есть, когда в коде мы встречаем выражение типа Object.VFunc адрес, по которому передаётся управление берется из массива виртуальных функций (что делается ОДНОЙ командой процессора на Inetl'ах). 3. Пустые ссылки объектов БД в 1С выглядят как GUID состоящий из нулей, что легко проверяется БЕЗ дополнительного обращения к базе. 4. Тип Неопределено является-таки объектом 5. А вот состояние Empty в 1С не предусмотрено 6. ЗначениеЗаполнено не работает с мутабельными значениями именно из-за того, что само мутабельное значение ссылкой как бы не является (но мы-то знаем...) |
|||
196
Aceforg
30.04.15
✎
12:51
|
(195) Так все таки ЗначениеЗаполнено сваливается в запрос?
Если нет, выполняется каскад "если иначе" или вызывается виртуальная функция? |
|||
197
tznimble
30.04.15
✎
13:22
|
(196) ЗначениеЗаполнено (ValueIsFilled)
Возвращает Истину в случае, если значение отлично от значения данного типа по умолчанию, отличное от значения NULL, отличное от пустой ссылки, отличное от значения Неопределено. Для логических значений осуществляется проверка на значение NULL. Для строк осуществляется проверка на отсутствие не пробельных символов. Параметром является СсылкаНаОбъект (ref). При вызове ЗначениеЗаполнено: 1. Проверяется, что Ссылка не пустая и не Неопределено 2. Вызывается соответствующий метод переданного объекта (вычисляется адрес вызова addr [ref.VTable] + ValueIsFilled_offset и осуществляется переход по нему) Наличие первого пункта объясняет почему Док.Пустая() работает несколько медленнее ;) Отсутствие оно приводит к тому что в случае Док=Неопределено вместо ложь мы получаем ошибку |
|||
198
tznimble
30.04.15
✎
13:27
|
(196) к (197) Док.Пустая() - несколько быстрее (sorry)
|
|||
199
Aceforg
30.04.15
✎
13:46
|
(196) Спасибо. Где можно получить информацию такого плана? На курсах подготовки к Эксперту? Форум этот читать?
|
|||
200
ViSo76
30.04.15
✎
13:53
|
(195) 1. На самом деле простые типы ( Byte, String и т.д. ) к примеру в C# остаются простыми типами. Объекты они только в IDE.
|
|||
201
Goggy
30.04.15
✎
13:54
|
Боже. На мисте и правда скучно становится раз такие темы набирают популярности...
|
|||
202
tznimble
30.04.15
✎
13:58
|
(200) Вам ссылка официальная из MSDN для чего приведена?
Вот после компиляции и оптимизации они станут простыми. И проверка их заполненности станет скорее всего инлайном и для int32 будет выполняться как mov eax,... // jnz <> |
|||
203
ViSo76
30.04.15
✎
14:01
|
(202) Я про после компиляции и сказал
|
|||
204
Ненавижу 1С
гуру
30.04.15
✎
14:02
|
(195) >>А вот состояние Empty в 1С не предусмотрено
Да, необходимо ввести, а то их так мало >>что делается ОДНОЙ командой процессора на Inetl'ах Учитывая, что 1С генерит не машинный код, а интерпретатор |
|||
205
ViSo76
30.04.15
✎
14:06
|
(204) Ты не в теме. Это разговор о том как внутри функционирует 1С. А не про то как 1С исполняет Р-код
|
|||
206
tznimble
30.04.15
✎
14:08
|
(204) Интерпретатор 1С просто переводит готовый байт код в вызовы процедур. Но он сам НЕ вычисляет ссылки и т.д.
Вызов ЗначениеЗаполнено (Объект) выполняется как: 1. По имени переменной определяется область памяти, где хранится значение - реальная ссылка на реальный объект (в смысле машинного кода) 2. Определяется и вызывается реальная процедура ValueIsFilled (Reference) 3. Далее работает исключительно готовый, заранее скомпилированный на Си код |
|||
207
TeMochkiN
30.04.15
✎
14:40
|
(195) >> 3. Пустые ссылки объектов БД в 1С выглядят как GUID состоящий из нулей, что легко проверяется БЕЗ дополнительного обращения к базе.
Объект удалили без контроля ссылочной целостности. Ссылка на него висит в реквизите другого объекта. Что вернет значениезаполнено при проверке данного реквизита? Истина, потому что там гуид ссылки не с нулями? или я чего-то не понял? |
|||
208
TeMochkiN
30.04.15
✎
14:43
|
(207) ой, невнимательно я вдумался, тут же ничего не написано про само значениеЗаполено))
|
|||
209
ViSo76
30.04.15
✎
14:57
|
(207) Функция ЗначениеЗаполнено вернёт истина так как битая ссылка не равна 16 байт нулей
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |