Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Ошибка чтения значения. Запросы. Отладка.

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует