Имя: Пароль:
1C
 
Преобразование значения к типу Булево не может быть выполнено
0 Eka-dobrik
 
17.07.08
08:57
Помогите разобраться.
Есть Фунция в модуле приложения, к которой обращаются отчеты при открытии ("Функция1"). Эта "Функция1" обращается к другой функции, все в том же модуле, которая содержит запрос ("Функция2").
По порядку: Функция1 при открытии какого-либо отчета проверяет (обращяясь при этом к Функции2), есть ли у данного пользователя права для открытия данного отчета (она работает), т.е. если доступа нет - отчет не открывается, и выдает сообщение. А Функция2 как раз таки в своем запросе проверяет из справочника Пользователей, может ли данный пользователь открывать данный отчет. Запрос работает, а в случае, если ЕстьДоступ (реквизит справочника Пользователей, тип булево) = истина, то, при открытии отчета он говорит, что "Преобразование значения к типу Булево не может быть выполнено", ссылаясь на строку
    Возврат(Выборка.ЕстьДоступ);
Таки я не могу понять, почему так оно происходит?
1 ТелепатБот
 
гуру
17.07.08
08:57
2 ЛНТ
 
17.07.08
09:05
почему в скобках?
3 Hitcher
 
17.07.08
09:05
Вероятнее всего в выборке значение NULL, которое невозможно првести к булево.
В отладчик умеешь заглядывать?
4 Defender aka LINN
 
17.07.08
09:05
(0) Скажи, тебе каое именно слово непонятно - "преобразование", "не может", "тип" или "Булево"?
5 vde69
 
модератор
17.07.08
09:09
скорее всего где-то имеешь значение "неопределено" или "null"
6 ЛНТ
 
17.07.08
09:10
(3),(4),(5) а где здесь преобразование типов?
7 Defender aka LINN
 
17.07.08
09:11
(6) Да будет тебе известно, преобразование случается не только принудительно.
И вообще, ты про отладчик когда-нибудь слышал?
8 Eka-dobrik
 
17.07.08
09:12
Вот сам запрос, я все проверяла, только последняя строчка не работает

Функция ЕстьДоступПоВидуОтчета(ВидОтчета)
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
                  |    ПользователиВидыОтчетовДляДоступа.ЕстьДоступ
                  |ИЗ
                  |    Справочник.Пользователи.ВидыОтчетовДляДоступа КАК ПользователиВидыОтчетовДляДоступа
                  |ГДЕ
                  |    ПользователиВидыОтчетовДляДоступа.Ссылка = &Ссылка
                  |    И ПользователиВидыОтчетовДляДоступа.ВидОтчета = &ВидОтчета";
                               
   Запрос.УстановитьПараметр("Ссылка", ПараметрыСеанса.Пользователь);
   Запрос.УстановитьПараметр("ВидОтчета", ВидОтчета);
   Результат = Запрос.Выполнить();
   Если Результат.Пустой() Тогда
       Возврат(Истина);
   КонецЕсли;    
   
   Выборка = Результат.Выбрать();
   Выборка.Следующий();
   Возврат(Выборка.ЕстьДоступ);

Объясните тогда, пожалуйста, почему значение может быть "неопределено" или "null"?
9 Eka-dobrik
 
17.07.08
09:14
Defender aka LINN, слышала и видела :))
10 Eka-dobrik
 
17.07.08
09:31
Уточню еще, что ВидыОтчетовДляДоступа - это табличная часть справочника Пользователи, с реквизитом типа булево ЕстьДоступ. Главное, если его нет - все работает, как надо, а если он есть - не работает нифига...
11 ЛНТ
 
17.07.08
09:33
(7) ну объясни мне, где в этой строчке Возврат(Выборка.ЕстьДоступ); непринудительное преобразование типов
отладчик - да, слышал такое слово
12 ЛНТ
 
17.07.08
09:34
(8)
Если Выборка.Следующий() Тогда
   Возврат Выборка.ЕстьДоступ;
Иначе
   Возврат Ложь;
Конец
13 Eka-dobrik
 
