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

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

Как сделать выборку в 1С: практическое руководство

Как сделать выборку данных в 1С: запросы с отборами, СКД, динамические списки и настройки отчётов. Примеры кода, типичные ошибки и проверка результата.

Выборка в 1С — это получение подмножества данных из информационной базы по заданным условиям. В зависимости от задачи выборка делается четырьмя основными способами: запросом на встроенном языке с конструкцией ВЫБРАТЬ, настройкой отбора в динамическом списке или отчёте на СКД, методами объекта (например, Выбрать() у справочников и документов) и пользовательскими отборами в формах списков. Правильный выбор способа определяет скорость работы, удобство поддержки кода и нагрузку на сервер.

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

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

Выборка запросом: конструкция ВЫБРАТЬ с условием ГДЕ

Запрос — основной инструмент выборки в 1С. Он выполняется на сервере СУБД, поэтому быстро обрабатывает большие объёмы. Минимальный запрос с отбором выглядит так: указываются поля, источник данных и условие в секции ГДЕ.

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

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

"ВЫБРАТЬ

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

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

|ИЗ

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

|ГДЕ

| Номенклатура.Родитель = &Группа

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

Запрос.УстановитьПараметр("Группа", ГруппаТоваров);

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

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

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

// обработка строки выборки

КонецЦикла;

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

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

Отборы в динамических списках и формах списков

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

ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = ТекущаяОрганизация;

ЭлементОтбора.Использование = Истина;

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

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

Выборка в отчётах на СКД

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

Чтобы поле было доступно для отбора, его нужно добавить на закладку «Настройки» схемы компоновки или разрешить отбор по нему в настройках поля набора данных. Отбор по параметрам виртуальных таблиц (период регистра накопления, измерения) задавайте в самом запросе набора данных через параметры — СКД автоматически вынесет их в настройки отчёта.

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

Сравнение способов выборки

Запрос (ВЫБРАТЬ)

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

Динамический список

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

СКД

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

Метод Выбрать()

Простой обход объектов без запроса. Медленнее и без сложных условий — только для простых сценариев.

Метод Выбрать() у объектов: когда он уместен

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

Отбор = Новый Структура("Организация", ТекущаяОрганизация);

Выборка = Документы.РеализацияТоваровУслуг.Выбрать(НачалоМесяца(Дата), КонецМесяца(Дата), Отбор);

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

// Выборка.Ссылка — ссылка на документ

КонецЦикла;

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

Проверка результата выборки

После выполнения выборки убедитесь, что она вернула осмысленный результат, прежде чем строить на нём дальнейшую логику. Пустая выборка — не всегда ошибка, но код должен корректно обрабатывать этот случай.

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

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

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

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

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

Результат.Пустой() = Ложь, строки соответствуют условию

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

Пусто при заведомо существующих данных — проверить типы параметров и период

Отбор динамического списка
Норма

Список показывает только нужные записи, условие одно

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

Дубли условий в отборе, список пуст или не реагирует на изменение

Отбор в отчёте СКД
Норма

Отчёт формируется, итоги сходятся с данными базы

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

Отбор не применяется — поле недоступно в настройках или задано дважды

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

Выборка выполняется без заметной паузы

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

Долгое выполнение — условия не в запросе, а в цикле после выборки

Типичные ошибки и ограничения

Первая группа ошибок связана с производительностью: выборка всех записей без условий, фильтрация в цикле вместо секции ГДЕ, выборка лишних полей («ВЫБРАТЬ *» по смыслу), обращение к реквизитам через точку в больших выборках. Каждое обращение через точку — это скрытое соединение с другой таблицей, и на больших объёмах такие запросы заметно тормозят.

Вторая группа — ошибки логики. Несовпадение типов параметра и поля (например, передача строки вместо ссылки) приводит к пустому результату без сообщения об ошибке. Отбор по дате без учёта времени отсекает документы внутри дня — используйте КонецДня() или конструкцию МЕЖДУ. Условие по пометке удаления легко забыть, и тогда в выборку попадают удалённые объекты.

Третья группа — ошибки с правами. Под пользователем с ограниченными правами выборка может вернуть меньше данных, чем под администратором, из-за RLS (ограничения доступа на уровне записей). Если отчёт «не видит» часть данных у конкретного пользователя, проверяйте его роли, а не текст запроса.

Типичные ошибки
01
Фильтрация в цикле вместо ГДЕ — выбираются все записи, база тормозит и растут блокировки
02
Подстановка значений в текст запроса строкой вместо параметров — ошибки типов и риск некорректного выполнения
03
Отбор по дате без КонецДня() — теряются документы, проведённые в течение последнего дня
04
Дублирование элементов отбора в динамическом списке — противоречивые условия дают пустой список
05
Игнорирование пометки удаления — в выборку попадают помеченные на удаление объекты
06
Проверка только под администратором — у рядовых пользователей RLS скрывает часть данных

Как выбрать подходящий способ

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

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

Как выбрать действие

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

При сомнениях начинайте с запроса в консоли запросов: соберите текст, проверьте результат на реальных данных, оцените время выполнения — и только потом переносите в код или схему компоновки. Такой порядок экономит время отладки и позволяет заранее увидеть проблемы с производительностью.

Итог

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

Основной инструмент выборки в 1С — запрос с условиями в секции ГДЕ и параметрами. Для пользовательских отборов применяйте динамические списки и СКД, метод Выбрать() — только для простых обходов. Условия задавайте на уровне запроса, проверяйте типы параметров, границы дат и результат на копии базы.

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

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

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

Почему запрос с условием возвращает пустой результат?

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

Как сделать отбор по нескольким значениям одного поля?

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

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

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

Безопасно ли выполнять запросы в рабочей базе?

Запросы на чтение не изменяют данные, но тяжёлый запрос без отборов может надолго заблокировать таблицы и замедлить работу пользователей. Отладку выполняйте на копии базы, ограничивайте выборку условиями и периодом, а в коде обработок учитывайте, что запрос выполняется в транзакции и может конфликтовать с параллельными сеансами.

Что делать, если выборка работает медленно?

Сначала убедитесь, что все условия находятся в секции ГДЕ, а не в цикле после выборки. Затем уберите лишние поля, замените обращения через точку соединениями или предварительной выборкой ссылок, проверьте отбор по индексированным полям. Для виртуальных таблиц регистров задавайте параметры периода и измерений в параметрах таблицы — это самый эффективный способ сократить объём обрабатываемых данных.