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