Вход | Регистрация
 
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
КонецЕсли

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