Имя: Пароль:
1C
1С v8
ЗначениеЗаполнено() за и против
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 сек.

Еще такой важный момент пропускают противники ЗначениеЗаполнено, что функция очень лаконична, а полноценную проверку на заполненность мало кто напишет.


//////////////////////////////////////////
ВЫБРАТЬ null КАК Тест
ПОМЕСТИТЬ ТТ
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ НЕОПРЕДЕЛЕНО
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "1"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ К.Ссылка ИЗ Справочник.Контрагенты КАК К
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Д.Ссылка ИЗ Документ.РеализацияТоваровУслуг КАК Д
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка)
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(1, 1, 1)
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2015, 4, 29)
;
ВЫБРАТЬ
    ТТ.Тест
ИЗ
    ТТ КАК ТТ, ТТ КАК Т1, ТТ КАК Т2

//////////////////////////////////////////
Заполнено = 0;
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для Каждого Выборка Из РезультатТаблица Цикл
    Если ЗначениеЗаполнено(Выборка.Тест) Тогда
        Заполнено = Заполнено + 1;
    КонецЕсли;
КонецЦикла;
Длительность = (ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало) / 1000.;
Сообщить("ЗначениеЗаполнено: " + Заполнено + " из " + РезультатТаблица.Количество() + " за " + Длительность + " сек.");

// ЗначениеЗаполнено: 3 650 400 из 3 796 416 за 58,64 сек.

//////////////////////////////////////////
ПустаяДата = '00010101';
ПустойКонтрагент = Справочники.Контрагенты.ПустаяСсылка();
ПустаяРеализация = Документы.РеализацияТоваровУслуг.ПустаяСсылка();
Заполнено = 0;
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для Каждого Выборка Из РезультатТаблица Цикл
    Если Не (Выборка.Тест = Null Или Выборка.Тест = Неопределено
        Или ПустаяСтрока(Выборка.Тест) Или Выборка.Тест = 0 Или Выборка.Тест = ПустаяДата
        Или Выборка.Тест = ПустойКонтрагент Или Выборка.Тест = ПустаяРеализация)
    Тогда
        Заполнено = Заполнено + 1;
    КонецЕсли;
КонецЦикла;
Длительность = (ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало) / 1000.;
Сообщить("Прямые сравнения: " + Заполнено + " из " + РезультатТаблица.Количество() + " за " + Длительность + " сек.");

// Прямые сравнения: 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 байт нулей
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн