Не выполняется запрос

1. user1820578 24.09.22 02:07 Сейчас в теме
Всем доброго времени суток.

Не могу понять где ошибка в коде. В процедуре обработка проведения создается и выполняется запрос, результат которого используется далее, но в отладчике "Ошибка чтения значения".

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

Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. soft_wind 24.09.22 11:26 Сейчас в теме
(1)в приведенном коде, запрос вообще не участвует,
и судя по ТекСтрокаРезерва - вы его в цикле используете? ну-ну!
7. user1820578 24.09.22 12:16 Сейчас в теме
(4) это обрывок кода где по сути сосредоточена вся логика, которая влияет на получение данных из бд. Вот весь код функции:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
 
    ТЗУпакПрод = Новый ТаблицаЗначений;
    ТЗУпакПрод.Колонки.Добавить("ВидДвижения");
    ТЗУпакПрод.Колонки.Добавить("Период");
    ТЗУпакПрод.Колонки.Добавить("ВидПродукции");
    ТЗУпакПрод.Колонки.Добавить("Месторождение");
    ТЗУпакПрод.Колонки.Добавить("Обработка");
    ТЗУпакПрод.Колонки.Добавить("Длина");
    ТЗУпакПрод.Колонки.Добавить("Ширина");
    ТЗУпакПрод.Колонки.Добавить("Толщина");
    ТЗУпакПрод.Колонки.Добавить("Количество"); 
    ТЗУпакПрод.Колонки.Добавить("Заказ");
    
    Движения.СкладРезервации.Записывать = Истина;
    
    Для Каждого ТекСтрокаРезерва Из УпакованнаяПродукция Цикл
        
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
                       |    СкладРезервации.Длина КАК Длина,
                       |    СкладРезервации.Ширина КАК Ширина,
                       |    СкладРезервации.Толщина КАК Толщина,
                       |    СкладРезервации.Обработка КАК Обработка,
                       |    СкладРезервации.ВидПродукции КАК ВидПродукции,
                       |    СкладРезервации.Месторождение КАК Месторождение,
                       |    СкладРезервации.КоличествоОстаток КАК Количество
                       |ИЗ
                       |    РегистрНакопления.СкладРезервации.Остатки(
                       |            &Дата,
                       |                ВидПродукции = &ВидПродукции
                       |                И Месторождение = &Месторождение
                       |                И Обработка = &Обработка
                       |                И Длина = &Длина
                       |                И Ширина = &Ширина
                       |                И Толщина = &Толщина
                       |                 И Заказ = &Заказ) КАК СкладРезервации";
        Запрос.УстановитьПараметр("ВидПродукции", ТекСтрокаРезерва.ВидПродукции);  
        Запрос.УстановитьПараметр("Дата", Новый МоментВремени(Дата, Ссылка));
        Запрос.УстановитьПараметр("Месторождение", ТекСтрокаРезерва.Месторождение);
        Запрос.УстановитьПараметр("Обработка", ТекСтрокаРезерва.Обработка);
        Запрос.УстановитьПараметр("Длина", ТекСтрокаРезерва.Длина);
        Запрос.УстановитьПараметр("Ширина", ТекСтрокаРезерва.Ширина);
        Запрос.УстановитьПараметр("Толщина", ТекСтрокаРезерва.Толщина);
        Запрос.УстановитьПараметр("Заказ", ТекСтрокаРезерва.Заказ);
        
        Результат = Запрос.Выполнить();
        Выборка = Результат.Выбрать();
        
        ПозицияВЗаказе = ТЗУпакПрод.Добавить();
        ПозицияВЗаказе.Период = Дата;
        ПозицияВЗаказе.ВидДвижения = ВидДвиженияНакопления.Приход;
        ПозицияВЗаказе.Месторождение = ТекСтрокаРезерва.Месторождение;
        ПозицияВЗаказе.Обработка = ТекСтрокаРезерва.Обработка;  
        ПозицияВЗаказе.ВидПродукции = ТекСтрокаРезерва.ВидПродукции;
        ПозицияВЗаказе.Длина = ТекСтрокаРезерва.Длина;
        ПозицияВЗаказе.Ширина = ТекСтрокаРезерва.Ширина;
        ПозицияВЗаказе.Толщина = ТекСтрокаРезерва.Толщина;
        ПозицияВЗаказе.Заказ = ТекСтрокаРезерва.Заказ;
        
        Выборка.Следующий();
        
        Если Выборка.Количество() > 1 Тогда
            Сообщить("Обнаружен дубликат");
            Отказ = Истина;
        ИначеЕсли Выборка.Количество() = 0 Тогда
            ПозицияВЗаказе.Количество = ТекСтрокаРезерва.Количество;
        Иначе
            ПозицияВЗаказе.Количество = ТекСтрокаРезерва.Количество + Выборка["Количество"];            
        КонецЕсли;        
        
    КонецЦикла;
    
    Движения.СкладРезервации.Загрузить(ТЗУпакПрод);
    
