Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 16:26

Ошибка чтения значения

Автор Рафаэль, 10 янв 2016, 13:55

0 Пользователей и 1 гость просматривают эту тему.

Рафаэль

1С 8.3, самописная, учебная.
Всем доброго времени суток! Столкнулся с проблемой и никак ее не могу решить. Вот текст запроса:
"ВЫБРАТЬ
|   ПродажаТоваровТовары.Номенклатура,
|   СУММА(ПродажаТоваровТовары.Количество) КАК Количество,
|   ПродажаТоваровТовары.Ссылка.Склад
|ПОМЕСТИТЬ ТабДок
|ИЗ
|   Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
|ГДЕ
|   ПродажаТоваровТовары.Ссылка = &Ссылка
|   И ПродажаТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)
|
|СГРУППИРОВАТЬ ПО
|   ПродажаТоваровТовары.Номенклатура,
|   ПродажаТоваровТовары.Ссылка.Склад
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|   ТабДок.Номенклатура,
|   ТабДок.Количество,
|   ТабДок.Склад,
|   ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстатки,
|   ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстатки
|ИЗ
|   ТабДок КАК ТабДок
|      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
|            &Момент,
|            (Номенклатура, Склад) В
|               (ВЫБРАТЬ
|                  ТабДок.Номенклатура,
|                  ТабДок.Склад
|               ИЗ
|                  ТабДок КАК ТабДок)) КАК ОстаткиНоменклатурыОстатки
|      ПО ТабДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура"

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

Vladimir_Sh

Более подробнее, какую ошибку показывает?
Если я Вам помог, нажми - Спасибо!

Рафаэль

Цитата: Vladimir_Sh от 10 янв 2016, 14:20
Более подробнее, какую ошибку показывает?

Vladimir_Sh

Выполните
РезультатЗапроса.Выбрать().Количество()
Если больше 0 тогда выборка со значениями и в цикле в переменную РезультатЗапроса будут передаваться строки выборки запроса на каждой итерации.
Хотите просмотреть всю выборку в таблице на отладке тогда Вам следующий код
Запрос.Выполнить().Выгрузить()
Получите ТЗ которую удобно анализировать визуально в отладке.
Если я Вам помог, нажми - Спасибо!

Рафаэль

Можете поподробнее объяснить, если не сложно? А то что то не могу понять..

cska-fanat-kz

Цитата: Рафаэль от 10 янв 2016, 13:55Массив = Новый Массив;

"Массив" - служебное слово. Слева, имя переменной, придумайте другое.

Затем после цикла точку останова поставьте и посмотрите, чему "Массив" равен, скорее всего ничему.
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Vladimir_Sh

Ну попробую)
Когда используется Выбрать(), то на выходе получается ВыборкаРезультатаЗапроса (это можно назвать его "контейнер" со строками), обход выборки происходит с помощью Следующий() в цикле. На каждом итерации (т.е. повторном выполнении тела) цикла происходит инициализация (присваивание строки) в переменную со значением ВыборкаРезультатЗапроса. Например имеем результат выборки:
НоменклатураКоличество
Яблоко1
Груша2
Банан3
Далее при конструкции
РезультатЗапроса = Запрос.Выполнить().Выбрать();
В переменной РезультатЗапроса будет значение типа "ВыборкаРезультатаЗапроса". Для того чтобы обойти значения необходимо использовать конструкцию.
Пока РезультатЗапроса.Следующий() Цикл
<<тело цикла>>
КонецЦикла;
При первом проходе с переменной РезультатЗапроса будет значения
НоменклатураКоличество
Яблоко1
При втором
НоменклатураКоличество
Груша2
и т.д.
Их можно просмотреть в отладке.
Добавлено: 10 янв 2016, 15:16


Цитата: cska-fanat-kz от 10 янв 2016, 15:11
Цитата: Рафаэль от 10 янв 2016, 13:55Массив = Новый Массив;

"Массив" - служебное слово. Слева, имя переменной, придумайте другое.

Затем после цикла точку останова поставьте и посмотрите, чему "Массив" равен, скорее всего ничему.

Нет не является, используется только в конструкции "Новый Массив". Теоретически его можно использовать без каких либо проблем, на практике - просто не желательно.
Если я Вам помог, нажми - Спасибо!

Рафаэль

Цитата: Vladimir_Sh от 10 янв 2016, 15:12
Ну попробую)
Когда используется..
Так и не понял, что у меня не так и что мне надо поменять?

Vladimir_Sh

<_< да все у вас верно, в отладке так и будет показывать "Ошибка чтения значения". Поставьте точку останова во внутрь цикла и увидите в ней данные.
Если я Вам помог, нажми - Спасибо!

Рафаэль

Цитата: Vladimir_Sh от 10 янв 2016, 15:31
<_< да все у вас верно, в отладке так и будет показывать "Ошибка чтения значения". Поставьте точку останова во внутрь цикла и увидите в ней данные.
В цикл не заходит

Теги: 1сЮ 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск