|
Все виды пустоты переменной | ☑ | ||
---|---|---|---|---|
0
AlexYa
10.04.12
✎
09:46
|
Есть в типовых функция ПолучитьНомерНаПечать с параметром Документ.
При этом на входе может быть как документ-объект, документ-ссылка, так и строка выборки или структура. Каким образом можно определить, что параметр пустой? Проверки Документ = Неопределено ИЛИ Документ = Null это само собой. Но если Документ.Пустая()? Или Документ.Ссылка.Пустая()? Для строки выборки или структуры Пустая() вернет ошибку. Можно, конечно, определять все типы и выбирать из них, как в Книга знаний: v8: Как узнать, что ссылка на справочник, документ или на объект другого корневого типа конфигурации? Но нам тип нужен постольку поскольку, т.е. есть у него метод Пустая() или нет. Как сделать проверку на пустоту переменной произвольного типа наиболее просто? |
|||
1
YF
10.04.12
✎
09:46
|
ЗначениеЗаполнено()?
|
|||
2
Maxus43
10.04.12
✎
09:48
|
(0) реально (1) не знал? во всех конфах на каждом шагу как бы оно есть
|
|||
3
НЕА123
10.04.12
✎
10:15
|
(2)
документ-объект ? |
|||
4
DrShad
10.04.12
✎
10:16
|
(1) +100500
|
|||
5
DrShad
10.04.12
✎
10:17
|
(3) и что с "документ-объект" не так?
|
|||
6
Maxus43
10.04.12
✎
10:24
|
(3) это универсальная штука, хоть что туда засунуть можно
|
|||
7
Ненавижу 1С
гуру
10.04.12
✎
10:25
|
гы, гыгы, гыгыгы
|
|||
8
Ненавижу 1С
гуру
10.04.12
✎
10:32
|
Надо диссертацию написать "Об объективных видах видах пустоты с точки зрения субъективного взгляда 1С-ника"
|
|||
9
НЕА123
10.04.12
✎
10:34
|
(6)
неа. с мутабельными не робит. |
|||
10
Maxus43
10.04.12
✎
10:36
|
(9) да, точно) забыл. но в случае (0) прокатит всё, а мутабельные уже по другому проверять
|
|||
11
mikecool
10.04.12
✎
10:36
|
(8) а вот и доктор наук ))
|
|||
12
НЕА123
10.04.12
✎
10:40
|
(10)
документ-объект - это из (0). |
|||
13
Maxus43
10.04.12
✎
10:42
|
ЗначениеЗаполнено через попытку, в исключении проверять сслыку. короче универсально можно написать, обрабатывая типы тока мутабельных значений, а не все объекты по типу проверять
|
|||
14
Ненавижу 1С
гуру
10.04.12
✎
10:43
|
(13) охохо
|
|||
15
Ненавижу 1С
гуру
10.04.12
✎
10:44
|
(11) да куда мне, я ж не доказываю, как круто в 1С придумали кучу сущностей пустоты
|
|||
16
Maxus43
10.04.12
✎
10:46
|
(14) ваши варианты? без стенаний по поводу "в 1с всё сделали криво")
|
|||
17
ShoGUN
10.04.12
✎
10:48
|
(13) Можно малость по-другому извратиться, хотя передача мутабельных типов в виде параметров - уже извращение.
|
|||
18
ShoGUN
10.04.12
✎
10:49
|
Хотелось бы конечно заслушать начальника транспортного цеха из (14).
|
|||
19
Maxus43
10.04.12
✎
10:50
|
(17) это да, лучше конечно изначально избавится от передачи такого, что в типовых и сделано
|
|||
20
Ненавижу 1С
гуру
10.04.12
✎
10:56
|
(16)(18) в базе данных достаточно всегда хранить только NULL
|
|||
21
ShoGUN
10.04.12
✎
10:59
|
(20) Ну в общем да, но мы тут решаем вопросы на грешной Земле :)
|
|||
22
Maxus43
10.04.12
✎
10:59
|
(20) > (16) без стенаний по поводу...
Ну что щас делать? Имеем то что имеем. Сабж о другом |
|||
23
acsent
10.04.12
✎
11:06
|
0 - это пустое значение?
|
|||
24
ShoGUN
10.04.12
✎
11:10
|
(23) Ага :) И Ложь - тоже.
|
|||
25
Ненавижу 1С
гуру
10.04.12
✎
11:14
|
(22) да ничего не делать, смириться, как сделал это я
//или писать свою платформу? |
|||
26
AlexYa
10.04.12
✎
11:19
|
(1) Ха-Ха-ха. Очень умно. Первое, что попробовал. И на чем обломался.
Кто хочет обломаться - пусть попробует. Учитывая, где исполняется эта функция. |
|||
27
ShoGUN
10.04.12
✎
11:21
|
(26) В (0) ничего не сказано про то, где функция исполняется.
|
|||
28
Serg_1960
10.04.12
✎
11:23
|
(0) Сорри, AlexYa но в типовой конфе разработчики себе голову долго не ломали.
В типовой функции проверка параметра "Документ" на "Неопределено" и далее - "Номер = СокрЛП(Документ.Номер);" И всё! А ты почему задумался об прочих проблемах? :) |
|||
29
AlexYa
10.04.12
✎
11:23
|
(23)(24) ИМХО: Пустота - это когда значение нельзя использовать по его прямому предназначению. О - число. Ложь - булево.
Поэтому ЗначениеЗаполнено() не катит и в этом случае. Аналог Пустая() для простых типов - Неопределено или Null. |
|||
30
Ненавижу 1С
гуру
10.04.12
✎
11:24
|
(29) альтернативщик
|
|||
31
AlexYa
10.04.12
✎
11:26
|
(28) потому как дорабатываю свою. И там попробовал типовой функционал использовать более широко. Например, в обработках, печатных формах и отчетах.
Частным образом я этот вопрос решил: Будет Документ.Пустая(), значит номер = 0 Но сам вопрос заинтересовал. Как задел на будущее |
|||
32
ShoGUN
10.04.12
✎
11:29
|
(29) Философский вопрос, в реальности не имеющий значения. Приведи пример, в котором числовой 0 и Null в числовом поле интерпретировались бы по-разному.
|
|||
33
Fish
10.04.12
✎
11:34
|
(26) Читаем СП:
ЗначениеЗаполнено (ValueIsFilled) Синтаксис: ЗначениеЗаполнено(<Значение>) ...... Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение. Чего тебе не хватает? |
|||
34
AlexYa
10.04.12
✎
11:35
|
Кстати, было бы логично иметь функцию, определяющую категорию объекта по типу:
1. простой 2. ссылочный 3. Объект 4. структура 5. пустой (32) Null - отсутствие какого либо значения, ссылки, объекта, структуры. Ничего 0 - значение числового типа. То, что в отчетах отсутствие числа и 0 показывают одинаково связано с бережным отношением к нервам конечного пользователя |
|||
35
AlexYa
10.04.12
✎
11:38
|
(33) попробуй выполнить это на сервере в функции с параметром типа ссылка
|
|||
36
ShoGUN
10.04.12
✎
11:39
|
(34) Спасибо кэп. Я не про отличие Null и 0 спросил, а про практический смысл Null в числовом поле.
|
|||
37
ShoGUN
10.04.12
✎
11:40
|
(35) Без проблем. Скорей всего ты про параметр типа объект.
|
|||
38
Maxus43
10.04.12
✎
11:40
|
(35) пробовал не раз, и что? с объектом не прокатит, со ссылкой то что не так?
|
|||
39
AlexYa
10.04.12
✎
11:40
|
(36) речь шла изначально о параметре неопределенного типа. В нем может быть и ссылка, и 0, и Null
|
|||
40
AlexYa
10.04.12
✎
11:46
|
(38) Проверка мутабельных значений на заполненность не поддерживается
|
|||
41
DimVad
10.04.12
✎
11:47
|
"логично иметь функцию, определяющую категорию объекта по типу: " - если мне не изменяет склероз, ЗначениеНеЗаполнено( так и работала
|
|||
42
Maxus43
10.04.12
✎
11:47
|
(40) это объект а не ссылка
|
|||
43
ShoGUN
10.04.12
✎
11:48
|
(40) Ссылка не является мутабельным значением, если что...
|
|||
44
ShoGUN
10.04.12
✎
11:49
|
+(43) Кстати, проблемы должны возникнуть ещё при передаче объекта на сервер, а не при проверке на заполненность.
|
|||
45
AlexYa
10.04.12
✎
11:51
|
(41) На сервере в функции при проверке параметра типа "ВыборкаИзРезультатаЗапроса" функцией ЗначениеЗаполнено() выдается ошибка:
"Проверка мутабельных значений на заполненность не поддерживается" Возникает именно в точке проверки. Проверено отладчиком. Кстати, ошибка возникает далеко не всегда. Зависит от способа подключения пользователя. |
|||
46
DimVad
10.04.12
✎
11:54
|
Немного не понял. Задача стоит так : иметь функцию, к-рая анализирует полученный параметр по типу
1. простой 2. ссылочный 3. Объект 4. структура 5. пустой и выдает Истина / Ложь в зависимости от типа (если чило - то ноль, если конкретный ссылочный тип - на равенство типа Справочник.Материалы.ПустаяСсылка и т.д.). Такая функция - оптимальное, что можно придумать, ведь так ? Ну, так она есть - это старая функция ЗначениеНеЗаполнено(). Ее надо просто вытащить из какой-нибудь старой конфы и получить счастье... |
|||
47
ShoGUN
10.04.12
✎
11:54
|
(45) Так ты всё-таки ссылку или выборку из результата запроса проверяешь? И опять-таки, зачем передавать выборку?
|
|||
48
AlexYa
10.04.12
✎
11:54
|
(45) Извиняюсь, тип действительно Объект
|
|||
49
ShoGUN
10.04.12
✎
12:00
|
(48) С этого начинать надо. Не передавайте объекты в качестве параметров. Объект на сервере всегда может быть получен из ссылки, а в тонком клиенте просто не нужен.
Можно использовать (13), можно слегка наоборот, что-то типа: Попытка Возврат ЗначениеЗаполнено(ХЗ.Ссылка); Исключение//Если это не объект и не ссылка. Возврат ЗначениеЗаполнено(ХЗ); КонецПопытки; Есть одна проблема, конечно - если в функцию передаётся вообще не пойми что, но это не пойми что содержит свойство с именем "Ссылка" - функция может работать непредсказуемо. |
|||
50
AlexYa
10.04.12
✎
12:01
|
(47) на входе может быть что угодно.
на выходе - реальный номер (реквизит ссылки/объекта, элемент структуры, значение колонки выборки и т.п.) или 0, если значение параметра не имеет такого реквизита. Как минимум, при неопределенных значениях параметра, пустых значениях ссылки. Возможно, наиболее рационально сделать функцию, подобную типовой ЕстьРеквизитДокумента. Но там в качестве параметров передаются Метаданные. Но у простых и пустых типов метаданных нет. |
|||
51
AlexYa
10.04.12
✎
12:03
|
(49) вариант с Попыткой - это лом. Но он будет срабатывать слишком часто, т.к. в половине случаев это может быть структура/строка выборки
|
|||
52
Serg_1960
10.04.12
✎
12:04
|
(крик души) Ааа.. не ломай ты голову ни себе, ни нам. В типой функции "окружи" Попыткой строку типового алгоритма. И успокойся с миром :)
Попытка Номер = СокрЛП(Документ.Номер); Исключение Номер = 0; КонецПопытки; |
|||
53
ShoGUN
10.04.12
✎
12:07
|
(50) Ну и передавай в качестве метаданных Неопределено для простых и пустых типов, а внутри функции анализируй.
|
|||
54
ShoGUN
10.04.12
✎
12:09
|
+(53) Хуже то, что нужна универсальная фиговина для проверки вообще всего чего угодно. Вот структура с каким-то ключом и значением Неопределено для этого ключа - она пустая или нет? :)
|
|||
55
Serg_1960
10.04.12
✎
12:10
|
(51) (вариант) "... т.к. в половине случаев это может быть структура/строка выборки" - вот там и проверяй:
Если ЧтоФигнюПолучилВместоРезультатаЯ Тогда Номер = 0; Иначе Номер = ПолучитьНомерНаПечать(... |
|||
56
AlexYa
10.04.12
✎
12:14
|
(55) идея с оболочкой хороша.
Т.е можно вместо параметра Документ передавать ПолучитьНомерНаПечать (ПроверитьРеквизиты(Документ, СписокРеквизитов)) Если в Документ есть реквизиты/колонки с именами из строки СписокРеквизитов, то возвращаем Документ, если же нет, то Неопределено. |
|||
57
Ненавижу 1С
гуру
10.04.12
✎
13:21
|
единственное на что согласен, это когда в объектной модели (не в БД!) ищется элемент по коллекции и если нет, то может выдавать Неопределено (null,nil)
Но это Неопредлено - аналог пустого указателяв C++/Паскаль не более того и к БД не имеет отношение |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |