Имя: Пароль:
1C
1С v8
Ошибка чтения значения. Запросы. Отладка.
,
0 kachesov
 
10.10.16
14:22
Добрый день!
Пытаюсь получить значение закупочной цены в УПП.
Написал следующую функцию с запросом:

Функция ПолучитьЗакупочныеЦены(ДатаЦен, Номенклатура) Экспорт
    
    ЗакупочнаяЦена = 0;
    Закупка = "Закупка";
    
    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    Цены.Цена КАК Цена
                          |ИЗ
                          |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
                          |            &Дата,
                          |            ТипЦен = &Закупка
                          |                И Номенклатура = &Номенклатура) КАК Цены");

    Запрос.УстановитьПараметр("Дата", ДатаЦен);
    Запрос.УстановитьПараметр("Закупка", Закупка);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

    Выборка = Запрос.Выполнить().Выбрать();
    ЗакупочнаяЦена = Выборка.Цена;

    Возврат ЗакупочнаяЦена;
    
КонецФункции;

Не работает. Ковыряю отладчиком.
При вычислении строки
Запрос.Выполнить().Выбрать().Цена
в поле "Значение" выдаёт "Ошибка чтения значения"..

Подскажите пожалуйста, куда дальше копать?
Почему может возникать такая ошибка?
1 polosov
 
10.10.16
14:24
Выборка = Запрос.Выполнить().Выбрать();

   Выборка.Следующий();



    ЗакупочнаяЦена = Выборка.Цена;
2 SadrArt
 
10.10.16
14:28
(0) > Запрос.Выполнить().Выбрать().Цена
Шедевр!
3 Ёпрст
 
10.10.16
14:28
(0)

Если Выборка.Следующий() Тогда
    Возврат Выборка.Цена;
КонецЕсли;
Возврат 0;
4 1dvd
 
10.10.16
14:31
сразу видно семёрошника
5 DmitriyDI
 
10.10.16
14:31
(0) потому что следующий возвращает позиционирование на следующей записи выборки, и возвращает Ложь или Истину.
А вот когда запись выбралась т.е. следующий равно истина, тогда в выборке появляются данные.
все это можно посмотреть в СП
6 kachesov
 
10.10.16
14:41
(1) (3) это всё хорошо, но что бы я ни дописывал после строки (см.ниже), её ошибка не исчезнет..
Выборка = Запрос.Выполнить().Выбрать();
(5) СП это что?) не подскажете, что мне нужно поправить?)
7 1dvd
 
10.10.16
14:46
(6) а у тебя в регистре сведений ЦеныНоменклатуры ТипЦен точно строковый?
8 kachesov
 
10.10.16
14:53
(7) в регистре сведений ЦеныНоменклатуры ТипЦен - это измерение с типом СправочникСсылка.ТипыЦенНоменклатуры
9 kachesov
 
10.10.16
14:57
(7) и тут я начал подумывать что недостаточно просто написать Запрос.УстановитьПараметр("Закупка", "Закупка")
=)
10 1dvd
 
10.10.16
14:59
(9) в правильном направлении мыслишь

но и про (3) не забываем
11 kachesov
 
10.10.16
15:01
(10) спасибо большое, пойду дальше ковыряться..
12 kachesov
 
10.10.16
16:44
Функция ПолучитьЦеныДляПФ(Номенклатура) Экспорт
    
    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    Цены.Цена КАК Цена
                          |ИЗ
                          |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
                          |            &Дата,
                          |            ТипЦен = &ТипЦен
                          |                И Номенклатура = &Номенклатура) КАК Цены");

    Запрос.УстановитьПараметр("Дата", Дата);
    Запрос.УстановитьПараметр("ТипЦен", ТипЦенДляПФ);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    Возврат Выборка.Цена;
    
КонецФункции;

Так выглядит конечный вариант.
ТипЦенДляПФ - реквизит с типом СправочникСсылка.ТипыЦенНоменклатуры
Моя ошибка была в этом. Я пытался явно указать название созданного типа цен..
13 Timon1405
 
10.10.16
16:49
(12) также нужно понимать, что если цена вообще не назначена, то ваша функция выдаст ошибку(выборки вообще не будет).
как это обойти вам подсказывают в (3)
14 kachesov
 
10.10.16
16:59
(13) это кусочек. так там три метода. Все они в форме документа.
Первый - кнопка, второй - построчная обработка табличной части, третий - заполнение нужным значением.
У меня в запросе каждый раз лишь одна номенклатурная позиция, мне не нужна проверка (3).

Процедура КоманднаяПанельЗаполнитьЦеныДляПФ(Кнопка)
    
    Если ЗначениеЗаполнено(ТипЦенДляПФ) Тогда
        ЗаполнитьЦеныДляПФ();
    Иначе
        Сообщить("Не заполнен поле ТипЦенДляПФ!");
    КонецЕсли;

КонецПроцедуры

Процедура ЗаполнитьЦеныДляПФ() Экспорт

    Для Каждого Строка Из Товары Цикл
        
        Строка.ЦенаДляПФ = ПолучитьЦеныДляПФ(Строка.Номенклатура);
        
    КонецЦикла;

КонецПроцедуры

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

    Запрос.УстановитьПараметр("Дата", Дата);
    Запрос.УстановитьПараметр("ТипЦен", ТипЦенДляПФ);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    Возврат Выборка.Цена;
    
КонецФункции;
15 notebug
 
10.10.16
17:23
Я бы через массив номенклатуры сделал, нежели запрос в цикле
16 Cumpuciy
 
10.10.16
17:25
Если Выборка.Следующий() тогда
    Возврат Выборка.Цена
иначе
Возврат 0
КонецЕсли