![]() |
![]() |
![]() |
|
Преобразование значения к типу Булево не может быть выполнено | ☑ | ||
---|---|---|---|---|
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) по первой части: Если булевое поле совсем недавно добавлено, то оно инициализируется в "ложь" по умолчанию.
по второй части: Это всего лишь антипод вашего лепого и читабельного: Если Результат = Истина Тогда Результат = Истина; з.ы. не надо быть таким серьезным :) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |