Имя: Пароль:
1C
1C 7.7
v7: Почему сбоит метод ПустоеЗначение()
0 sidalexsandr
 
14.01.13
15:37
У меня обработка: проверяет Заполнен ли реквизит шапки у документов.
Название документа и реквизита вводится в форме обработке.
Вот текст обработки:
Процедура Сформировать()
   
   Д = СоздатьОбъект("Документ."+СокрЛП(НазваниеДокумента));
                         
   РеквизитЗаполнен = "Нет";
   КоличествоДокументов = 0;
   Д.ВыбратьДокументы(НачДата, КонДата);
   Пока Д.ПолучитьДокумент() = 1 Цикл        
       Если ПустоеЗначение(Д.ПолучитьАтрибут(СокрЛП(ВыбРеквизитШапки))) = 0 Тогда            
           РеквизитЗаполнен = "Да";
           Сообщить("Дата "+Д.ДатаДок+" Номер "+Д.НомерДок);
           КоличествоДокументов = КоличествоДокументов + 1;    
       КонецЕсли;    
       Состояние("Шурстим документы. Откинтесь на спинку кресла.");
   КонецЦикла;
   
   Если РеквизитЗаполнен = "Нет" Тогда
       Сообщить("Ни у оного документа не заполнен реквизит "+СокрЛП(ВыбРеквизитШапки)+".");  
   Иначе
       Сообщить("Есть "+КоличествоДокументов+" документов у которых заполнен реквизит "+СокрЛП(ВыбРеквизитШапки)+".");    
   КонецЕсли;
КонецПроцедуры

Процедура ПриОткрытии()
   
   НачДата = '01.01.80';
   КонДата = ТекущаяДата();  
                               
КонецПроцедуры
1 sidalexsandr
 
14.01.13
15:38
Вопрос: Почемуу одного документа пустой реквизит, а метод ПустоеЗначение() выдает, что реквизит заполнен?
2 sidalexsandr
 
14.01.13
15:39
Извизите за опечатку модераторы. Смените пожалуйста название темы на Почему сбоит метод ПустоеЗначение()
3 1Сергей
 
14.01.13
15:39
реквизит какого типа/вида?
4 sidalexsandr
 
14.01.13
15:41
Тип Справочники.Склады
5 viktor_vv
 
14.01.13
15:42
(4) Может элемент справочника с пустым наименованием ?
6 1Сергей
 
14.01.13
15:43
(5) +1
посмотри Д.ПолучитьАтрибут(СокрЛП(ВыбРеквизитШапки)).Код
7 viktor_vv
 
14.01.13
15:44
Для проверки выведи

ЗначениеРеквизита = Д.ПолучитьАтрибут(СокрЛП(ВыбРеквизитШапки)) ;
       Если ПустоеЗначение(ЗначениеРеквизита) = 0 Тогда            
           РеквизитЗаполнен = "Да";
           Сообщить("Дата "+Д.ДатаДок+" Номер "+Д.НомерДок + "  "+ ЗначениеРеквизита.Код + "  "+ЗначениеРеквизита.Наименование);
           КоличествоДокументов = КоличествоДокументов + 1;    
       КонецЕсли;
9 Ёпрст
 
гуру
14.01.13
15:46
Проверять последний документ в выборке на наличие заполненности реквизита таким способом.. это п..ц
10 1Сергей
 
14.01.13
15:47
(9) он не последний проверяет, а ищет нет ли пустых
11 Ёпрст
 
гуру
14.01.13
15:48
(10) да похрен, всё равно п..ц
:))
12 sidalexsandr
 
14.01.13
15:49
(7) Вот сообщить и пишет на документ где не заполен реквизит
13 Ёпрст
 
гуру
14.01.13
15:50
Ладно, на вопрос (1) ответ таков-

если реквизит ВыбРеквизитШапки агрегатного типа - то там битая ссылка, а вот ПустоеЗначение вернет 0, ибо это
<Объект не найден>
14 1Сергей
 
14.01.13
15:50
(12) ну, а код какой говорит?
15 sidalexsandr
 
14.01.13
15:51
(12) Не понял вопроса? Если про ошибки то ничего при исполнении нет.
16 sidalexsandr
 
