Общая схема выполнения запросов
Запросы в системе «1С:Предприятие 8» предназначены для выборки информации из базы данных. По сути, запрос — это обращение к системе с просьбой выбрать определенную информацию из базы данных, а часто не только выбрать, но и произвести некоторую обработку: сгруппировать, отсортировать, вычислить. Например, с помощью запроса можно легко узнать объем продаж каждого товара в течение года с детализацией до месяца или выбрать элементы справочников по определенному условию. Заметьте, что изменять данные с помощью запросов в 1С:Предприятии не разрешается.
Язык запросов 1С:Предприятия 8 основан на стандартном SQL, но при этом содержит значительное количество расширений, ориентированных на финансово-экономические задачи, и значительно облегчает разработку бизнес-приложений.
Для работы с запросами в системе «1С:Предприятие 8» предусмотрено несколько специальных объектов, а именно:
- Запрос
- РезультатЗапроса
- ВыборкаИзРезультатаЗапроса.
Общая схема выполнения запроса такова:
- Создание объекта «Запрос» с нужным текстом запроса на специальном языке запросов.
- Установка параметров запроса с помощью метода УстановитьПараметр.
- Выполнение запроса, получение результата.
- Получение выборки из результата запроса или выгрузка результата в таблицу значений / дерево значений. Также есть возможность использовать результат запроса для формирования сводной таблицы.
- Обработка выборки или таблицы значений (например, перебор строк) и выполнение действий, для которых был нужен запрос, например, вывод области при формировании отчета
Графически это можно представить следующим образом:

