К статье
Практический материал

Разработка и Конфигурация · 12 мин

Что такое выборка в 1С и как с ней работать

Что такое выборка в 1С, как работает ВыборкаИзРезультатаЗапроса, способы обхода данных, примеры кода, типичные ошибки и рекомендации по производительности.

Выборка в 1С — это набор строк данных, полученный из информационной базы в результате выполнения запроса, и одновременно объект встроенного языка, который позволяет последовательно обойти эти строки в коде. Термин используется в двух смыслах: как результат запроса к базе данных и как программный объект «ВыборкаИзРезультатаЗапроса», через который разработчик читает полученные записи по одной.

На практике выборка — основной способ программно получить данные из справочников, документов, регистров и других объектов конфигурации. Без неё невозможно построить отчёт, выполнить обработку данных, выгрузку или массовую операцию. Понимание того, как формируется выборка, как её обходить и когда она вредит производительности, — базовый навык разработчика и внедренца 1С.

Ниже разобраны механика работы выборки, способы её получения, варианты обхода, ограничения и типичные ошибки, которые приводят к медленной работе и лишней нагрузке на сервер.

Что такое выборка и где она встречается в 1С

В контексте 1С слово «выборка» применяется в трёх близких значениях. Первое — результат SQL-подобного запроса к информационной базе: набор строк, отобранных по заданным условиям. Второе — программный объект, который возвращает метод Выбрать() результата запроса и позволяет перемещаться по строкам. Третье — разговорное обозначение любого подмножества данных, например «выборка документов за период».

Выборки встречаются практически в каждом механизме платформы: в отчётах на СКД, в обработках загрузки и выгрузки, в проведении документов (когда нужно получить остатки или обороты), в регламентных заданиях. Даже обычный динамический список в форме — это, по сути, выборка, которую платформа формирует и отображает автоматически.

Как получить выборку через запрос

Стандартный путь получения выборки состоит из четырёх шагов: создать объект «Запрос», задать текст на языке запросов 1С, при необходимости установить параметры, выполнить запрос и вызвать у результата метод Выбрать(). Минимальный пример выглядит так:

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

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления";

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

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

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

Сообщить(Выборка.Наименование);

КонецЦикла;

Метод Следующий() переводит указатель на следующую строку и возвращает «Истина», пока строки не закончились. К значениям полей текущей строки обращаются по имени через точку (Выборка.Наименование) или по индексу. Если запрос вернул ноль строк, цикл просто не выполнится ни разу — это нормальная ситуация, а не ошибка.

Параметры запроса задаются через Запрос.УстановитьПараметр("Имя", Значение). Всегда используйте параметры вместо подстановки значений прямо в текст запроса: это безопаснее, исключает ошибки форматирования дат и строк и позволяет платформе повторно использовать скомпилированный запрос.

Порядок получения выборки
  1. 1
    Создайте объект Запрос и напишите текст на языке запросов
  2. 2
    Установите параметры через УстановитьПараметр()
  3. 3
    Вызовите Выполнить() и проверьте результат методом Пустой()
  4. 4
    Вызовите Выбрать() и обойдите строки циклом Пока Выборка.Следующий()
  5. 5
    Проверьте результат на тестовых данных: количество строк и значения полей

Способы обхода выборки: линейный, по группировкам, по группировкам с иерархией

Метод Выбрать() принимает необязательный параметр — тип обхода результата. От него зависит структура выборки и то, какие строки вы увидите в цикле.

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

Обход по группировкам

Если в запросе есть итоги (конструкция ИТОГИ ПО), можно получить выборку по группировкам: РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам). Такая выборка содержит строки итогов по указанным полям, а у каждой строки можно вызвать вложенный Выбрать() и получить детальные записи внутри группы. Это удобно для отчётов вида «клиент — его документы».

Обход по группировкам с иерархией

Вариант ПоГруппировкамСИерархией применяется для иерархических справочников и запросов с ИТОГИ ПО ... ТОЛЬКО ИЕРАРХИЯ или итогами по иерархическому полю. Выборка тогда отражает древовидную структуру: родительские элементы и вложенные подчинённые уровни. Ошибка в выборе типа обхода — частая причина «пустых» или неожиданных результатов: если запрос содержит иерархические итоги, а обход выбран прямой, структура дерева будет потеряна.

Сравнение типов обхода

Прямой (по умолчанию)

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

По группировкам

Строки итогов по полям из ИТОГИ ПО, с возможностью вложенного обхода деталей. Подходит для отчётов с группировкой.

По группировкам с иерархией

Древовидная структура для иерархических справочников. Требует корректного текста запроса с итогами по иерархии.

Выборка без кода: консоль запросов и отчёты

Для разовой задачи «посмотреть данные» писать код не обязательно. Консоль запросов (внешняя обработка, широко используемая разработчиками и аналитиками) позволяет написать текст запроса, выполнить его и увидеть выборку в табличном виде. Это самый быстрый способ проверить, какие строки вернёт запрос, до того как встраивать его в код.

В типовых конфигурациях аналогичную роль играют универсальные отчёты и отчёты на СКД: пользователь задаёт отборы, а система компоновки сама формирует запрос и получает выборку. Если задача — просто отобрать документы или товары по условию и показать их пользователю, отчёт на СКД часто предпочтительнее программной выборки: не нужно писать код, а пользователь получает настройки отборов и группировок.

Маршрут решения

Как выбрать инструмент

Нужно разово посмотреть или проверить данныеИспользуйте консоль запросов или универсальный отчёт — код не требуется
Нужен регулярный отчёт с гибкими отборами для пользователейСделайте отчёт на СКД — платформа сама построит выборку
Нужно обработать данные программно: изменить, выгрузить, рассчитатьПишите запрос и обходите выборку в коде
Нужна одна запись по известной ссылкеВыборка не нужна — обращайтесь к объекту через ссылку напрямую

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

Выборка сама по себе не нагружает систему — нагрузку создаёт запрос, который её формирует, и объём возвращаемых данных. Типичные причины медленной работы: отсутствие отбора по индексированным полям, выбор всех полей вместо нужных, соединения без условий, получение миллионов строк там, где достаточно агрегатных итогов.

Отдельная опасность — запросы в цикле. Если внутри обхода одной выборки для каждой строки выполняется ещё один запрос, время работы растёт кратно. Правильный подход — получить все нужные данные одним запросом с соединением или пакетным запросом и обойти результат один раз. Для проверки того, что именно выполняется, используйте технологический журнал или замеры производительности в конфигураторе.

Ещё одно ограничение: выборка — это «моментальный снимок» данных на время выполнения запроса. Если в транзакции вы изменили записи после выполнения запроса, выборка этих изменений не увидит. Для контроля остатков при проведении документов учитывайте это и при необходимости используйте блокировки данных, чтобы параллельные сеансы не изменили строки между чтением и записью.

Типичные ошибки при работе с выборкой

Ошибки с выборками делятся на три группы: логические (получены не те данные), технические (код падает) и ошибки производительности. Ниже — самые распространённые.

Типичные ошибки
01
Обращение к полю, которого нет в запросе: попытка прочитать Выборка.Количество, когда поле не выбрано, вызывает ошибку. Добавьте поле в текст запроса.
02
Проверка результата через количество строк вместо метода Пустой(): лишнее действие и риск неверной логики. Используйте РезультатЗапроса.Пустой().
03
Запрос внутри цикла обхода: резкое падение производительности. Замените на соединение или пакетный запрос.
04
Выбор всех полей и всех строк без отбора: лишний трафик и память. Ограничьте список полей и добавьте условия ГДЕ.
05
Конкатенация значений в текст запроса вместо параметров: ошибки форматирования и уязвимости. Используйте УстановитьПараметр().
06
Ожидание актуальных данных из выборки после изменения базы в той же транзакции: выборка — снимок на момент выполнения запроса.

Отдельно стоит упомянуть работу с нумерацией и порядком: если порядок строк важен (например, для нумерации или последовательной обработки документов), его нужно явно задать конструкцией УПОРЯДОЧИТЬ ПО. Без неё порядок строк не гарантирован и может меняться между выполнениями одного и того же запроса.

Как проверить, что выборка сформирована правильно

Прежде чем встраивать запрос в рабочий код, проверьте его в консоли запросов на реальных данных: совпадает ли количество строк с ожидаемым, не появились ли дубли из-за соединений, заполнены ли поля. Дубли строк — классический признак соединения с таблицей, где на одну запись приходится несколько связанных (например, документ соединён с табличной частью без группировки).

В коде полезно добавить контрольные точки: вывести количество обработанных строк, залогировать первые несколько значений, сравнить итоговые суммы с отчётом по тем же данным. Если выборка используется для изменения данных, сначала выполните обход в режиме «только чтение» и зафиксируйте, какие объекты будут затронуты.

Контрольные точки

Как проверить результат

Количество строк
Норма

Совпадает с ожидаемым по данным или отчёту

Тревожный признак

Строк больше из-за дублей соединений или сильно меньше из-за лишних отборов

Значения полей
Норма

Поля заполнены, типы соответствуют ожиданиям

Тревожный признак

NULL в полях, которые должны быть заполнены, — проверьте соединения и отборы

Скорость выполнения
Норма

Запрос выполняется за приемлемое время на рабочем объёме данных

Тревожный признак

Заметная задержка — проверьте индексацию полей отбора и отсутствие запросов в цикле

Порядок строк
Норма

Стабильный порядок при наличии УПОРЯДОЧИТЬ ПО

Тревожный признак

Порядок меняется между запусками — добавьте сортировку

Итог

Что важно запомнить

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

Частые вопросы о выборке в 1С

Чем выборка отличается от таблицы значений?

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

Можно ли изменить данные базы через выборку?

Нет, выборка предназначена только для чтения. Чтобы изменить объект, получите из выборки ссылку, вызовите у неё метод ПолучитьОбъект(), измените реквизиты и запишите объект. Учитывайте, что массовое создание объектов в цикле требует памяти и времени — для больших объёмов стоит разбивать работу на порции.

Что делать, если выборка возвращает NULL в полях?

Значение NULL появляется при левых соединениях, когда связанной записи не нашлось, либо при обращении к реквизитам через разыменование отсутствующего объекта. Проверьте тип соединения и условия связи в запросе. В коде обрабатывайте NULL конструкцией языка запросов ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) или проверкой в цикле обхода.

Как узнать количество строк в выборке?

У объекта выборки нет свойства «количество». Варианты: посчитать строки в самом запросе агрегатной функцией КОЛИЧЕСТВО, выгрузить результат в таблицу значений и проверить её размер, либо посчитать строки в цикле обхода. Для простой проверки «есть ли хоть одна строка» используйте метод Пустой() у результата запроса — это быстрее и нагляднее.

Что такое пакетный запрос и как с ним связана выборка?

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

Почему обход выборки по группировкам возвращает меньше строк, чем ожидалось?

При обходе по группировкам выборка верхнего уровня содержит только итоговые строки по полям, указанным в ИТОГИ ПО, а детальные записи доступны через вложенный вызов Выбрать() у каждой строки группировки. Если нужны сразу все детальные строки, либо используйте прямой обход, либо организуйте вложенные циклы по уровням группировок.