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

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 2355 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 Ответить
6. user1820578 24.09.22 12:10 Сейчас в теме
(3)
1) написал, что точку остановки ставлю после Выборка.Следующий(), а далее смотрю, что находится в Выборке и там "Ошибка чтения значения".
2) написал же "Ошибка чтения значения", что странно ведь , если консоли выполнить запрос с теми же параметрами, то будет результат (об этом также писал)
3) не знаю как тут поможет это, но напишите пж, как в данном контексте это может помочь, для личного роста. Буду благодарен.
Мне показалось куда важнее информация откуда выполняется запрос и я об этом написал. Скорее всего ещё бы стоило указать какой клиент запущен.
10. Nykos 24.09.22 14:22 Сейчас в теме
Послушайте (4) и подумайте что можно с этим сделать
Оставьте свое сообщение

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