Цифрами на схеме обозначены следующие действия:
1. Установка текста запроса
Объект «Запрос» имеет свойство «Текст», которое содержит строку с текстом запроса на языке запросов. Этому свойству, во-первых, можно явно присвоить значение или, во-вторых, воспользоваться конструктором объекта «Запрос». В последнем случае текст запроса передается в качестве параметра в конструктор объекта «Запрос» при его создании.
1-й вариант:
Копировать в буфер обмена
НашЗапрос 2-й вариант (с другим текстом запроса):Копировать в буфер обмена
НашЗапрос
2. Установка параметров запроса
Объект "Запрос" имеет метод "УстановитьПараметр", с помощью которого в запрос передаются значения параметров. Параметры запроса обычно используются в условиях отбора (конструкции ГДЕ, ИМЕЮЩИЕ) или в качестве параметров вызова виртуальных таблиц. В тексте запроса параметры обозначаются знаком "&" (например, параметр "ВыбГруппа" в первом запросе).
В качестве параметров используются значения, которые указываются пользователем в диалоге или значения типов, для которых нет литералов, например, пустых ссылок на элементы справочников. Литералы же есть только у примитивных типов данных, а именно, число, строка, дата, булево, Null, Неопределено.
НашЗапрос
3. Выполнение запроса
После присвоения текста и установки параметров, запрос запускается на выполнение с помощью метода "Выполнить()" объекта "Запрос". Этот метод возвращает другой объект "РезультатЗапроса", содержащий выбранные данные из базы данных.
Копировать в буфер обмена
РезультатЗапроса
Далее возможны три варианта:
- во-первых, из результата запроса может быть получена выборка (линейная, иерархическая и т.д.),
- во-вторых, результат запроса может быть выгружен в таблицу или дерево значений,
- в-третьих, результат запроса может являться источником данных для сводной таблицы.
4. Получение выборки из результата запроса
Объект "РезультатЗапроса" имеет метод "Выбрать()", который возвращает новый объект "ВыборкаИзРезультатаЗапроса". В зависимости от параметра метода "Выбрать()" выборка будет линейной (по умолчанию), иерархической или по группировкам. Далее выборка обходится с помощью цикла "Пока Выборка.Следующий() Цикл", а в теле цикла производятся какие-то действия, например, вывод областей в табличный документ.
Копировать в буфер обмена
Выборка Сообщить 5. Выгрузка результата запроса в таблицу или дерево значений
Объект "РезультатЗапроса" имеет метод "Выгрузить()", который возвращает таблицу значений или дерево значений, в зависимости от переданного параметра . Если устанавливается прямой тип обхода (по умолчанию), то будет создана таблица значений, иначе — дерево значений. Далее таблица значений (дерево значений) может быть обработана средствами встроенного языка или показана пользователю в табличном поле.
ТабЗнач ДеревоЗнач
6. Формирование сводной таблицы
Результат запроса может быть использован как источник данных для сводной таблицы. При этом итоги (см. предложение ИТОГИ в тексте запроса) становятся ресурсами (отображаются в области данных), а группировочные поля, по которым они подсчитываются, становятся измерениями сводной таблицы. В качестве источника данных для сводной таблицы может быть также использован объект "ПостроительОтчета", но ему на вход тоже подается запрос, поэтому можно сказать, что основа любой сводной таблицы — это запрос к базе данных.
ТД СводнаяТаблица
Резюме
- Язык запросов 1С:Предприятия 8 значительно изменился по сравнению с версией 7.7 и стал похож на стандартный SQL.
- Для работы с запросами применяются программные объекты типа Запрос, РезультатЗапроса и ВыборкаИзРезультатаЗапроса.
- В запросе могут быть использованы параметры, которые нужно явно передавать в запрос с помощью метода УстановитьПараметр() объекта "Запрос".
- При выполнении запроса мы получаем объект типа "РезультатЗапроса", из которого обычно производится выборка.
- Результат запроса может быть также выгружен в таблицу / дерево значений или использован для формирования сводной таблицы.
Выборка 1С
Выборка 1С – это специальный объект в 1С 8.3, который позволяет перебрать элементы справочников, документов и прочих объектов, имеющих такую возможность.
Для создания выборки справочника следует использовать методы менеджера справочника Выбрать и ВыбратьИерархически (только для справочников с иерархией), а для создания выборки документов – Выбрать.
Выборка = Документы.ПродажаТоваров.Выбрать();
Выборка = Справочники.Контрагенты.Выбрать();
Для простой выборки.
Выборка = Справочники.Регионы.ВыбратьИерархически();
Для иерархической выборки.
Поскольку выборка это объект, предназначенный для перебора элементов, то для выполнения перебора элементов следует делать обход выборки. Обход выборки осуществляется при помощи цикла. Обход выборки осуществляется динамически, это значит, что при создании выборки не все элементы выбираются сразу из базы данных, а получение элементов происходит порциями, частями. Для обхода используется метод выборки Следующий. Этот метод возвращает Истина, когда следующий элемент выбран, и Ложь, когда достигнут конец выборки.
Обойти выборку документов можно так:
Выборка = Документы.ПродажаТоваров.Выбрать(); Пока Выборка.Следующий() Цикл КонецЦикла;
А справочников, соответственно так:
Выборка = Справочники.Контрагенты.Выбрать(); Пока Выборка.Следующий() Цикл КонецЦикла;
В процессе обхода выборки, мы можем обращаться напрямую ко всем реквизитам того объекта, который выбран на текущей итерации.
Выборка = Справочники.Контрагенты.Выбрать(); Пока Выборка.Следующий() Цикл Сообщить("Наименование: " + Выборка.Наименование + ",ИНН: " + Выборка.ИНН + ",КПП: " + Выборка.КПП); КонецЦикла;
В результате, выведется информация обо всех контрагентах.

Поскольку, Контрагенты иерархический справочник, то в выборке присутствуют и группы, и элементы.
Мы не можем получить выборку только элементов или групп, поэтому, чтобы вывелись только элементы, необходимо воспользоваться стандартным реквизитом справочника ЭтоГруппа, этот реквизит имеет значение Истина, когда элемент является группой, и Ложь – когда просто элемент.
Можно код выше исправить следующим образом:
Выборка = Справочники.Контрагенты.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ЭтоГруппа Тогда Продолжить; КонецЕсли; Сообщить("Наименование: " + Выборка.Наименование + ",ИНН: " + Выборка.ИНН + ",КПП: " + Выборка.КПП); КонецЦикла;
Тогда выведутся только элементы.

