Имя: Пароль:
1C
1С v8
Все виды пустоты переменной
, ,
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++/Паскаль
не более того и к БД не имеет отношение