Имя: Пароль:
1C
1C 7.7
v7: Не понял код функции "глПредставлениеДокумента"
,
0 zelenprog
 
19.09.12
12:17
Вот первые строки кода:

Функция глПредставлениеДокумента(Документ) Экспорт
   Если (ТипЗначения(Документ)=12)
   и    (ПустоеЗначение(Документ)=0)
   Тогда  

не понятно зачем здесь проверяется "ПустоеЗначение(Документ)=0"?
ведь уже есть проверка на тип, значит это уже точно документ.

Какой смысл выдавать пустую строку для документа даже если он еще не записан?
1 GLazNik
 
19.09.12
12:20
Пустое значение может быть как определенного типа так и неопределенного. Т.ч. условие вполне нормальное.
2 zelenprog
 
19.09.12
12:22
(1) это понятно, но тип уже проверяется. ясно что это документ.
зачем для незаписанного документа выдавать пустую строку?
3 Фокусник
 
19.09.12
12:23
(2) Документ есть, но он не выбран, т.е. пустая ссылка :)
4 Сияющий Асинхраль
 
19.09.12
12:23
Скажем входящий параметр может быть реквизитом чего угодно типа типа документ, , но незаполненным, или значением из ТЗ, определенного типа, тогда, тип определены будет правильно, но самого документа не будет...
5 GLazNik
 
19.09.12
12:25
(2) Возможно вызов процедуры предназначен для другого использования? Например для представления в отчете.
6 dk
 
19.09.12
12:26
а почему именно для незаписанного?

Д = СоздатьОбъект("Документ.ХХХ");
Сообщить(глПредставлениеДокумента(Д));
7 GLazNik
 
19.09.12
12:27
+(5) пустое значение и не записанный документ это разные вещи. В случае не записанного документа необходимо передавать контекст формы документа
8 Сияющий Асинхраль
 
19.09.12
12:31
Значение на пустоты проверяется хотя бы даже для того, чтобы впоследствии всегда корректно сработал код, допустим:
Документ.НомерДокВходящий
из этой же процедуры, если Документ окажется неопределен, то Документ.НомерДокВходящий вернет тебе просто ошибку...
9 Сияющий Асинхраль
 
19.09.12
12:33
+(8) И соответственно, если Документ будет определен, но это не документ, то скорее всего Документ.НомерДокВходящий и Документ.НомерДок опять таки вернут тебе ошибку, потому что такие реквизиты наблюдаются только у документов
10 Aleksey
 
19.09.12
12:34
Для универсальности

Например

Док=СоздатьОбъект("Документ");
глПредставлениеДокумента(Док)

Как раз тот случай, когда ПустоеЗначение(Документ)=1
11 GLazNik
 
19.09.12
12:36
(9) НомерДокВходящий наблюдается не во всех документах. :)
12 Aleksey
 
19.09.12
12:37
Хотя судя по коду оно здесь лишнее
Функция глНазваниеДокументаВЖурнале(Док) Экспорт
                   
   Если ПустоеЗначение(Док)=1 Тогда
       Возврат("");
   КонецЕсли;
   ....
           
КонецФункции

Функция глПредставлениеДокумента(Документ) Экспорт
   
   Если (ТипЗначения(Документ)=12)
   и    (ПустоеЗначение(Документ)=0)
   Тогда
       Возврат глНазваниеДокументаВЖурнале(Документ) + " №"
             + СокрЛП(Документ.НомерДок) + " от "
             + Документ.ДатаДок;
   КонецЕсли;
   Возврат ""
   
КонецФункции    // глПредставлениеДокумента()
13 zelenprog
 
19.09.12
12:37
хм..
14 Сияющий Асинхраль
 
19.09.12
12:38
(11) Именно поэтому в этой процедурке проверяется наличие реквизита НомерДокВходящий у документа, а вот если реквизита этого у документа нет, то используется реквизит НомерДок уже без проверки на наличие его, что правильно именно для документа...
15 Сияющий Асинхраль
 
19.09.12
12:38
(12) Не лишнее, см. (8-9)
16 zelenprog
 
19.09.12
12:39
В следующем коде эта функция выдает пустую строку, хотя документ есть в базе:


   Док = СоздатьОбъект("Документ");
   Док.ВыбратьДокументы(, дПоследняяДата);
   Пока Док.ПолучитьДокумент() = 1 Цикл
           Сообщить("док: " + глПредставлениеДокумента(Док));
17 zelenprog
 
19.09.12
12:40
а если обращаться к реквизитам: Док.НомерДок, то все ОК
18 zelenprog
 
19.09.12
12:41
то есть вполне можно сформировать представление для этого случая, но функция возвращает пустую строку
19 Сияющий Асинхраль
 
19.09.12
12:41
Сообщить("док: " + глПредставлениеДокумента(Док.ТекущийДокумент()));
20 Сияющий Асинхраль
 
19.09.12
12:42
Здесь надо обращаться как в (19)
21 zelenprog
 
19.09.12
12:43
(20) обращение как в (19) - это лишнее обращение к базе,
и если я перебираю все документы для вывода в отчет например - будет заметное замедление
22 zelenprog
 
19.09.12
12:46
этого надо по возможности избегать
23 Сияющий Асинхраль
 
19.09.12
12:46
Хотя (12) прав, я бы написал так:

Если (ТипЗначения(Документ)=12) Тогда
Если    (ПустоеЗначение(Документ)=0)
Тогда
Иначе

КонецЕсли;
КонецЕсли;

(21) Это может быть и замедление, но для 1С 7.7 это как раз правильный вариант, а вот (16) неправильный
24 Светлый Гений
 
19.09.12
12:46
(21)В твоем случае Док - объект, а Док.ТекущийДокумент() - ссылка
25 zelenprog
 
19.09.12
13:04
программно можно определить ссылка это или объект?
26 Cthulhu
 
19.09.12
13:11
(25): ?(ЗначениеВСтрокуВнутр(тДок)<>ЗначениеВСтрокуВнутр(тДок.ТекущийДокумент()),"НЕ ","")+"ССЫЛКА!.."
Программист всегда исправляет последнюю ошибку.