У метода менеджера справочника Выбрать существует четыре необязательных параметра.
Выбрать(Родитель>,Владелец>,Отбор>,Порядок>)
Первый параметр позволяют формировать выборку элементов с указанным родителем, а второй с указанным владельцем. Третий параметр имеет тип Структура и позволяет отбирать элементы по определённому условию.
Например, у справочника Контрагенты имеется реквизит ТипКонтрагента, который имеет тип ссылка на перечисление ТипыКонтрагентов.

У этого перечисления два значения Покупатель и Поставщик. Если требуется, чтобы выборка выше выводила только покупателей, то следует создать структуру с единственным ключом, название которого должно совпадать с названием реквизит справочника, а в значение структуры указать нужное значение перечисления.
Отбор = Новый Структура("ТипКонтрагента",Перечисления.ТипыКонтрагентов.Покупатель); Выборка = Справочники.Контрагенты.Выбрать(,,Отбор); Пока Выборка.Следующий() Цикл Сообщить("Наименование: " + Выборка.Наименование + ",ИНН: " + Выборка.ИНН + ",КПП: " + Выборка.КПП); КонецЦикла;
В этом случае будут отобраны только контрагенты-покупатели.

Обратите внимание, что в случае установки отбора нет смысла отсекать группы. Они не попадут в выборку, поскольку этот реквизит у них не заполнен.
Также, имейте в виду, что отбор можно производить только по стандартным реквизитам Наименование, Код, а также по тем реквизитам, у которых в свойстве Индексировать установлено значение Индексировать или Индексировать с доп. Упорядочиванием.
Иерархическая выборка справочников 1С
По мимо обычной выборки справочников при помощи метода менеджера справочника Выбрать, можно производить иерархическую выборку при помощи метода ВыбратьИерархически. Чем отличается простая выборка справочника от иерархической? Разберем простой пример. Выведем в таблицу значений на форме элементы и группы справочника номенклатуры обычной выборкой, а потом иерархической.

Для обычной выборки будет следующий код:
Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл НовСтр = ТЗНоменклатура.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр,Выборка); КонецЦикла;
И следующий результат:

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

А теперь посмотрим, как будут выведены группы и элементы при иерархической выборке.
Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл НовСтр = ТЗНоменклатура.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр,Выборка); КонецЦикла;
Получится следующий результат:

Элементы вывелись в иерархическом порядке. Иерархическая выборка перебирает элементы следующем образом: сначала выбирается элемент самого верхнего уровня, потом если это группа, то отбирается элемент, который входит в эту группу и т.д.
А если мы воспользуемся методом выборки справочников УровеньВВыборке, то сможем увидеть порядок вложенности.
Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл НовСтр = ТЗНоменклатура.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр,Выборка); НовСтр.Уровень = Выборка.УровеньВВыборке() КонецЦикла;
Будет следующий результат:

