8.х Выборка из результата запроса - Ошибка чтения значения.

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Lokky, 31 авг 2011.

  1. TopicStarter Overlay
    Lokky
    Offline

    Lokky

    Регистрация:
    24 июл 2011
    Сообщения:
    12
    Симпатии:
    0
    Баллы:
    1
    Есть простенький запрос

    Код:
    Процедура Заполнение(Дата)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |	СменаПоставщиковУслугСрезПоследних.ОбслуживаниеДома КАК ОбслуживаниеДома,
    |	СменаПоставщиковУслугСрезПоследних.Электроэнергия КАК Электроэнергия,
    |	СменаПоставщиковУслугСрезПоследних.ХолоднаяВодаВодоотведение КАК ХолоднаяВодаВодоотведение,
    |	СменаПоставщиковУслугСрезПоследних.ГорячаяВодаОтопление КАК ГорячаяВодаОтопление
    |ИЗ
    |	РегистрСведений.СменаПоставщиковУслуг.СрезПоследних КАК СменаПоставщиковУслугСрезПоследних
    |ГДЕ
    |	СменаПоставщиковУслугСрезПоследних.Период <= &Дата";
    Запрос.УстановитьПараметр("Дата", Дата);
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    КонецПроцедуры
    
    
    
    Если проверять во внешней консоли запросов, то отрабатывает и результат выводит:
    Посмотреть вложение 8398
    А в модуле формы Результат пустой, а при попытке Результат.Выбрать(); выдает Ошибка чтения значения.
    Посмотреть вложение 8399
    Почему тогда в консоле он отрабатывает? И подскажите, пожалуйста, как сделать, чтоб работал и в модуле, второй день безрезультатно пытаюсь понять что не так?

    Вложения:

  2. PavelBaryshev
    Offline

    PavelBaryshev Опытный в 1С

    Регистрация:
    9 сен 2008
    Сообщения:
    316
    Симпатии:
    0
    Баллы:
    26
    А значение Дата не пустое в модуле?
  3. TopicStarter Overlay
    Lokky
    Offline

    Lokky

    Регистрация:
    24 июл 2011
    Сообщения:
    12
    Симпатии:
    0
    Баллы:
    1

    Вложения:

  4. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    Что говорит?
    Код:
    Результат.Выгрузить().ВЫбратьСтроку();
    
    
  5. TopicStarter Overlay
    Lokky
    Offline

    Lokky

    Регистрация:
    24 июл 2011
    Сообщения:
    12
    Симпатии:
    0
    Баллы:
    1
    В режиме предприятия открывает диалог с предложением выбрать строку.

    А предполагается выбрать запись для подстановки из каждого столбца значений в разные поля ввода.
  6. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    а так если :

    вместо Выборка = Результат.Выбрать();
    напиши
    Выборка = Результат.Выбрать().Следующий();

    и смотри что в Выборка
  7. TopicStarter Overlay
    Lokky
    Offline

    Lokky

    Регистрация:
    24 июл 2011
    Сообщения:
    12
    Симпатии:
    0
    Баллы:
    1
    Код:
     Выборка = Результат.Выбрать();
    
    Заменил на
    Код:
     Выборка = Результат.Выгрузить();
    
    и выгрузил полученную таблицу значений, для проверки, в табличное поле. Значения есть, те которые и получались в консоле запросов.

    Но вопросы остались.

    В каких случаях используется конструкция Запрос.Выполнить().Выбрать()?
    И в каких случаях Запрос.Выполнить().Выгрузить()?

    И как теперь добраться по отдельности до значений каждого столбца?


    В Выборка - истина.
  8. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Если Выгрузить() работает, то и Выбрать() тоже должно, на мой взгляд, 100% работать. Может еще где ошибка есть?
    Отличается тем, что при использовании метода Выгрузить() Вы получаете таблицу значений, а при использовании Выбрать() - выборку из результата запроса (это тип данных такой есть...в С-П можно посмотреть).
    Что и когда использовать, зависит от Вас и от задачи. С позиции производительности ВЫБОРКА работает быстрее, чем ТАБЛИЦА.

    Всё как обычно при работе с таблицей значений.
    Если перебор строк делаете:
    Код:
    ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
    Для Каждого СтрокаТаблицы Из ТаблицаРезультата Цикл
    ЗначениеИзКолонки = СтрокаТаблицы.НужнаяКолонка;
    КонецЦикла;
    
    
    
    Если конкретная строка нужна:
    Код:
    ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
    ЗначениеИзКолонки = ТаблицаРезультата[ИндексСтроки].НужнаяКолонка;
    
    
    
    P.S. Условие на дату лучше накладывать в параметре виртуальной таблицы, а не в выражении ГДЕ.
  9. TopicStarter Overlay
    Lokky
    Offline

    Lokky

    Регистрация:
    24 июл 2011
    Сообщения:
    12
    Симпатии:
    0
    Баллы:
    1
    1cUserAndrew, Спасибо.

    Добрался этим способом
    Код:
    ЗначениеИзКолонки = ТаблицаРезультата[ИндексСтроки].НужнаяКолонка;
    
    
    Так работает
    Код:
    Выборка = Результат.Выгрузить();
    Поставщик1 = Выборка[0].ОбслуживаниеДома;
    
    А через выборку не хочет.
    Код:
    Выборка = Результат.Выбрать();
    Поставщик1 = Выборка.ОбслуживаниеДома;
    
  10. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Чуть-чуть не так...
    Вот:
    Код:
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    Поставщик1 = Выборка.ОбслуживаниеДома;
    
    
    
    Это если из первой строки.

    Если в выборке будет не одна строка, тогда так:
    Код:
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
    Значение = Выборка.ОбслуживаниеДома;
    КонецЦикла;
    
    
  11. sgirg
    Offline

    sgirg Опытный в 1С

    Регистрация:
    25 дек 2008
    Сообщения:
    126
    Симпатии:
    0
    Баллы:
    26
    после строки
    Код:
    Результат = Запрос.Выполнить();
    
    напишите условие
    Код:
    Если НЕ Результат.Пустой() Тогда
    
    что бы избежать ошибок при пустом результате запроса...
  12. TopicStarter Overlay
    Lokky
    Offline

    Lokky

    Регистрация:
    24 июл 2011
    Сообщения:
    12
    Симпатии:
    0
    Баллы:
    1
    Всё, понял где корень всех мучений!
    Вот эту конструкцию, постоянно забываю :)
    Код:
    Выборка.Следующий();
    
    Ещё раз Спасибо огромное за оперативную помощь!

Поделиться этой страницей