Имя: Пароль:
1C
 
Простой запрос и ошибка в чтении значения
, ,
0 Iater
 
09.06.15
01:07
Всем привет! Помогите, пожалуйста, справится с запросом - в консоли запросов всё работает идеально, а на практике выдает ошибку в чтении значения я хз почему:

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

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

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
         
    ВыборкаДетальныеЗаписи.Следующий();
    
    ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;


Как я понял, проблема в позиционировании выборки на значении? Как же спозиционировать-то иначе?
1 Iater
 
09.06.15
01:10
забыл скачать - в 8.3 работаю
2 Сергиус
 
09.06.15
01:11
(0)Что у тебя в параметре ФИО?
3 Iater
 
09.06.15
01:13
в ФИО  - Иванов

я точку останова поставил - в ФИО точно нормально всё читает
4 France
 
09.06.15
01:14
пока ВыборкаДетальныеЗаписи.Следующий()  цикл
здесь песню поешь
конецЦикла.

и не будет ошибки..
5 Сергиус
 
09.06.15
01:15
(3)Запрос.УстановитьПараметр("ФИО", СокрЛП(ФИО));
6 Iater
 
09.06.15
01:16
у меня одно значение, не нужен цикл. Впрочем, поставил - ноль на массу. Не работает всё равно
7 Iater
 
09.06.15
01:17
в ФИО сейчас забил не Иванов, а цифру "1" - не работает хоть как ты СокрЛП или не сокр
8 Сергиус
 
09.06.15
01:19
(7)Так может нет такого сотрудника с наименованием "1" в базе?
9 Iater
 
09.06.15
01:19
Сергиус, есть... в консоли же всё верно выводит
10 Сергиус
 
09.06.15
01:22
ВыборкаДетальныеЗаписи.Количество() что говорит?
11 Iater
 
09.06.15
01:24
неопределено
12 Сергиус
 
09.06.15
01:29
Сохрани все в обработку, и выложи куда ть.
13 Сергиус
 
09.06.15
01:29
или можно по ТимВьюверу)
14 France
 
09.06.15
01:34
(6) сообщение об ошибке есть?.. если да, то текст сюда.
15 Iater
 
09.06.15
01:36
ошибки нет, просто не дает разницу дат вычислить т.к. дату рождения не может выцепить
16 France
 
09.06.15
01:39
а ФИО как устанавливается?? можно сюда текст??
17 France
 
09.06.15
01:42
в консоли небось параметры автоматически определяешь.. и выбор значения делаешь по кнопке выбора..
18 Iater
 
09.06.15
01:43
в форме документа делаю:

&НаСервере
Функция ДатаРождения (ФИО)
    

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

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

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
    ВыборкаДетальныеЗаписи.Следующий();
    
    ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;
    
    Возврат ДатаРождения;    
    
    
КонецФункции

&НаКлиенте
Процедура ФИОФИОПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.ФИО.ТекущиеДанные;
    ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО);
    
    ДатаДокумента = Объект.Дата;
    
    Возраст = ДатаДокумента - ДатаРождения;
    
    СтрокаТабличнойЧасти.Возраст = Возраст;

КонецПроцедуры
19 France
 
09.06.15
01:46
смотри что тут " ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО);"
20 Iater
 
09.06.15
01:50
не понял что там?
21 Вася Чез
 
09.06.15
01:50
(18) ДатаДокумента и ДатаРождения это дата в секундах или что?
22 Iater
 
09.06.15
01:52
да плевать пока, в секундах наверняка )) у меня запрос не получается - вот что хреново
23 France
 
09.06.15
01:53
(20) тип значения.
24 Iater
 
09.06.15
01:55
France, объясни, пожалуйста, как для тупого )) ФИО передается в запрос - я это вижу, когда ставлю точку останова
25 France
 
09.06.15
01:59
(24) да, ты видишь фио, но не обязательно что это строка. а в запросе ты со строкой сравниваешь. в отладчике тип значения виден..
26 Iater
 