Где 0 – самый высший уровень (элемент или группа не входят ни в какие группы), 1 – следующий уровень (элемент или группа входят в группу высшего уровня) и т.д.
При иерархической выборке также можно сделать отбор, но будут выбраны только элементы верхнего уровня, поскольку группы отобраны не будут (у них этот реквизит не заполнен), а если группы не отобраны, то и элементы других уровней тоже не будут выбраны, даже если они подходят по условию.
Метод ПолучитьОбъект выборки
Выборка возвращает только ссылку на объект, сам объект мы изменять не можем. Мы можем обратиться к экземпляру объекта отобранной выборкой ссылкой, если воспользуемся методом ПолучитьОбъект().
Например, в этом коде пытаемся всем элементам справочника Номенклатура с видом Товары, обнулить этот вид, присвоив пустую ссылку перечисления.
Выборка = Справочники.Номенклатура.Выбрать(,,Отбор); Пока Выборка.Следующий() Цикл ОбъектСправочник = Выборка.ПолучитьОбъект(); ОбъектСправочник.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.ПустаяСсылка(); Попытка ОбъектСправочник.Записать(); Исключение Сообщить("Не удалось изменить вид"); КонецПопытки; КонецЦикла;
Для записи элемента использовалась попытка.
Читайте также по теме:
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
И вступайте в мои группы:
Выборка в запросе 1С
Доброго времени суток, дорогие коллеги! В данной статье я бы хотел рассказать о том, как делать выборки в запросах 1С. Дочитав этот материал, вы научитесь определять рабочие методы для выборок, а также ознакомитесь с первоначальными значениями выборок в 1С. Все описанное далее будет проиллюстрировано примерами для большей наглядности. Приятного чтения!
Выборка в системе 1С – это специальный метод по перебору данных, состоящий из методичной установки выделения на последней записи.
Для получения выборки нужно воспользоваться выводами запросов, либо менеджером объектов, где объектом может быть справочник или документ.
2. Примеры создания выборок
Итак, как создавать выборку данных? Делается это при помощи объектного менеджера, который продемонстрирован на скриншоте ниже:
Рис. 1 Как создать выборку данных при помощи объектного менеджера?
Далее рассмотрим аналогичный пример, но с созданием выборки данных, как показано на программном коде далее:
Рис. 2 Создание выборки данных с помощью кода
В обоих примерах создания выборки были использованы одни и те же данные по перебору, и оба способа являются рабочими. Разработчик в праве использовать любой, из более удобного для него, на дальнейшую работу это влиять не будет.
3. Методы для выборок данных
Рассмотрим перечень того, какие существуют методы для выборок данных, которые являются актуальными для выборок в 1С 8.3:
· «Выбрать()» – данный метод помогает получить саму выборку, из одной выборки можно делать ещё выборки, подчинённые первой, если указать параметр «при помощи группировок»;
· «Владелец()» – этот метод для выборок данных является противоположным для метода «Выбрать()», при помощи него можно одержать первоначальную выборку в конкретном запросе;
· «Следующий()» – метод, который предназначен для перевода выделения на последующую строку с записью. В случае, когда запись есть, метод будет возвращать значение «Истина», в противном случае – значение «Ложь»;
· «НайтиСледующий()» – данный метод отбора выборок осуществляет перебор лишь по необходимым полям, согласно значению, по которому будет осуществлён отбор, который из себя представляет структуру полей;
· «СледующийПоЗначениюПоля()» – при помощи этого метода можно получать последующую запись, у которой значение разнится с предыдущей. (например, сделать перебор всех возможных записей, которые имеют единственное значение в поле «Контрагент», в скобках будет находится «Контрагент»);
· «Сбросить()» – этот метод служит для сброса текущего расположения выделения и установления выделения на первоначальную позицию;
· «Количество()» – помогает вернуть первоначальное число записей из выборки;
· «Получить()» – данный метод отбора выборок выбирает запись, согласно индексу, который ей присвоен;
· «Уровень()» – метод, который отображает иерархический уровень выбранной записи, – возвращает некоторое число;
· «ТипЗаписи()» – метод для вывода одного, из четырёх возможных, типов для записи: детальная, итоговая по группировкам, итоговая иерархически, общая итоговая;
· «Группировка()» – данный метод служит для возврата наименования последней группировки, для случая, когда запись не служит группировкой – будет возвращена пустая строка.
В данной статье было рассмотрено понятие выборки для запросов в 1С, был приведён пример по программному осуществлению данной процедуры, а также определены возможные методы по регулированию выборок для 1С 8.3.
Специалист компании «Кодерлайн» Айдар Фархутдинов
Как сделать выборку в 1С 8.3