КонецПроцедуры

Показать


Я писал где ставлю точку остановки и смотрю результат.
9. spacecraft 24.09.22 13:54 Сейчас в теме
(7) удалите (очистить) движения до запроса. Остатки вполне могут учитывать уже существующие движения этого же документа по регистру.
2. Alex_E 2383 24.09.22 07:21 Сейчас в теме
попробуйте оставить только количество:
        Запрос.Текст = "ВЫБРАТЬ
                       |    ЕСТЬNULL(СкладРезервации.КоличествоОстаток, 0) КАК Количество
                       |ИЗ
                       |    РегистрНакопления.СкладРезервации.Остатки(
                       |            &Дата,
                       |                ВидПродукции = &ВидПродукции
                       |                И Месторождение = &Месторождение
                       |                И Обработка = &Обработка
                       |                И Длина = &Длина
                       |                И Ширина = &Ширина
                       |                И Толщина = &Толщина
                       |                 И Заказ = &Заказ) КАК СкладРезервации";
Показать

с проверкой на NULL - остальное и так известно (всё есть в параметрах), и будет понятно, что не так. Да, можно посмореть ДО Выборка.Следующий() посмотрев таблицу значений, что выдаст Запрос.Выполнить.Выгрузить()...
5. user1820578 24.09.22 12:00 Сейчас в теме
(2) попробовал и выдает 0, что странно, так как в консоли с теми же параметрами записи есть (запущен толстый клиент (управляемое приложение)). Пробывал выполнить выражение Запрос.Выполнить.Выгрузить() во время отладки, скрин проложил.

Это не может быть связано с тем откуда выполняется запрос?
Прикрепленные файлы:
8. RustamZz 24.09.22 13:42 Сейчас в теме
(5) Это связано с параметрами запроса. Особо хочу отметить запрос в цикле - это просто вишенка...
3. starjevschik 24.09.22 09:28 Сейчас в теме
Главные принципы поиска любой ошибки:
1) никогда не показывать строку кода, на которой ошибка
2) никогда не приводить полный текст ошибки дословно.
Выполнение обоих принципов гарантирует долгое и плодотворное обсуждение, максимум общения и потраченного времени
Дополнительный пункт
3) никогда не говорить, какая конфигурация.
Это часто улучшает результативность первых двух пунктов
;)
user1831019; Vitaly1C8; +2 Ответить 1
6. user1820578 24.09.22 12:10 Сейчас в теме
(3)
1) написал, что точку остановки ставлю после Выборка.Следующий(), а далее смотрю, что находится в Выборке и там "Ошибка чтения значения".
2) написал же "Ошибка чтения значения", что странно ведь , если консоли выполнить запрос с теми же параметрами, то будет результат (об этом также писал)
3) не знаю как тут поможет это, но напишите пж, как в данном контексте это может помочь, для личного роста. Буду благодарен.
Мне показалось куда важнее информация откуда выполняется запрос и я об этом написал. Скорее всего ещё бы стоило указать какой клиент запущен.
10. Nykos 24.09.22 14:22 Сейчас в теме
Послушайте (4) и подумайте что можно с этим сделать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот