Разработка и Конфигурация · 12 мин
Как сделать выборку в 1С: практическое руководство
Как сделать выборку данных в 1С: запросы с отборами, СКД, динамические списки и настройки отчётов. Примеры кода, типичные ошибки и проверка результата.
Выборка в 1С — это получение подмножества данных из информационной базы по заданным условиям. В зависимости от задачи выборка делается четырьмя основными способами: запросом на встроенном языке с конструкцией ВЫБРАТЬ, настройкой отбора в динамическом списке или отчёте на СКД, методами объекта (например, Выбрать() у справочников и документов) и пользовательскими отборами в формах списков. Правильный выбор способа определяет скорость работы, удобство поддержки кода и нагрузку на сервер.
Главная ошибка начинающих — выбирать все данные целиком и потом фильтровать их в цикле. Такой подход работает на маленьких базах, но на реальных объёмах приводит к зависаниям и блокировкам. Правильный принцип: условия отбора должны выполняться на уровне запроса к базе данных, а не в коде после получения результата.
Ниже разобраны все четыре подхода с примерами кода, условиями применения, ограничениями и способами проверить, что выборка вернула именно то, что нужно.
Выборка запросом: конструкция ВЫБРАТЬ с условием ГДЕ
Запрос — основной инструмент выборки в 1С. Он выполняется на сервере СУБД, поэтому быстро обрабатывает большие объёмы. Минимальный запрос с отбором выглядит так: указываются поля, источник данных и условие в секции ГДЕ.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Родитель = &Группа
| И НЕ Номенклатура.ПометкаУдаления";
Запрос.УстановитьПараметр("Группа", ГруппаТоваров);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// обработка строки выборки
КонецЦикла;
Обратите внимание на параметр &Группа: значения в условия передаются только через параметры запроса, а не конкатенацией строк. Это защищает от ошибок с типами данных и от потенциальной подмены текста запроса. Метод Выбрать() возвращает выборку для построчного обхода, а Выгрузить() — таблицу значений, если нужен произвольный доступ к строкам.
Для отбора по списку значений используйте конструкцию В (&СписокЗначений) — параметром передаётся массив или список значений. Для отбора по периоду у виртуальных таблиц регистров задавайте параметры периода в фигурных скобках виртуальной таблицы, а не в секции ГДЕ — это существенно быстрее.
Отборы в динамических списках и формах списков
Когда нужно показать пользователю отфильтрованный список документов или элементов справочника, писать запрос вручную не обязательно. Динамический список на форме уже содержит запрос, а отбор добавляется программно через коллекцию элементов отбора.
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ТекущаяОрганизация;
ЭлементОтбора.Использование = Истина;
Перед добавлением отбора проверьте, нет ли уже элемента с таким же условием — иначе при каждом вызове обработчика отборы будут дублироваться, и список начнёт показывать пустой результат из-за противоречивых условий. Типичный приём: сначала пройти по существующим элементам отбора и обновить значение, а добавлять новый элемент только при его отсутствии.
Для простых сценариев пользователь может настроить отбор самостоятельно через кнопку «Ещё» → «Настроить список» в форме списка. Если задача решается штатными настройками, программная доработка не нужна — это снижает стоимость поддержки конфигурации.
Выборка в отчётах на СКД
Система компоновки данных (СКД) — стандартный способ строить отчёты с гибкими пользовательскими отборами. Разработчик описывает набор данных запросом, а пользователь в режиме предприятия сам добавляет отборы, группировки и сортировки, не трогая код.
Чтобы поле было доступно для отбора, его нужно добавить на закладку «Настройки» схемы компоновки или разрешить отбор по нему в настройках поля набора данных. Отбор по параметрам виртуальных таблиц (период регистра накопления, измерения) задавайте в самом запросе набора данных через параметры — СКД автоматически вынесет их в настройки отчёта.
Частая задача — установить отбор программно перед формированием отчёта, например при вызове отчёта из документа. Для этого используются настройки компоновщика: находится или создаётся элемент отбора по имени поля, задаётся вид сравнения и значение, затем отчёт формируется с этими настройками.
Сравнение способов выборки
Максимальная гибкость и скорость, соединения и итоги. Требует написания кода, не даёт пользователю менять отборы.
Отборы и поиск доступны пользователю в форме. Подходит для списков, но не для произвольной обработки данных.
Пользователь сам настраивает отборы и структуру отчёта. Сложнее в освоении, избыточна для простых задач.
Простой обход объектов без запроса. Медленнее и без сложных условий — только для простых сценариев.
Метод Выбрать() у объектов: когда он уместен
У справочников, документов, планов счетов и других объектных типов есть метод Выбрать(), возвращающий выборку ссылок. Он принимает необязательные параметры отбора (структура с полями) и порядка обхода.
Отбор = Новый Структура("Организация", ТекущаяОрганизация);
Выборка = Документы.РеализацияТоваровУслуг.Выбрать(НачалоМесяца(Дата), КонецМесяца(Дата), Отбор);
Пока Выборка.Следующий() Цикл
// Выборка.Ссылка — ссылка на документ
КонецЦикла;
Метод удобен для быстрого обхода по простому условию, но у него жёсткие ограничения: отбор возможен только по равенству реквизитов, нет соединений таблиц, нет итогов и группировок. Если нужно сравнение «больше», «в списке» или данные из нескольких таблиц — используйте запрос. Попытка эмулировать сложный отбор проверками внутри цикла по полной выборке — типичный источник проблем с производительностью.
Проверка результата выборки
После выполнения выборки убедитесь, что она вернула осмысленный результат, прежде чем строить на нём дальнейшую логику. Пустая выборка — не всегда ошибка, но код должен корректно обрабатывать этот случай.
Для запроса проверяйте Результат.Пустой() до начала обхода. Если выборка неожиданно пуста, проверьте в консоли запросов: совпадают ли типы параметров с типами полей (частая причина — строка вместо ссылки), не отсекает ли условие по пометке удаления нужные данные, корректны ли границы периода (начало и конец дня).
Для отборов в списках и СКД признаком проблемы служит пустая таблица при заведомо существующих данных. В этом случае откройте настройки отбора и проверьте, не накопились ли дублирующиеся или противоречивые условия, и не установлен ли флаг «Использование» у нужных элементов.
Как проверить результат
Результат.Пустой() = Ложь, строки соответствуют условию
Пусто при заведомо существующих данных — проверить типы параметров и период
Список показывает только нужные записи, условие одно
Дубли условий в отборе, список пуст или не реагирует на изменение
Отчёт формируется, итоги сходятся с данными базы
Отбор не применяется — поле недоступно в настройках или задано дважды
Выборка выполняется без заметной паузы
Долгое выполнение — условия не в запросе, а в цикле после выборки
Типичные ошибки и ограничения
Первая группа ошибок связана с производительностью: выборка всех записей без условий, фильтрация в цикле вместо секции ГДЕ, выборка лишних полей («ВЫБРАТЬ *» по смыслу), обращение к реквизитам через точку в больших выборках. Каждое обращение через точку — это скрытое соединение с другой таблицей, и на больших объёмах такие запросы заметно тормозят.
Вторая группа — ошибки логики. Несовпадение типов параметра и поля (например, передача строки вместо ссылки) приводит к пустому результату без сообщения об ошибке. Отбор по дате без учёта времени отсекает документы внутри дня — используйте КонецДня() или конструкцию МЕЖДУ. Условие по пометке удаления легко забыть, и тогда в выборку попадают удалённые объекты.
Третья группа — ошибки с правами. Под пользователем с ограниченными правами выборка может вернуть меньше данных, чем под администратором, из-за RLS (ограничения доступа на уровне записей). Если отчёт «не видит» часть данных у конкретного пользователя, проверяйте его роли, а не текст запроса.
Как выбрать подходящий способ
Выбор способа зависит от того, кто и как будет работать с выборкой. Если данные нужны внутри алгоритма — для проведения, обмена, расчёта — однозначно используйте запрос. Если пользователь должен сам управлять отборами в интерфейсе — берите динамический список или СКД. Метод Выбрать() оставьте для простых обходов в регламентных операциях, где условия примитивны.
Как выбрать действие
При сомнениях начинайте с запроса в консоли запросов: соберите текст, проверьте результат на реальных данных, оцените время выполнения — и только потом переносите в код или схему компоновки. Такой порядок экономит время отладки и позволяет заранее увидеть проблемы с производительностью.
Что важно запомнить
Основной инструмент выборки в 1С — запрос с условиями в секции ГДЕ и параметрами. Для пользовательских отборов применяйте динамические списки и СКД, метод Выбрать() — только для простых обходов. Условия задавайте на уровне запроса, проверяйте типы параметров, границы дат и результат на копии базы.
Частые вопросы о выборках в 1С
Чем выборка запроса отличается от таблицы значений?
Выборка (результат метода Выбрать()) — это последовательный поток строк: по ней можно идти только вперёд методом Следующий(). Таблица значений (результат метода Выгрузить()) загружается в память целиком и позволяет обращаться к строкам по индексу, искать, сортировать и сворачивать. Для построчной обработки больших объёмов выборка экономичнее по памяти; для произвольного доступа и дальнейших манипуляций удобнее таблица значений.
Почему запрос с условием возвращает пустой результат?
Наиболее частые причины: тип параметра не совпадает с типом поля (строка вместо ссылки), отбор по дате не учитывает время внутри дня, условие отсекает записи из-за пометки удаления или статуса, а также ограничения прав доступа (RLS) у текущего пользователя. Проверяйте текст запроса в консоли запросов, подставляя реальные значения параметров.
Как сделать отбор по нескольким значениям одного поля?
Используйте конструкцию В в секции ГДЕ: ГДЕ Товар В (&СписокТоваров), где параметром передаётся массив или список значений. В отборах динамических списков и СКД для этого служит вид сравнения «В списке». Перечислять условия через ИЛИ при большом числе значений не стоит — это ухудшает читаемость и план выполнения запроса.
Можно ли делать выборку без программирования?
Да. Пользователь может настроить отбор в любой форме списка через «Ещё» → «Настроить список», а в отчётах на СКД — через кнопку «Настройки». Для разовой аналитики подходят универсальные отчёты по справочникам и документам, если они включены в конфигурации. Программная выборка нужна, когда результат участвует в алгоритмах или требуются условия, недоступные в настройках.
Безопасно ли выполнять запросы в рабочей базе?
Запросы на чтение не изменяют данные, но тяжёлый запрос без отборов может надолго заблокировать таблицы и замедлить работу пользователей. Отладку выполняйте на копии базы, ограничивайте выборку условиями и периодом, а в коде обработок учитывайте, что запрос выполняется в транзакции и может конфликтовать с параллельными сеансами.
Что делать, если выборка работает медленно?
Сначала убедитесь, что все условия находятся в секции ГДЕ, а не в цикле после выборки. Затем уберите лишние поля, замените обращения через точку соединениями или предварительной выборкой ссылок, проверьте отбор по индексированным полям. Для виртуальных таблиц регистров задавайте параметры периода и измерений в параметрах таблицы — это самый эффективный способ сократить объём обрабатываемых данных.