17.07.08
09:35
ЛНТ, ну пусть слышала... подскажите пожалуйста, как "принудить" его преобразовать? ((
14 ЛНТ
 
17.07.08
09:36
(12) хотя нет, бред
15 Eka-dobrik
 
17.07.08
09:37
да, ошибка таже...
16 ЛНТ
 
17.07.08
09:40
у LINNа спроси, он великий учитель(Мастер), всё тебе объяснит
17 Rovan
 
гуру
17.07.08
09:40
(+12) Возврат ?( ЗначениеЗаполнено( Выборка.ЕстьДоступ ),
 Выборка.ЕстьДоступ, Ложь );
18 Eka-dobrik
 
17.07.08
09:40
спасибо
19 ЛНТ
 
17.07.08
09:47
(7) о великий учитель, на кого же ты нас бросил?
20 Eka-dobrik
 
17.07.08
09:53
ЛНТ, а давай с тобой все по порядочку?
Есть процедура (во всех отчетах, сейчас рассмотрим акт сверки):

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
   Если Не(глПередОткрытиемОтчета(ЭтотОбъект)) Тогда
       Отказ = Истина;
       Возврат;
   КонецЕсли;
КонецПроцедуры

она обращается к функции из модуля приложения:

Функция глПередОткрытиемОтчета(прОбъект) Экспорт
   Если Не ЕстьДоступПоВидуОтчета(прОбъект.Метаданные().Имя) Тогда
       Предупреждение("Вам запрещенно пользоваться данным отчетом!", 60);
       Возврат(ложь);
   КонецЕсли;
КонецФункции

а эта обращается к следующей (которая и не работает), код выше...
может ты мне поможешь?
21 ЛНТ
 
17.07.08
09:55
(20) со мной не надо по порядочку
мои уста немеют в присутствии великого учителя
22 vde69
 
модератор
17.07.08
10:03
Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
|ВЫБОР
|    КОГДА ПользователиВидыОтчетовДляДоступа.ЕстьДоступ = Истина ТОГДА Истина
|    ИНАЧЕ Ложь
|КОНЕЦ Как ЕстьДоступ
                  |ИЗ
                  |    Справочник.Пользователи.ВидыОтчетовДляДоступа КАК ПользователиВидыОтчетовДляДоступа
                  |ГДЕ
                  |    ПользователиВидыОтчетовДляДоступа.Ссылка = &Ссылка
                  |    И ПользователиВидыОтчетовДляДоступа.ВидОтчета = &ВидОтчета";
23 Eka-dobrik
 
17.07.08
10:25
vde69, спасибо, но ошибка таже...
24 ЛНТ
 
17.07.08
10:27
(23) ты определись точно на какой строке ошибка
и текст ошибки полностью покажи
25 Eka-dobrik
 
17.07.08
10:32
{Отчет.АктСверки.Форма.Форма(413)}: Преобразование значения к типу Булево не может быть выполнено
   Если Не(глПередОткрытиемОтчета(ЭтотОбъект)) Тогда

Ошибку он мне показывает в строке с обращением к Функции глПередОткрытиемОтчета(прОбъект), а эта функция ссылается на Функцию ЕстьДоступПоВидуОтчета(ВидОтчета)
26 ЛНТ
 
17.07.08
10:35
твои функции не возвращают значения
27 Stepa86
 
17.07.08
10:35
(25) вот в этой строчке надо выделить (глПередОткрытиемОтчета(ЭтотОбъект)) и нажать Shift + F9, и то что получиться показать нам
28 ЛНТ
 
17.07.08
10:35
Если Не ЕстьДоступПоВидуОтчета(прОбъект.Метаданные().Имя) Тогда
       Предупреждение("Вам запрещенно пользоваться данным отчетом!", 60);
       Возврат(ложь);
Иначе
   Возврат Истина;
КонецЕсли;
29 Mitriy
 
17.07.08
10:36
(25) глПередОткрытиемОтчета - это что такое? эта функция вааще есть?
30 ЛНТ
 
17.07.08
10:38
(29) если лень читать топик, не лезь в разговор
31 Eka-dobrik
 
17.07.08
10:38
ЛНТ, спасибо! спасибо!! спасибо!!!
32 vde69
 
17.07.08
10:41
Выборка = Результат.Выбрать();
   Выборка.Следующий();
   Возврат(Выборка.ЕстьДоступ); --- ???????????

надо так:

   Выборка = Результат.Выбрать();
   Выборка.Следующий();
   Результат = Выборка.ЕстьДоступ;
Если Результат = Истина Тогда
Результат = Истина;
иначе
Результат = Ложь;
конецЕсли;

возврат результат;
33 Eka-dobrik
 
17.07.08
10:42
Все работает! Еще раз огромное спасибо!
34 hhhh
 
17.07.08
10:56
(8) скорее всего она ругается на группы справочника "Пользователи". Они ведь тоже попадают в выборку. Попробуй в ГДЕ добавить

И ПользователиВидыОтчетовДляДоступа.ЭтоГруппа = ЛОЖЬ
36 vde69
 
17.07.08
10:58
(33)
Учись правильному стилю програмирования:

всегда делай возвраты в функции только через переменные, и всегда предусматиривй начальную инициализацию этой переменной, и не делый возврата значений в нутри кода

Функция
результат = Истина
// дальше твой код
//
// здесь ставить "Возврат" - нельзя
//
//
//
//
возврат Результат;
конецФункции
37 ЛНТ
 
17.07.08
10:59
(36) бред
38 Gisborn
 
17.07.08
11:00
(34) Не попал

ПользователиВидыОтчетовДляДоступа.Ссылка = &Ссылка
Запрос.УстановитьПараметр("Ссылка", ПараметрыСеанса.Пользователь);
39 Stepa86
 
17.07.08
11:02
(37) ну-ну, ты наверно классный программист
40 КонецЕсли
 
17.07.08
12:49
(32) Цитата:
Если Результат = Истина Тогда
    Результат = Истина;
....
:)
41 vde69
 
17.07.08
12:53
(40) ты не глумись ))) я дело говорю... подумай что будет если в выборке не будет ни одной записи...

Результа - Неопределено

и в моем случе не вызовет ошибки исполнения :)) конечно код выглядет коряво, и надо делать предворительную проверку ... но учитывая уровень САБЖ-а я дал просто рабочий код (я пытался ранее наставить на этот путь)
42 КонецЕсли
 
17.07.08
13:25
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
  |    ПользователиВидыОтчетовДляДоступа.ЕстьДоступ
  |ИЗ
  |    Справочник.Пользователи.ВидыОтчетовДляДоступа КАК ПользователиВидыОтчетовДляДоступа
  |ГДЕ
  |    ПользователиВидыОтчетовДляДоступа.Ссылка = &Ссылка
  |    И ПользователиВидыОтчетовДляДоступа.ВидОтчета = &ВидОтчета";
                                 
Запрос.УстановитьПараметр("Ссылка", ПараметрыСеанса.Пользователь);
Запрос.УстановитьПараметр("ВидОтчета", ВидОтчета);

Выборка = Запрос.Выполнить().Выгрузить();

возврат НЕ (Выборка.Количество()=0 или Не Выборка[0].ЕстьДоступ);

:)))))))
43 vde69
 
17.07.08
14:32
(42) сново могу ошибку подсказать:

что будет если поле "ЕстьДоступ" совсем недавно добавлено в ТЧ справочника "Пользователи", то есть есть строки ТЧ в которых это поле не заполнено????

У тебя будет вот тут ошибка исполнения:
Не Выборка[0].ЕстьДоступ


Кроме того твоя конструкция "возврат НЕ (Выборка.Количество()=0 или Не Выборка[0].ЕстьДоступ)" - тоже выглядит нелепо и не читаебильно...
44 КонецЕсли
 
17.07.08
15:07
(43) по первой части: Если булевое поле совсем недавно добавлено, то оно инициализируется в "ложь" по умолчанию.
по второй части: Это всего лишь антипод вашего лепого и читабельного: Если Результат = Истина Тогда Результат = Истина;  
з.ы. не надо быть таким серьезным :)