Обход выборки из результата запроса
страницаОбход выборки из результата запроса
Теперь рассмотрите подробно пятый этап выполнения запроса, показанный на схеме (рис. 11.64). На этом этапе и происходит то, ради чего, собственно, создавался и выполнялся запрос, – программная обработка результатов запроса для последующего представления их пользователю, например для вывода результатов запроса в табличный документ.
Для обхода выборки из результата запроса нужно организовать цикл, в котором перебираются элементы коллекции данных, содержащихся в объекте ВыборкаИзРезультатаЗапроса. Для этого используется метод выборки Следующий(), который позволяет перейти к следующей записи результата запроса в соответствии с порядком обхода выборки.
Этот метод вызывается в цикле Пока Выборка.Следующий() … Цикл до тех пор, пока не будет получено значение Ложь. При первом проходе цикла метод Следующий() позиционирует выборку на первую запись.
Следует иметь в виду, что если выборка из результата запроса получена, но ее метод Следующий() еще ни разу не вызывался (то есть выборка еще не спозиционирована), то значения полей выборки будут не определены – например, их нельзя будет посмотреть в отладчике.
При обходе выборки в теле цикла производятся необходимые действия над данными, полученными с помощью запроса (листинг 11.51).
Листинг 11.51. Обход выборки
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПриходнаяНакладнаяМатериалы.Материал,
| ПриходнаяНакладнаяМатериалы.Ссылка.Дата,
| ПриходнаяНакладнаяМатериалы.Ссылка.Номер
|ИЗ
| Документ.ПриходнаяНакладная.Материалы КАК ПриходнаяНакладнаяМатериалы
|ГДЕ
| ПриходнаяНакладнаяМатериалы.Ссылка.Номер = &НомерНакладной";
Запрос.УстановитьПараметр("НомерНакладной", "000000001");
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Материал);
КонецЦикла;
Результат запроса может содержать записи, не имеющие иерархии (например, список документов), или, наоборот, записи, обладающие иерархией (например, справочник Номенклатура). Поэтому существует несколько разных способов обхода выборки: в линейном порядке, в иерархическом порядке или по группировкам. Сейчас вы рассмотрите самый простой способ обхода выборки – линейный.
При линейном обходе выборка будет выдавать записи в той последовательности, в которой они располагаются в результате запроса.
Для получения линейной выборки из результата запроса необходимо вызвать метод Выбрать() объекта РезультатЗапроса без параметров либо с параметром ОбходРезультатаЗапроса.Прямой (листинг 11.52).
Листинг 11.52. Прямой порядок обхода выборки
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПриходнаяНакладнаяМатериалы.Материал,
| ПриходнаяНакладнаяМатериалы.Ссылка.Дата,
| ПриходнаяНакладнаяМатериалы.Ссылка.Номер
|ИЗ
| Документ.ПриходнаяНакладная.Материалы КАК ПриходнаяНакладнаяМатериалы
|ГДЕ
| ПриходнаяНакладнаяМатериалы.Ссылка.Номер = &НомерНакладной";
Запрос.УстановитьПараметр("НомерНакладной", "000000001");
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать(****);
Пока Выборка.Следующий() Цикл
Сообщить("Материал: " + Выборка.Материал + " Дата: " + Выборка.Дата + " Номер: " + Выборка.Номер);
КонецЦикла;
Поместите этот код в обработку РаботаСЗапросами, запустите приложение и запустите эту обработку. В окно сообщений будут последовательно выданы данные о поступлении номенклатуры из приходной накладной № 1.