09.06.15
02:09
France, ФИО из формы передается как ссылка (тип СправочникСсылка.Сотрудники)

чета я не соображаю в чем проблема
27 Вася Чез
 
09.06.15
02:11
(26) Проблема в том, что в консоли у тебя ФИО строка, а сейчас у ФИО какой тип? посмотри в отладчике, правой тапкой по ФИО во время отладки "Вычислить выражение".
28 France
 
09.06.15
02:14
СправочникСсылка.Сотрудники (27) (26) ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО.наименование);"
29 France
 
09.06.15
02:14
в консоли он как раз устанавливал правильное значение, а не строку, так как в консоли 1С-на сама тип определяет..
30 Iater
 
09.06.15
02:16
всё заработала, спасибо огромное!!

Дейсвительно из-за типа ФИО. Поставил:
31 Iater
 
09.06.15
02:17
ДатаРождения = ДатаРождения(Строка(СтрокаТабличнойЧасти.ФИО));

и всё заработало
32 France
 
09.06.15
02:24
(31) в другом месте такое преобразование боком вылезти может))
33 Iater
 
09.06.15
02:37
почему7
34 Iater
 
09.06.15
02:37
как по-другому сделать, чтобы всё было правильно и работало?
35 France
 
09.06.15
02:39
(33) у спр сотрудники представление "наименование". если бы был код - твой вариант не сработал бы (хотя, представление код вроде и не часто используется). нужно было явно указать ФИО.Наименование, либо в запросе делать фильтр на ссылку, а не на наименование..
36 Simod
 
09.06.15
06:51
Раньше было "модно" искать через НайтиПоНаименованию(), сейчас это делают через Запросы. Может пора разобраться что такое Ссылка и Объект, и как с ними работать?
37 hhhh
 
09.06.15
07:11
(34) ну, по-нормальному. Выбирать сотрудника из справочника, а не писать вручную фамилию.
38 Вася Чез
 
09.06.15
07:31
(37) может это особенность нетленки ТС — заполнять ТЧ вручную, хз правда зачем
39 azt-yur
 
09.06.15
07:47
У тебя уже ссылка на справочник имеется. Зачем писать целую функцию для получения даты рождения, да еще и с запросом к этому же справочнику?
Не проще ли
ДатаРождения = СтрокаТабличнойЧасти.ФИО.ДатаРождения;
40 katc
 
09.06.15
08:47
Выборка и пустой может быть.

Если ВыборкаДетальныеЗаписи.Следующий()= Истина Тогда
    
    ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;
КонецЕсли;
41 ДенисЧ
 
09.06.15
08:50
"Если ВыборкаДетальныеЗаписи.Следующий()= Истина Тогда "

три года. Без конфискации.
42 katc
 
09.06.15
09:18
что Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Что если  ВыборкаДетальныеЗаписи.Следующий() Цикл
если запрос надо позиционировать на первой записи, как в этом случае, так что я амнистирован.
43 katc
 
09.06.15
09:21
его запрос изначально предназначен вернуть одну запись, городить из него цикл нет ни какого смысла.
Ну а теперь расскажи за что в этом случае меня надо на 3 года?
Чем конструкция Пока Выборка.Следующий() Цикл
отличается от Если Выборка.Следующий() Тогда
44 Krolik Bezobraznik
 
09.06.15
09:29
Чудес не бывает.

Перемудрил с типами значений передаваемых параметров.

Ваш запрос ничего не возвращает. Далее у вас стоит процедура получения значения строки. Строк у вас нет, а вы упорно даете указание чтобы вернуть значение. Тут и проблема. ИМХО.

Используйте конструкцию с циклом. Она более корректная. Если переживаете, что ваш запрос вернет более одной строки, то возвращайте в запросе ПЕРВЫЕ 1. Если результат запроса будет пустым, то ошибок не будет и вы отладчиком увидите, если проблемы будут.