Всем доброго времени суток.
Не могу понять где ошибка в коде. В процедуре обработка проведения создается и выполняется запрос, результат которого используется далее, но в отладчике "Ошибка чтения значения".
Точку остановки ставлю после Следующий();, запрос выполнил в консоли и результат есть, параметры передаются верно.
Не могу понять где ошибка в коде. В процедуре обработка проведения создается и выполняется запрос, результат которого используется далее, но в отладчике "Ошибка чтения значения".
Точку остановки ставлю после Следующий();, запрос выполнил в консоли и результат есть, параметры передаются верно.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| СкладРезервации.Длина КАК Длина,
| СкладРезервации.Ширина КАК Ширина,
| СкладРезервации.Толщина КАК Толщина,
| СкладРезервации.Обработка КАК Обработка,
| СкладРезервации.ВидПродукции КАК ВидПродукции,
| СкладРезервации.Месторождение КАК Месторождение,
| СкладРезервации.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.СкладРезервации.Остатки(
| &Дата,
| ВидПродукции = &ВидПродукции
| И Месторождение = &Месторождение
| И Обработка = &Обработка
| И Длина = &Длина
| И Ширина = &Ширина
| И Толщина = &Толщина
| И Заказ = &Заказ) КАК СкладРезервации";
Запрос.УстановитьПараметр("ВидПродукции", ТекСтрокаРезерва.ВидПродукции);
Запрос.УстановитьПараметр("Дата", Новый МоментВремени(Дата, Ссылка));
Запрос.УстановитьПараметр("Месторождение", ТекСтрокаРезерва.Месторождение);
Запрос.УстановитьПараметр("Обработка", ТекСтрокаРезерва.Обработка);
Запрос.УстановитьПараметр("Длина", ТекСтрокаРезерва.Длина);
Запрос.УстановитьПараметр("Ширина", ТекСтрокаРезерва.Ширина);
Запрос.УстановитьПараметр("Толщина", ТекСтрокаРезерва.Толщина);
Запрос.УстановитьПараметр("Заказ", ТекСтрокаРезерва.Заказ);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
ПозицияВЗаказе = ТЗУпакПрод.Добавить();
ПозицияВЗаказе.Период = Дата;
ПозицияВЗаказе.ВидДвижения = ВидДвиженияНакопления.Приход;
ПозицияВЗаказе.Месторождение = ТекСтрокаРезерва.Месторождение;
ПозицияВЗаказе.Обработка = ТекСтрокаРезерва.Обработка;
ПозицияВЗаказе.ВидПродукции = ТекСтрокаРезерва.ВидПродукции;
ПозицияВЗаказе.Длина = ТекСтрокаРезерва.Длина;
ПозицияВЗаказе.Ширина = ТекСтрокаРезерва.Ширина;
ПозицияВЗаказе.Толщина = ТекСтрокаРезерва.Толщина;
ПозицияВЗаказе.Заказ = ТекСтрокаРезерва.Заказ;
Выборка.Следующий();
ПоказатьПо теме из базы знаний
- Неоптимальная работа запроса
- Зачем запросу план и кто его выполняет?
- Как автоматически заполнить обработкой табличную часть документа "Ввод начальных остатков" (Тип операции = "Расчеты с партнерами"). 1С: ERP
- Не спеша, эффективно и правильно – путь разработки. Часть 3. Практика
- MS SQL Server: изучаем планы запросов
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(4) это обрывок кода где по сути сосредоточена вся логика, которая влияет на получение данных из бд. Вот весь код функции:
Я писал где ставлю точку остановки и смотрю результат.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ТЗУпакПрод = Новый ТаблицаЗначений;
ТЗУпакПрод.Колонки.Добавить("ВидДвижения");
ТЗУпакПрод.Колонки.Добавить("Период");
ТЗУпакПрод.Колонки.Добавить("ВидПродукции");
ТЗУпакПрод.Колонки.Добавить("Месторождение");
ТЗУпакПрод.Колонки.Добавить("Обработка");
ТЗУпакПрод.Колонки.Добавить("Длина");
ТЗУпакПрод.Колонки.Добавить("Ширина");
ТЗУпакПрод.Колонки.Добавить("Толщина");
ТЗУпакПрод.Колонки.Добавить("Количество");
ТЗУпакПрод.Колонки.Добавить("Заказ");
Движения.СкладРезервации.Записывать = Истина;
Для Каждого ТекСтрокаРезерва Из УпакованнаяПродукция Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| СкладРезервации.Длина КАК Длина,
| СкладРезервации.Ширина КАК Ширина,
| СкладРезервации.Толщина КАК Толщина,
| СкладРезервации.Обработка КАК Обработка,
| СкладРезервации.ВидПродукции КАК ВидПродукции,
| СкладРезервации.Месторождение КАК Месторождение,
| СкладРезервации.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.СкладРезервации.Остатки(
| &Дата,
| ВидПродукции = &ВидПродукции
| И Месторождение = &Месторождение
| И Обработка = &Обработка
| И Длина = &Длина
| И Ширина = &Ширина
| И Толщина = &Толщина
| И Заказ = &Заказ) КАК СкладРезервации";
Запрос.УстановитьПараметр("ВидПродукции", ТекСтрокаРезерва.ВидПродукции);
Запрос.УстановитьПараметр("Дата", Новый МоментВремени(Дата, Ссылка));
Запрос.УстановитьПараметр("Месторождение", ТекСтрокаРезерва.Месторождение);
Запрос.УстановитьПараметр("Обработка", ТекСтрокаРезерва.Обработка);
Запрос.УстановитьПараметр("Длина", ТекСтрокаРезерва.Длина);
Запрос.УстановитьПараметр("Ширина", ТекСтрокаРезерва.Ширина);
Запрос.УстановитьПараметр("Толщина", ТекСтрокаРезерва.Толщина);
Запрос.УстановитьПараметр("Заказ", ТекСтрокаРезерва.Заказ);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
ПозицияВЗаказе = ТЗУпакПрод.Добавить();
ПозицияВЗаказе.Период = Дата;
ПозицияВЗаказе.ВидДвижения = ВидДвиженияНакопления.Приход;
ПозицияВЗаказе.Месторождение = ТекСтрокаРезерва.Месторождение;
ПозицияВЗаказе.Обработка = ТекСтрокаРезерва.Обработка;
ПозицияВЗаказе.ВидПродукции = ТекСтрокаРезерва.ВидПродукции;
ПозицияВЗаказе.Длина = ТекСтрокаРезерва.Длина;
ПозицияВЗаказе.Ширина = ТекСтрокаРезерва.Ширина;
ПозицияВЗаказе.Толщина = ТекСтрокаРезерва.Толщина;
ПозицияВЗаказе.Заказ = ТекСтрокаРезерва.Заказ;
Выборка.Следующий();
Если Выборка.Количество() > 1 Тогда
Сообщить("Обнаружен дубликат");
Отказ = Истина;
ИначеЕсли Выборка.Количество() = 0 Тогда
ПозицияВЗаказе.Количество = ТекСтрокаРезерва.Количество;
Иначе
ПозицияВЗаказе.Количество = ТекСтрокаРезерва.Количество + Выборка["Количество"];
КонецЕсли;
КонецЦикла;
Движения.СкладРезервации.Загрузить(ТЗУпакПрод);
КонецПроцедуры
ПоказатьЯ писал где ставлю точку остановки и смотрю результат.
попробуйте оставить только количество:
с проверкой на NULL - остальное и так известно (всё есть в параметрах), и будет понятно, что не так. Да, можно посмореть ДО Выборка.Следующий() посмотрев таблицу значений, что выдаст Запрос.Выполнить.Выгрузить()...
Запрос.Текст = "ВЫБРАТЬ
| ЕСТЬNULL(СкладРезервации.КоличествоОстаток, 0) КАК Количество
|ИЗ
| РегистрНакопления.СкладРезервации.Остатки(
| &Дата,
| ВидПродукции = &ВидПродукции
| И Месторождение = &Месторождение
| И Обработка = &Обработка
| И Длина = &Длина
| И Ширина = &Ширина
| И Толщина = &Толщина
| И Заказ = &Заказ) КАК СкладРезервации";
Показатьс проверкой на NULL - остальное и так известно (всё есть в параметрах), и будет понятно, что не так. Да, можно посмореть ДО Выборка.Следующий() посмотрев таблицу значений, что выдаст Запрос.Выполнить.Выгрузить()...
(2) попробовал и выдает 0, что странно, так как в консоли с теми же параметрами записи есть (запущен толстый клиент (управляемое приложение)). Пробывал выполнить выражение Запрос.Выполнить.Выгрузить() во время отладки, скрин проложил.
Это не может быть связано с тем откуда выполняется запрос?
Это не может быть связано с тем откуда выполняется запрос?
Прикрепленные файлы:

