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

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

Как создать выборку в 1С: пошаговое руководство

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

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

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

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

Что такое выборка и когда какой способ использовать

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

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

Сравнение способов получения выборки

Запрос с Выбрать()

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

СКД

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

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

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

Объектный метод Выбрать()

Простой обход элементов справочника или документов без соединений. Ограниченная фильтрация и сортировка.

Создание выборки запросом: базовый синтаксис

Основной инструмент — объект Запрос. Текст пишется на встроенном языке запросов, близком к SQL, но с русскими ключевыми словами. Минимальная выборка из справочника выглядит так:

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

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

"ВЫБРАТЬ

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

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

|ИЗ

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

|ГДЕ

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

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

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

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

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

КонецЦикла;

Ключевые моменты синтаксиса: секция ВЫБРАТЬ задаёт поля, ИЗ — источник данных с указанием типа таблицы (Справочник, Документ, РегистрСведений и т.д.), ГДЕ — условия отбора. Псевдонимы через КАК делают обращение к полям выборки читаемым.

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

Отбор данных: параметры и условия

Условия отбора задаются в секции ГДЕ. Значения сравнения правильно передавать через параметры, а не подстановкой в текст запроса: это исключает ошибки с типами данных и защищает от некорректного выполнения. Параметр объявляется символом & и заполняется методом УстановитьПараметр().

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

"ВЫБРАТЬ

| Реализация.Ссылка КАК Документ,

| Реализация.СуммаДокумента КАК Сумма

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Реализация

|ГДЕ

| Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода

| И Реализация.Контрагент = &Контрагент

| И Реализация.Проведен";

Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));

Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДатаСеанса()));

Запрос.УстановитьПараметр("Контрагент", ВыбранныйКонтрагент);

Для отбора по списку значений используйте оператор В (&СписокЗначений), передав массив или список значений. Для поиска по части строки — ПОДОБНО "%" + &Фрагмент + "%" с конструкцией СПЕЦСИМВОЛ, если в строке могут встречаться служебные символы. Условие В ИЕРАРХИИ позволяет отобрать элементы справочника с учётом вложенности групп.

Порядок создания выборки запросом
  1. 1
    Определите источник данных и нужные поля
  2. 2
    Напишите текст запроса (удобно через конструктор запроса в конфигураторе)
  3. 3
    Добавьте условия отбора через параметры
  4. 4
    Выполните запрос и получите выборку методом Выбрать() или Выгрузить()
  5. 5
    Обойдите выборку в цикле или проверьте результат на пустоту
  6. 6
    Проверьте результат на тестовых данных с известным составом

Выборка из табличных частей и регистров

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

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

"ВЫБРАТЬ

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

| Товары.Количество КАК Количество

|ИЗ

| Документ.РеализацияТоваровУслуг.Товары КАК Товары

|ГДЕ

| Товары.Ссылка = &Ссылка";

Из регистров сведений и накопления выборка строится аналогично, но для периодических регистров и остатков используются виртуальные таблицы: РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад). Параметры виртуальной таблицы задаются в скобках после её имени — это эффективнее, чем отбор в секции ГДЕ, потому что фильтрация выполняется до вычисления итогов.

Выборка средствами СКД без программирования

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

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

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

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

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

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

Программно отбор устанавливается через свойство Отбор списка: добавляется элемент отбора с полем, видом сравнения и значением. Пользовательский отбор через кнопку «Настроить список» доступен без программирования, но его условия не сохраняются между сеансами, если не настроено сохранение настроек формы.

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

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

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

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

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

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

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

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

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

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

Период отбора
Норма

Границы периода учитываются включительно, как задумано

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

Документы на границе периода выпадают из выборки

Помеченные на удаление
Норма

Исключены явным условием, если не нужны

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

В выборку попадают помеченные объекты

Производительность и временные таблицы

На больших объёмах данных скорость выборки определяется тем, как построен запрос. Основные приёмы оптимизации: отбор по индексированным полям (дата, ссылка, код), параметры виртуальных таблиц вместо условий в ГДЕ, отказ от выборки лишних полей и от оператора ПОДОБНО с ведущим символом процента, который не использует индекс.

Сложные выборки удобно разбивать на этапы через временные таблицы: промежуточный результат помещается в таблицу ПОМЕСТИТЬ ИмяТаблицы, а следующий запрос пакета обращается к ней. Менеджер временных таблиц создаётся объектом МенеджерВременныхТаблиц и присваивается запросу. После работы временные таблицы стоит уничтожать, чтобы не держать память на сервере.

Типичные ошибки
01
Подстановка значений прямо в текст запроса вместо параметров — ошибки типов и риск некорректного выполнения
02
Отсутствие отбора по пометке удаления — в выборку попадают удалённые объекты
03
Соединение с табличной частью без необходимости — задвоение строк результата
04
Запрос внутри цикла — кратное замедление работы на больших данных
05
Использование Выбрать() там, где достаточно Выгрузить() или Пустой() — лишний код и потеря скорости

Частые вопросы

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

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

Как проверить, что выборка пустая?

До получения выборки вызовите метод РезультатЗапроса.Пустой() — он вернёт Истина, если записей нет. Если выборка уже получена, первый вызов Выборка.Следующий() вернёт Ложь, что означает отсутствие строк.

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

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

Почему в выборке появились дубли строк?

Чаще всего причина — соединение с таблицей, где на одну запись основной таблицы приходится несколько записей присоединяемой (например, табличная часть или регистр с несколькими строками). Проверьте условия связи, при необходимости примените группировку или РАЗЛИЧНЫЕ, либо пересмотрите логику соединения.

Как выбрать данные за период, включая граничные даты?

Используйте условие Дата МЕЖДУ &Начало И &Конец, передавая начало первого дня и конец последнего дня периода (функции НачалоДня и КонецДня). Ошибка в границах — типичная причина «пропавших» документов за последний день периода.

Что быстрее: запрос или объектный метод Выбрать()?

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

Итог

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

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