Работа с запросами во встроенном языке 1С 8.3

Курс

Схема выполнения запроса

Для работы с запросами во встроенном языке 1С есть следующие объекты:

  • Запрос
  • РезультатЗапроса
  • ВыборкаИзРезультатаЗапроса

Общая схема выполнения запроса выглядит следующим образом:

  1. Создается объект Запрос, через свойство Текст устанавливается текст запроса.
  2. Если в запросе есть параметры, то методом УстановитьПараметр заполняются значения параметров запроса.
  3. С помощью метода Выполнить получается объект РезультатЗапроса.
  4. Из результата запроса методом Выбрать получается объект ВыборкаИзРезультатаЗапроса. Также результат запроса можно выгрузить в таблицу значений или в дерево значений с помощью метода Выгрузить.
  5. На последнем шаге выполняется обработка выборки, таблицы значений или дерева значений.

Например:

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

Параметры запроса

Для того чтобы передать значения параметров в запрос используется метод УстановитьПараметр. При этом если задать значение параметра, которого нет в тексте запроса, то запрос все равно выполнится. А если не задать значение какого-либо параметра, то будет выброшено исключение «Не задано значение параметра Имя параметра».

После заполнения значений параметров они будут доступны через свойство Параметры объекта Запрос:

Однако до вызова метода УстановитьПараметр структура Параметры будет пустой. Чтобы получить все параметры из текста запроса можно воспользоваться методом НайтиПараметры:

В свойстве ТипЗначения будет тип параметра запроса.

Текст запроса можно формировать динамически. Для этого используется следующий способ:

Через функцию СтрЗаменить параметр &ИмяТаблицы будет заменен на нужное имя таблицы. При этом удобно использовать параметр для замены, чтобы текст запроса открывался через конструктор запроса. Хотя можно было использовать любой идентификатор:

В качестве параметра запроса можно передать массив или список значений:

Если нужно чтобы параметр запроса был необязательным к заполнению, то можно воспользоваться таким приемом:

Если параметр СсылкаНаТочку не будет заполнен, то параметр БезОтбора будет равен Истина, а так как два параметра объединены между собой по условию ИЛИ, то все условие всегда будет равно Истина, отбор по ссылке не будет выполняться.

Результат запроса

Метод Выполнить возвращает РезультатЗапроса. С помощью метода Пустой можно проверить есть ли что-то в результате запроса или он пустой:

Результат запроса можно выгрузить в таблицу значений:

Также результат запроса можно выгрузить в массив:

Если в запросе были использованы ИТОГИ, то результат запроса можно выгрузить в дерево значений. Важно отметить, что для получения иерархического дерева в запросе должны быть именно ИТОГИ, а не СГРУППИРОВАТЬ ПО:

Результат запроса на клиенте

Результат запроса доступен только на сервере и его нельзя передать на клиента. Для того, чтобы передать результат запроса на клиента можно создать массив структур, где каждый ключ структуры будет совпадать с наименованием поля выборки запроса:

Выборка запроса

Для того чтобы обойти результат запроса можно воспользоваться методом Выбрать, который вернет объект ВыборкаИзРезультатаЗапроса:

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

С помощью метода НайтиСледующий можно найти нужную запись в выборке. Параметром передается структура отбора. Если запись в выборке найдена, то метод вернет Истина.

Чтобы узнать количество записей в выборке можно воспользоваться методом Количество:

С помощью метода Сбросить можно сбросить выборку на начало. Тогда метод Следующий снова спозиционирует выборку на первую запись. Можно использовать для повторного обхода выборки:

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

Справочник

Если выполнить следующий код:

То получим такой результат:

СледующийПоЗначениюПоля

В выборку попали только элементы с уникальным адресом.

Если внутри цикла обхода такой выборки вызвать метод Следующий, то будут получены все записи, у которых совпадает адрес:

С помощью метода Владелец можно из выборки получить результат запроса, из которого была получена данная выборка:

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

Если в метод Выбрать не передать никакой параметр или передать параметр ОбходРезультатаЗапроса.Прямой, то будет получена прямая выборка в той последовательности, какая была указана в тексте запроса:

Если в запросе были использованы ИТОГИ, то можно получить выборку по группировкам, указав параметр ОбходРезультатаЗапроса.ПоГруппировкам:

На первом уровне выборки будут доступны только адреса, причем без повторений. В полях Код, Наименование и Руководитель будет NULL. Методом Выбрать из выборки по адресам можно получить выборку по детальным записям.

Если в запросе были ИТОГИ по нескольким полям, то и уровней вложенности в выборке по группировкам будет больше:

Для иерархических справочников можно использовать обход по группировкам с иерархией. Для этого параметром нужно передать ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, а также нужно передать имя поля группировки. Соответственно и в запросе итоги должны быть получены с учетом иерархии:

Здесь также использовался метод ТипЗаписи, который возвращает тип записи группировки: общий итог, итог по иерархии, итог по группировке или детальная запись. Также у выборки есть методы Уровень — позволяет получить числовой уровень группировки, и Группировка — который возвращает имя группировки (для детальных записей пустая строка).

Например, есть следующий иерархический справочник:

Иерархический справочник

Выполним следующий код:

Полученная таблица будет выглядеть следующим образом:

Тип записи, уровень, группировка

Дополнение периода в запросе

Например, в запросе нужно получить количество документов продажи за месяц в разрезе каждого дня. Если выполнить такой запрос:

То полученная таблица будет выглядеть следующим образом:

Дополнение периода

Здесь не удобно то, что в таблице есть только те даты, когда были продажи. Для того чтобы получить все даты можно воспользоваться механизмом дополнения периода в запросах. Для этого нужно сформировать ИТОГИ по полю Дата и указать что нужно дополнить период с периодичностью день:

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

Дополнение периода

Для того чтобы сработало дополнение периода нужно получить выборку результата запроса и последним параметром указать «ВСЕ»:

Дополнение периода

Теперь все даты попали в таблицу.


Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Используя этот сайт, Вы даете согласие на использование cookies. На данном этапе Вы можете отказаться от использования cookies, настроив необходимые параметры в своем браузере.
ok