Главные принципы поиска любой ошибки:
1) никогда не показывать строку кода, на которой ошибка
2) никогда не приводить полный текст ошибки дословно.
Выполнение обоих принципов гарантирует долгое и плодотворное обсуждение, максимум общения и потраченного времени
Дополнительный пункт
3) никогда не говорить, какая конфигурация.
Это часто улучшает результативность первых двух пунктов
;)
1) никогда не показывать строку кода, на которой ошибка
2) никогда не приводить полный текст ошибки дословно.
Выполнение обоих принципов гарантирует долгое и плодотворное обсуждение, максимум общения и потраченного времени
Дополнительный пункт
3) никогда не говорить, какая конфигурация.
Это часто улучшает результативность первых двух пунктов
;)
(3)
1) написал, что точку остановки ставлю после Выборка.Следующий(), а далее смотрю, что находится в Выборке и там "Ошибка чтения значения".
2) написал же "Ошибка чтения значения", что странно ведь , если консоли выполнить запрос с теми же параметрами, то будет результат (об этом также писал)
3) не знаю как тут поможет это, но напишите пж, как в данном контексте это может помочь, для личного роста. Буду благодарен.
Мне показалось куда важнее информация откуда выполняется запрос и я об этом написал. Скорее всего ещё бы стоило указать какой клиент запущен.
1) написал, что точку остановки ставлю после Выборка.Следующий(), а далее смотрю, что находится в Выборке и там "Ошибка чтения значения".
2) написал же "Ошибка чтения значения", что странно ведь , если консоли выполнить запрос с теми же параметрами, то будет результат (об этом также писал)
3) не знаю как тут поможет это, но напишите пж, как в данном контексте это может помочь, для личного роста. Буду благодарен.
Мне показалось куда важнее информация откуда выполняется запрос и я об этом написал. Скорее всего ещё бы стоило указать какой клиент запущен.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот