Чем отличается выбрать от выгрузить 1с

Обновлено: 04.07.2024

Запросы предназначены для извлечения и обработки информации из базы данных для предоставления пользователю в требуемом виде. Под обработкой здесь подразумевается группировка полей, сортировка строк, расчет итогов и т.д. Изменять данные с помощью запросов в 1С нельзя!

Схема работы с запросом

Общая схема работы с запросом состоит из нескольких последовательных этапов:

  1. Создание объекта Запрос и установка текста запроса;
  2. Установка параметров запроса;
  3. Выполнение запроса и получение результата;
  4. Обход результата запроса и обработка полученных данных.

1. Объект Запрос имеет свойство Текст, которому необходимо присвоить текст запроса.

3. После присвоения текста и установки параметров запрос необходимо выполнить и получить результат выполнения. Выполнение производится методом Выполнить () , который возвращает объект РезультатЗапроса. Из результата запроса можно:

  • получить выборку с помощью метода Выбрать (< ТипОбхода >, < Группировки >, < ГруппировкиДляЗначенийГруппировок >) ;
  • выгрузить значения в таблицу значений или дерево значений с помощью метода Выгрузить (< ТипОбхода >) .

// Получение выборки
РезультатЗапроса = Запрос . Выполнить ();
Выборка = РезультатЗапроса . Выбрать ();

// Получение таблицы значений
РезультатЗапроса = Запрос . Выполнить ();
Таблица = РезультатЗапроса . Выгрузить ();

4. Обойти выборку результата запроса можно с помощью цикла:

Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Курс );
КонецЦикла;

Полный пример работы с запросом может выглядеть так:

Состав текста запроса

Текст запроса состоит из нескольких секций:

Обязательной является только первая секция.

Временные таблицы и пакетные запросы

Часто можно столкнуться с ситуацией, когда в качестве источника запроса нужно использовать не таблицы базы данных, а результат выполнения другого запроса. Эту задачу можно решить с помощью вложенных запросов или временных таблиц. Применение временных таблиц позволяет упростить текст сложного запроса, разделив его на составные части, а также, в некоторых случаях, ускорить выполнение запроса и уменьшить количество блокировок. Для работы с временными таблицами используется объект МенеджерВременныхТаблиц. Создание временной таблицы производится при помощи ключевого слова ПОМЕСТИТЬ, за которым следует наименование временной таблицы.

Виртуальные таблицы

Существуют следующие виртуальные таблицы (в скобках указаны возможные параметры):

При работе с виртуальными таблицами следует накладывать отборы в параметрах виртуальных таблиц, а не в условии ГДЕ. От этого сильно зависит время выполнения запроса.

Конструктор запроса

Для ускорения ввода текстов запросов платформа имеет специальные инструменты: Конструктор запроса и Конструктор запроса с обработкой результата. Для вызова конструкторов необходимо щелкнуть правой кнопкой мыши и выбрать требуемый пункт:

Вызов конструктора запроса

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

При помощи конструктора запроса программист может интерактивно сконструировать текст запроса. Для этого мышкой выбираются нужные таблицы и поля, устанавливаются связи, группировки, итоги и т.д. Данный подход позволяет экономить время и избавиться от возможных ошибок. В результате своей работы конструктор запроса формирует текст запроса.

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

Конструктор запроса 1С

Объект СхемаЗапроса

Платформа позволяет программно создавать и редактировать текст запроса при помощи объекта СхемаЗапроса. Объект имеет единственное свойство ПакетЗапросов, в котором объекта хранятся свойства всех запросов, редактируемых в данный момент. Объект СхемаЗапроса поддерживает следующие методы:

Рассмотрим пример работы с объектом СхемаЗапроса. Для программного формирования текста запроса

ВЫБРАТЬ
Валюты.Ссылка КАК Валюта,
Валюты.Код
ИЗ
Справочник.Валюты КАК Валюты
ГДЕ
НЕ Валюты.ПометкаУдаления

УПОРЯДОЧИТЬ ПО
Валюты.Код

Код на встроенном языке может выглядеть так:

Остались вопросы?
Спросите в комментариях к статье.

(4) Помнится мне, что Выборка как раз порционно как-то все достает, а Выгрузка в ТЗ все сразу выгружает в ОЗУ, поэтому рекомендуется использовать Выборку (самой 1С рекомендуется). Пруфов не будет, где-то слышал/читал, найти сейчас сложно будет.

(1) По идее быстрее будет выгрузка в ТЗ, достаем все из БД, и грузим в память, но памяти должно хватать на загрузку всей таблицы, то есть выгрузка не всегда оптимальна. На тех же экзаменах 1С запрещают просто так использовать таблицу значений. Я на своей практике всегда использую выборку, когда не нужна вся таблица целиком (например для специфических отборов из таблицы значений, чтобы не сбрасывать выборку каждый раз).