14.01.13
15:51
(13)А как узнать, что у документа тогда битая ссылка?
17 Ёпрст
 
гуру
14.01.13
15:52
(16) проверить на Выбран()
18 Ёпрст
 
гуру
14.01.13
15:52
+ ПустоеЗначение одновременно
19 Ёпрст
 
гуру
14.01.13
15:53
Если .Выбран()=0 и ПустоеЗначение() = 0  - битая ссылка..
т.е какой то му удалил объект непосредственно, без контроля ссылочной целостности
20 КонецЦикла
 
14.01.13
15:54
Если (ПустоеЗначение(Док.Докум) = 0) и (Док.Докум.Выбран() = 0)  Тогда
   Сообщить("В документе " + Док + " есть битая ссылка");
КонецЕсли;
21 viktor_vv
 
14.01.13
15:54
А если просто открыть этот документи и посмотреть че там у него в этом реквизите.
На битой написал бы про "Объект не найден".
22 sidalexsandr
 
14.01.13
15:55
Сделал так:
Если Д.ПолучитьАтрибут(СокрЛП(ВыбРеквизитШапки) <> ПолучитьПустоеЗначение("Справочник.Склад") Тогда

Ничего не изменилось.
23 sidalexsandr
 
14.01.13
15:55
(21) Спасибо. Нет такого.
24 viktor_vv
 
14.01.13
15:57
(23) А если нажать кнопку выбора, где курсор стоит ?
25 КонецЦикла
 
14.01.13
15:57
(23) Нужно писать "откиньтесь", может в этом трабла?
Можно еще добавить "двигатели прогреты, начинаем отсчет"
26 viktor_vv
 
14.01.13
15:57
(22) Тебе ж про метод Выбран() писали.
27 sidalexsandr
 
14.01.13
15:57
(20) Спасибо. Попробую.
28 Надсмотрщик
 
14.01.13
15:58
(0) А мозх включить не предлагать?
29 prog0101
 
14.01.13
16:02
нужно приводить к строке и делать сокрлп
30 oslokot
 
14.01.13
16:07
(0) Зачем городить огород, когда все уже есть
глВсеРеквизитыДокументаЗаполнены(Конт,СписокРеквизитов)

(в конфах ТиС и КА)
31 sidalexsandr
 
14.01.13
16:12
(20) Если верит синтаксис-помощнику, то ты проверяеш два раза одно и тоже, вот синтаксис помощник:
Функция определяет, является ли пустым переданное в параметре значение. Возвращает число: 1- если значение пустое и 0 - если нет. При этом применяется следующее правило:
.........
- значения следующих типов: ''справочник''... проверяются как в методах Выбран  для соответствующего типа объекта.;
32 Ёпрст
 
гуру
14.01.13
16:14
(31) пустоезначение проверяет само значение,не лезя при этом на сервер, выбран - тащит объект с ИБ с сервера на клиент, если его нет - возвращает 0
33 sidalexsandr
 
14.01.13
16:53
Вопрос ещё актуален.
34 Ёпрст
 
гуру
14.01.13
16:57
дык ты (20) то проверил ?
35 sidalexsandr
 
14.01.13
17:13
(34) Проверил не помогло.
36 sidalexsandr
 
14.01.13
17:13
Спасибки всем. Предполагаю что поможет только тестирование в конфигураторе.
37 Ёпрст
 
гуру
14.01.13
17:14
т.е битых ссылок нема ? Не верю.
38 Ёпрст
 
гуру
14.01.13
17:15
если база дбф, то достаточно реиндекс
39 Torquader
 
15.01.13
01:07
Я бы сначала спросил бы тип реквизита, то есть

Сообщить("Тип:"+Метаданные.Документ(НазваниеДокумента).РеквизитШапки(СокрЛП(ВыбРеквизитШапки)).Тип);
Сообщить("Вид:"+Метаданные.Документ(НазваниеДокумента).РеквизитШапки(СокрЛП(ВыбРеквизитШапки)).Вид);

просто, если получится, что в реквизите строка, то если в ней неразрывный пробел, то будет пустое поле, которое, на самом деле, не пустое.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший