Имя: Пароль:
1C
 
Почему результат запроса возвращается с ошибкой?
0 elsakovm
 
14.10.19
15:16
Добрый день. УНФ 1.6
Подскажите пожалуйста, где я неправильно передаю параметры в запрос? Или почему он возвращается с ошибкой? в результате запроса: ошибка чтения значения

&НаКлиенте
Процедура ЗапасыОбновить(Команда)
    
    Организация = Объект.Организация;
    СтруктурнаяЕдиница = Объект.СтруктурнаяЕдиница;
        
    ТекущаяСтрокаТЧ = Элементы.Запасы.ТекущиеДанные;
    Номенклатура = ТекущаяСтрокаТЧ.Номенклатура;

    ТекущаяСтрокаТЧ.КоличествоТекущийОстаток = ОбновитьКолонкуКоличествоТекущийОстатокНаСервере(Организация, СтруктурнаяЕдиница,Номенклатура);

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

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

    Запрос.УстановитьПараметр("Номенклатура",Номенклатура);
    Запрос.УстановитьПараметр("Организация",Организация);
    Запрос.УстановитьПараметр("СтруктурнаяЕдиница",СтруктурнаяЕдиница);
    
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
        
    Если РезультатЗапроса.Следующий() Тогда
         Возврат  РезультатЗапроса.КоличествоОстаток;
    Иначе      
        Возврат 0;      
    КонецЕсли;
    
КонецФункции
1 GROOVY
 
14.10.19
15:19
Меня вот интересует зачем выбирать поля значения которых передаются параметрами?
2 GROOVY
 
14.10.19
15:20
И почему параметры устанавливаются в ГДЕ, а не в параметрах вирт.таблицы?
3 vicof
 
14.10.19
15:34
Права на регистр есть?
4 elsakovm
 
14.10.19
15:52
(1) есть способ лучше?
(2) спасибо за подсказку, исправил. Но это не помогло
(3) да, пользователь с полными правами
5 silent person
 
14.10.19
15:53
запрос ничего не вернул вот выборка и возвращает ошибку.
6 elsakovm
 
14.10.19
15:54
(1) не сразу понял, сори. Да, поправлю
7 silent person
 
14.10.19
15:55
результат запроса это вот так : РезультатЗапроса = Запрос.Выполнить();
а дальше проверяй  Если РезультатЗапроса.Пустой() Тогда
8 Anton1307
 
14.10.19
15:58
На какой конкретно строчке выскакивает ошибка ?
9 elsakovm
 
14.10.19
16:05
10 dezss
 
14.10.19
16:06
(9) Он спрашивал про строку кода. На какой из них ошибка?
11 elsakovm
 
14.10.19
16:08
(10) а так тишина
12 vicof
 
14.10.19
16:08
Поставил точку останова на
Если РезультатЗапроса.Следующий() Тогда?
13 Anton1307
 
14.10.19
16:16
Разъясни ещё раз - у тебя ошибка выскакивает во время исполнения программы ?
Или ты имеешь ввиду (судя по скриншоту), что в отладчике, когда ты пытаешься посмотреть результат запроса, у тебя выскакивает ошибка ?
14 elsakovm
 
14.10.19
16:22
(13) не во время исполнения программы. Программа ошибок не выдает. Смотрю в отладчик - в результат запроса - там ошибка чтения значения (на скриншоте)
15 ДенисЧ
 
14.10.19
16:24
(14) Если отладку поставить на строчку
    Возврат  РезультатЗапроса.КоличествоОстаток;
Что он показывает?
16 elsakovm
 
14.10.19
16:24
Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    //|    ЗапасыОстатки.Организация КАК Организация,
    //|    ЗапасыОстатки.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
    //|    ЗапасыОстатки.Номенклатура КАК Номенклатура,
    |    ЗапасыОстатки.КоличествоОстаток КАК КоличествоОстаток
    |ИЗ
    |    РегистрНакопления.Запасы.Остатки(,            
    |    Номенклатура = &Номенклатура
    | И Организация = &Организация
    | И СтруктурнаяЕдиница = &СтруктурнаяЕдиница) КАК ЗапасыОстатки";

    Запрос.УстановитьПараметр("Номенклатура",Номенклатура);
    Запрос.УстановитьПараметр("Организация",Организация);
    Запрос.УстановитьПараметр("СтруктурнаяЕдиница",СтруктурнаяЕдиница);
        
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
        
    Если РезультатЗапроса.Следующий() Тогда
         Возврат  РезультатЗапроса.КоличествоОстаток;
    Иначе      
        Возврат 0;      
    КонецЕсли;

Вот так стал возвращать значение 0
Хотя там на самом деле другая цифра
17 hhhh
 
14.10.19
16:26
(14) ну точно смотришь отладчиком после команды Следующий()  ?? Потому что если до этого, то программа должна выдать ошибка чтения значения, значит программа отрабатывает идеально, всё правильно делает.
18 Anton1307
 
14.10.19
16:27
Ну всё понятно. Значит смотри.

Запрос у тебя не возвращает никаких данных. Поэтому, когда ты ставишь точку останова после выполнения запроса (после строки)
>>> РезультатЗапроса = Запрос.Выполнить().Выбрать()
то отладчик показывает "Ошибка чтения значения", так как читать нечего, выборка пустая.

Во время исполнения программного кода ошибка не возникает. Она (теоретически) могла бы возникнуть на строке
>>> Возврат  РезультатЗапроса.КоличествоОстаток

но исполнение программы до этой строки не доходит, так как условие
>>> РезультатЗапроса.Следующий()
всегда возвращает ЛОЖЬ.

Поэтому, если ты уверен, что запрос должен вернуть какие-то данные, а он не возвращает - проверяй, правильные ли значения параметров ты передаёшь
19 elsakovm
 
14.10.19
16:27
(17) да точно
20 hhhh
 
14.10.19
16:30
(19) да, вот здесь

Запрос.УстановитьПараметр("Номенклатура",Номенклатура);
    Запрос.УстановитьПараметр("Организация",Организация);
    Запрос.УстановитьПараметр("СтруктурнаяЕдиница",СтруктурнаяЕдиница);

походу накосячил.

Или на самом деле на текущию секунду остатков нет. Может на какую то дату имеет смысл остатки проверять, а не на текущую?
21 elsakovm
 
14.10.19
16:35
(20) да я тоже думаю что где-то в параметрах. Потому что в консоли результат нужный получаю а тут не могу
22 elsakovm
 
14.10.19
16:36
(20) но в отладчике все данные вроде красиво подставляются, поэтому так сразу и не поймешь
23 elsakovm
 
14.10.19
18:44
Да, все дело было в одном из параметров (а именно в складе)

Сейчас у меня обновляется только текущая строка, не могу сделать перебор по строкам, как правильно будет?


ТекущаяСтрокаТЧ = Элементы.Запасы.ТекущиеДанные;
    Номенклатура = ТекущаяСтрокаТЧ.Номенклатура;
        
    Для Каждого  ТекущаяСтрокаТЧ из Объект.Запасы Цикл        
        ТекущаяСтрокаТЧ.КоличествоТекущийОстаток =  ОбновитьКолонкуКоличествоТекущийОстатокНаСервере(Организация,СтруктурнаяЕдиница,Номенклатура);        
    КонецЦикла ;
24 elsakovm
 
14.10.19
18:51
сам себе отвечаю)
Номенклатура = ТекущаяСтрокаТЧ.Номенклатура; в цикл засунуть надо
25 ГдеСобака Зарыта
 
14.10.19
18:52
Запрос в цикле -100 в карму.
26 craxx
 
14.10.19
19:25
(25) далеко не всегда.
27 Alex87r
 
14.10.19
19:29
(25) это обычное явление
Программист всегда исправляет последнюю ошибку.