В своем коде разработчикам 1С приходится обращаться к базе данных, получать оттуда информацию и работать с ней. Операцию работы с результатом запроса данных из БД называют «выборкой». Для успешной работы и написания оптимального кода необходимо понимать, как нужно работать с запросом и полученными данными. Также важно запомнить основные инструменты платформы, используемые для выборки.
Синтаксис выборки 1С 8.3 и работа с ее результатом
Чаще всего в конфигурациях 1С можно встретить два варианта получения выборки для работы с ней:
Используя запрос. Программист 1С пишет запрос на языке 1С, выполняет его и получает результат запроса – таблицу с данными. Методом "Выбрать()" выбираются данные из полученного результата;
ЗапросДанных = Новый Запрос("Выбрать ссылка Из Справочник.Валюта"); ВыборкаДанных = ЗапросДанных.Выполнить().Выбрать();
ВыборкаДанных = Справочники.Валюта.Выбрать();
В обоих случаях, чтобы получить выборку из документов или справочников, необходимо использовать метод «Выбрать()». В результате в переменную «ВыборкаДанных» помещаются данные типа «ВыборкаИзРезультатаЗапроса». Это таблица, в которой содержаться все поля, перечисленные в запросе, использующая индексы. После этого с ними можно работать, используя различные методы данного типа данных:
Владелец() – возвращает результат запроса, из которого и была сформирована полученная выборка;
Следующий() – позволяет последовательно перебрать все записи выборки, перемещая указатель на следующую строку. Чаще всего используется, так как позволяет выполнять определенные действия со всеми выбранными записями в цикле. Будьте аккуратны и не допускайте выполнения запросов в цикле;
Пока Выборка.Следующий() Цикл //действия с 1 записью из выборки КонецЦикла;
НайтиСледующий(УсловияПоиска) – позволяет отобрать из выборки только те записи,
которые удовлетворяют условию поиска. УсловияПоиска – переменная типа
«Структура», содержащая имена полей и нужные значения;
СтуктураПоиска = Новый Структура("Наименование"); СтуктураПоиска.Наименование = НужноеНаименование; Пока Выборка.НайтиСледующий(СтуктураПоиска) Цикл //действия с записью из выборки КонецЦикла;
СледующийПоЗначениюПоля(ИмяПоля) – позволяет перебирать записи только с уникальными значениями конкретного поля, указанного в параметре;
Сбросить() – позволяет в процессе перебора результата выборки вернуться к верхней записи;
Количество() – метод показывает сколько записей получилось в результате выборки из результата запроса;
КоличествоЗаписей = Выборка.Количество();
Получить(ЧислоИндекса) – команда возвращает запись с заданным индексом в качестве параметра;
Выбрать(ТипОбхода) – применяется в том случае, если в качестве параметра указан обход «По группировкам». Стандартно применяется тип "Прямой", в случае получения результатов запроса с 1 группировкой применяют "ПоГруппировкам". Если же группировок несколько, то выбирайте "ПоГруппировкамСИерархией";
ВыборкаДанных = ВыборкаДанных.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Уровень() – показывает в виде числа уровень в иерархии;
ТипЗаписи() – возвращает тип текущей записи;
Группировка() – метод получает имя группировки, если это простая запись – пустую строчку.

Выборка из результатов запроса применяется в подавляющем большинстве случаев, но иногда удобнее работать с таблицей результатов. Если нужны сразу все данные, лучше использовать не метод «Выбрать()», а «Выгрузить()». В результате в переменной оказываются данные с типом ТаблицаЗначений, где вы сможете найти сразу все данные.
ВыборкаДанных = ЗапросДанных.Выполнить().Выгрузить();
Вы сможете сортировать полученную таблицу, сравнивать различные строки, осуществлять поиск одинаковых элементов и многое другое. Также вы можете и выбирать построчно данные из этого типа данных с помощью обхода строк в цикле:
Для каждого строка из ВыборкаДанных цикл ///операторы работы с 1 строчкой из таблицы значений КонецЦикла;
В случае пакетного запроса используемые методы немного отличаются. После написания запроса необходимо использовать метод «ВыполнитьПакет()». В результате в переменной будет массив результатов запросов. В дальнейшем с помощью операторов «Выбрать()» или «Выгрузить()» можно получить выборку из результатов запроса. Помните, что индексы массива начинаются с 0.
МассивРезультатовЗапросов = Запрос.ВыполнитьПакет(); ВыборкаДанныхЗапроса1 = МассивРезультатовЗапросов [0].Выбрать(); ВыборкаДанныхЗапроса2 = МассивРезультатовЗапросов [1].Выгрузить();
Запомните суть методов, так как их синтаксис вы всегда сможете найти во встроенном помощнике 1С. Большинство методов применяется в случае сложных запросов с группировками. Чаще всего разработчики 1С 8.3 обходятся простым обходом выборки с помощью метода Следующий(). Но дополнительные возможности платформы необходимо знать и использовать их в нужный момент. Если у вас остались вопросы, обращайтесь к нашим специалистам за консультацией по программам 1С. Мы с радостью вам поможем!