584 документа
← К списку

Обход выборки из результата запроса

страница

Обход выборки из результата запроса

Теперь рассмотрите подробно пятый этап выполнения запроса, показанный на схеме (рис. 11.64). На этом этапе и происходит то, ради чего, собственно, создавался и выполнялся запрос, – программная обработка результатов запроса для последующего представления их пользователю, например для вывода результатов запроса в табличный документ.

Для обхода выборки из результата запроса нужно организовать цикл, в котором перебираются элементы коллекции данных, содержащихся в объекте ВыборкаИзРезультатаЗапроса. Для этого используется метод выборки Следующий(), который позволяет перейти к следующей записи результата запроса в соответствии с порядком обхода выборки.

Этот метод вызывается в цикле Пока Выборка.Следующий() … Цикл до тех пор, пока не будет получено значение Ложь. При первом проходе цикла метод Следующий() позиционирует выборку на первую запись.

Следует иметь в виду, что если выборка из результата запроса получена, но ее метод Следующий() еще ни разу не вызывался (то есть выборка еще не спозиционирована), то значения полей выборки будут не определены – например, их нельзя будет посмотреть в отладчике.

При обходе выборки в теле цикла производятся необходимые действия над данными, полученными с помощью запроса (листинг 11.51).

Листинг 11.51. Обход выборки

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

|    ПриходнаяНакладнаяМатериалы.Материал,

|    ПриходнаяНакладнаяМатериалы.Ссылка.Дата,

|    ПриходнаяНакладнаяМатериалы.Ссылка.Номер

|ИЗ

|    Документ.ПриходнаяНакладная.Материалы КАК ПриходнаяНакладнаяМатериалы

|ГДЕ

|    ПриходнаяНакладнаяМатериалы.Ссылка.Номер = &НомерНакладной";

Запрос.УстановитьПараметр("НомерНакладной", "000000001");

 

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

 

Пока Выборка.Следующий() Цикл

Сообщить(Выборка.Материал);

 

КонецЦикла;

Результат запроса может содержать записи, не имеющие иерархии (например, список документов), или, наоборот, записи, обладающие иерархией (например, справочник Номенклатура). Поэтому существует несколько разных способов обхода выборки: в линейном порядке, в иерархическом порядке или по группировкам. Сейчас вы рассмотрите самый простой способ обхода выборки – линейный.

При линейном обходе выборка будет выдавать записи в той последовательности, в которой они располагаются в результате запроса.

Для получения линейной выборки из результата запроса необходимо вызвать метод Выбрать() объекта РезультатЗапроса без параметров либо с параметром ОбходРезультатаЗапроса.Прямой (листинг 11.52).

Листинг 11.52. Прямой порядок обхода выборки

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

|    ПриходнаяНакладнаяМатериалы.Материал,

|    ПриходнаяНакладнаяМатериалы.Ссылка.Дата,

|    ПриходнаяНакладнаяМатериалы.Ссылка.Номер

|ИЗ

|    Документ.ПриходнаяНакладная.Материалы КАК ПриходнаяНакладнаяМатериалы

|ГДЕ

|    ПриходнаяНакладнаяМатериалы.Ссылка.Номер = &НомерНакладной";

Запрос.УстановитьПараметр("НомерНакладной", "000000001");

 

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать(****);

 

Пока Выборка.Следующий() Цикл

Сообщить("Материал: " + Выборка.Материал + " Дата: " + Выборка.Дата + " Номер: " + Выборка.Номер);

 

КонецЦикла;

Поместите этот код в обработку РаботаСЗапросами, запустите приложение и запустите эту обработку. В окно сообщений будут последовательно выданы данные о поступлении номенклатуры из приходной накладной № 1.