Через выгрузить() хуже.
Если данных много, то может отвалиться с ошибкой "Не хватает памяти".
А через Выбрать() не отвалиться. Будете ждать окончания выполнения цикла
Пока Выборка.Следующий() до посинения :) Коллега по работе говорит, что в случае, если обходить методом выбрать(), то каждый раз при новой итерации мы обращаемся к серверу, так ли это? ТО биш, если у нас в выборке 1000 записей, то будет 1000 обращений к серверу

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

(19) Вооот. Т.е. выборка из результата запроса использует временные файлы. В отличие от ТЗ, которая полностью в памяти.
Меня всегда интересовал вопрос:
Когда, скажем, через ADO делается обход RecordSet - драйвер уже имеет весь RecordSet на клиенте, или СУБД как-то удерживает весь результат запроса у себя и отдает его драйверу порционно по сетке по мере обхода? (17)обработка Запроса всегда на Сервере или нет?
ИМХО Выборка лучше если надо с данными запроса поработать, если просто заполниь ТЗ (или ТЧ документа к примеру) и в запросе выбрали все что надо, то можно сразу Выгрузить (но не более n строк, вроде и в SQL есть ограничения, и в 1С, и в документах).

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

(0) В обоих случаях вы получаете данные полностью, но при выгрузке вы еще создаете ТЗ, а при большом количестве данных это занимает много времени, но иногда впоследствии работа с ТЗ более удобна. Что использовать ваш выбор, но считается некорректным без особой необходимости выгружать результат в ТЗ.

2. При потенциально неограниченных выборках данных из ИБ следует получать данные из базы порциями фиксированного размера.
Например, неправильно:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Наименование,
| Номенклатура.ВидНоменклатуры
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";

// Выгрузка всего справочника в таблицу значений
Номенклатура = Запрос.Выполнить().Выгрузить();
Для каждого ПозицияНоменклатуры Из Номенклатура Цикл
// Обработка элемента справочника
// .
КонецЦикла;

поскольку весь результат запроса сразу помещается в память, в таблицу значений.
Также неправильно:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Наименование,
| Номенклатура.ВидНоменклатуры
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";

РезультатЗапроса = Запрос.Выполнить();
// Обход результата запроса
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Обработка элемента выборки
// .
КонецЦикла;

поскольку и в этом случае при выполнении запроса его результат будет сначала считан в память целиком (*).

* Примечание. Если используется 32-битная версия платформы, и размер результата запроса превосходит размер имеющейся памяти, то данные будут записаны на диск, а затем считаны оттуда в процессе вызовов Выборка.Следующий().

Сразу хочу предупредить, что вопрос освещаемый в этой статье очень специальный и если вы хотите увидеть общий обзор всего, да с практической пользой и применением, то лучше вам дальше не читать.

Тем же, кого, как и меня, беспокоил не не давал спокойно спать этот мелкий и назойливый вопрос "ну почему список" - добро пожаловать. Итак, интерес исключительно академический, практическая значимость сомнительна. Поехали!

Все началось с того, наш любимый синтакс помощник выдал мне вот такую справку:

РезультатЗапроса (QueryResult)
Выбрать (Choose)
Синтаксис:

Выбрать(, , )

Параметры:

(необязательный)

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

(необязательный)

Тип: Строка.

Список группировок по которым будет вестись обход, разделенных запятыми.
Для детальных записей указывается пустая строка. В случае, если группировки не указаны - будет использоваться следующая группировка, указанная в предложении запроса "ИТОГИ".
(необязательный)

(необязательный)

Тип: Строка.

Список группировок, из которых будут выбираться значения группировок для обхода, разделенных запятыми. Если указано "Все", то будут выбираться все значения группировок. Если указана пустая строка, то значения для группировок будут выбираться из предыдущей группировки.

Возвращаемое значение:

Тип: ВыборкаИзРезультатаЗапроса.

Описание:

Формирует выборку записей из результата запроса.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Примечание:

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

Пример:

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

Казалось бы, всё понятно, все пользовались миллион раз. Но, обратите внимание, что в описании второго параметра написано:

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

Исходя из практики сразу скажу, что этот параметр используется редко даже с одной группировкой. Проще в самом запросе указать группировки в нужном порядке, чтобы потом по ним "идти", чем потом в коде пропускать какие-то группировки. Да, и вообще, как уже говорилось - СКД рулит. Но какое-то поведение все-таки закладывалось в метод, когда в параметре перечислен именно список группировок? Какое? Этот вопрос беспокоил не только меня, но интернет предательски молчал.

Вот те мучающиеся вопросом бедолаги, которых мне удалость разыскать (всем привет!):

Читайте также: