Имя: Пароль:
1C
 
Проверка существования реквизита
0 Маленький Вопросик
 
03.09.14
10:02
Народ, подскажите как проверить существование реквизита у документа. Не его заполнение, а именно существование
1 DCKiller
 
03.09.14
10:05
Если Документ.Метаданные().Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
Сообщить("Нету");
КонецЕсли;
2 дедушка Вах
 
03.09.14
10:09
(1) ага, а если метаданных нету
(0) через Попытка - наверняка
3 13_Mult
 
03.09.14
10:12
(2) т.е. как нету ? ))
4 дедушка Вах
 
03.09.14
10:16
(3) ну ты че с будуна внешней обработкой в нету конфу не тыкал? :)
в пустой тоже запускается
5 hhhh
 
03.09.14
10:18
(4) всё равно есть метаданные у документа, хоть обработкой тыкай, хоть чем.
6 Рэйв
 
03.09.14
10:18
(4)В не той конфе пошлет лесом через ошибку и это будет правильно и соразмерно:-)
7 13_Mult
 
03.09.14
10:20
(4) ну если с фанатизмом, то версию еще конфы при открытии проверить да? ))
8 Рэйв
 
03.09.14
10:21
(5)
Наверное он имеет в виду вариант если в обработке стоит:

Документ=Документы.КакойтоВид.ПустаясСылка();

в случае если нет такого вида:-)
9 Ненавижу 1С
 
гуру
03.09.14
10:23
(2) Попытка - ЗЛО
10 vde69
 
03.09.14
10:25
(1) у Задачи поищи реквизит "Адресат"....
или у справочника "Код"

в 8.1 было все просто, сейчас развели по разным коллекциям, по этому стало куда более проблемно...
11 hhhh
 
03.09.14
10:28
можно через задницу

Структура = Новый Структура(ИмяРеквизита);
ЗаполнитьЗначенияСвойств(Структура, Документ);
Если Структура[ИмяРеквизита] = Неопределено Тогда
Сообщить("Нету");
КонецЕсли;
12 Ненавижу 1С
 
гуру
03.09.14
10:30
(10) >>у справочника "Код"
а зачем его искать?
13 дедушка Вах
 
03.09.14
10:32
(9) если проверять наличие каждого объекта метаданных в процессе обращения - супер мега универсальная обработка получится. года через два тестирования
14 vde69
 
03.09.14
10:33
(12) а его может и не быть.... да у справочника может не быть кода :)

проверь на длине кода = 0
15 Ненавижу 1С
 
гуру
03.09.14
10:34
(14) ну и проверяй длину кода отдельно
да несколько не однообразно, ну что делать
16 vde69
 
03.09.14
10:34
(12) или например общие реквизиты у документов, угадай где они :)
17 Ненавижу 1С
 
гуру
03.09.14
10:34
(13) ты просто не знаешь какое зло эта "попытка"
18 1Сергей
 
03.09.14
10:34
(12) его может не быть
19 vde69
 
03.09.14
10:36
(15) ты не понял, его физически в таблице нет, колонки нет! и запрос вылетет с ошибкой :)
20 bolobol
 
03.09.14
10:52
(17) И какое ж зло это - попытка? Не поясните?
21 Маленький Вопросик
 
03.09.14
10:57
Я кстати тоже подумал над попыткой. -почему мегазло???
22 PLUT
 
03.09.14
10:59
23 PLUT
 
03.09.14
11:01
вот еще про попытки исключение и остановка по ошибке в отладчике

http://forum.infostart.ru/forum26/topic56814/
24 Ненавижу 1С
 
гуру
03.09.14
11:17
(20)(21) вы теряете ошибку, все проходит "хорошо", но результат может быть плачевен
25 дедушка Вах
 
03.09.14
11:20
(22) (24) ну это смотря где пытаться проверять
в приначалеработысистемы или в приоткрытии, если внешняя обработка - ничего не будет
26 дедушка Вах
 
03.09.14
11:25
+ флажок один раз зарядил - и работай себе не хочу
а про метаданные в 150-ти местах вставлять - это каждый тормоз может
27 Godofsin
 
03.09.14
11:28
(24) Например?
28 DCKiller
 
03.09.14
11:46
(10) Речь про документ вообще-то, а не про задачу и не про справочник
29 DCKiller
 
03.09.14
11:48
(8) Вообще-то в таких случаях сначала делается проверка на существование вида документа, а уже потом его реквизитов.
30 DCKiller
 
03.09.14
11:50
+(10) адресата у задачи и код у справочника надо искать через СтандартныеРеквизиты
31 mzelensky
 
03.09.14
11:54
(30) У стандартных реквизитов НЕТ метода "НАЙТИ" - только перебором, либо через "заполнитьЗначенияСвойств", либо через попытку
32 mzelensky
 
03.09.14
11:57
(0) Вот тебе универсальная процедура. Кинь в общий модуль и пользуйся:

Функция ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Экспорт

    Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
        //<--Maximus
        Для Каждого Реквизит Из МетаданныеДокумента.СтандартныеРеквизиты цикл
            Если Врег(Реквизит.Имя) = Врег(ИмяРеквизита) Тогда
                Возврат Истина;    
            КонецЕсли;
        КонецЦикла;
        //Maximus-->
        
        Возврат Ложь;
    Иначе
        Возврат Истина;
    КонецЕсли;

КонецФункции // ЕстьРеквизитДокумента()
33 bolobol
 
03.09.14
11:57
(24) Конструкцией, позволяющей отработать ошибку, вы умудряетесь её потерять?? Вспоминается анекдот: а где шары металлические? - один сломал, второй про..терял.
34 Адский плющ
 
03.09.14
11:59
Конечно, это сугубое ИМХО. Я считаю при хорошей архитектуре решения не должна вставать необходимость выяснения наличия реквизитов.
35 Ненавижу 1С
 
гуру
03.09.14
12:03
(34) имело место быть на больших кусках, вложенных в Попытка
36 bolobol
 
03.09.14
12:03
(22) (23) - осилил, но так и не понял, зачем к серьёзному вопросу ссылки на ламерские топики?
37 Адский плющ
 
03.09.14
12:10
(24) +1
Попытка хороша, когда в блоке "Исключение" вызывается исключение.
Ну кроме пользовательского уровня, когда в исключении просто выводится более вежливое сообщение.