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

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

Как использовать ВЫБРАТЬ 1 в запросах 1С

Разбираем конструкцию ВЫБРАТЬ 1 в языке запросов 1С: отличия от ВЫБРАТЬ ПЕРВЫЕ 1, проверка существования записей, оптимизация запросов и типичные ошибки.

Конструкция «ВЫБРАТЬ 1» (или «ВЫБРАТЬ РАЗЛИЧНЫЕ 1») в языке запросов 1С — приём, при котором вместо реальных полей выбирается константа 1. Она нужна, когда важен сам факт наличия записей, а не их содержимое: например, при проверке существования документов по контрагенту, дублей в справочнике или записей в регистре сведений. Такой запрос работает быстрее, потому что платформе не нужно читать и передавать значения полей.

Многие путают «ВЫБРАТЬ 1» с «ВЫБРАТЬ ПЕРВЫЕ 1». Это разные вещи: первая конструкция определяет, что именно возвращается в каждой строке результата (константа), а вторая ограничивает количество строк. Их можно комбинировать, но задачи у них разные.

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

Что делает конструкция ВЫБРАТЬ 1

В секции ВЫБРАТЬ перечисляются поля, которые вернёт запрос. Если вместо поля указать число 1, каждая строка результата будет содержать значение 1. Платформе не требуется обращаться к данным таблицы за реальными значениями — достаточно определить, удовлетворяет ли строка условиям отбора.

Практический смысл: когда нужно ответить на вопрос «есть ли хотя бы одна запись?», чтение полей — лишняя работа. Запрос вида «ВЫБРАТЬ 1 ИЗ Справочник.Контрагенты ГДЕ ИНН = &ИНН» вернёт столько строк с единицей, сколько найдено записей. Далее достаточно проверить, пуст ли результат.

Константа не обязана быть именно единицей: допустимы строки, даты, ИСТИНА. Но единица — общепринятое соглашение, оно компактно и сразу читается другими разработчиками.

Отличие ВЫБРАТЬ 1 от ВЫБРАТЬ ПЕРВЫЕ 1

Это две независимые конструкции, которые часто смешивают из-за похожего написания. «ПЕРВЫЕ n» — ограничитель количества строк результата, он ставится сразу после слова ВЫБРАТЬ. Число 1 в списке полей — это значение, возвращаемое в каждой строке.

Комбинация «ВЫБРАТЬ ПЕРВЫЕ 1 ... ВЫБРАТЬ 1» (точнее — «ВЫБРАТЬ ПЕРВЫЕ 1 1») даёт максимально лёгкий запрос на существование: сервер остановит сканирование после первой подходящей строки и вернёт одну строку с константой.

КонструкцияЧто делаетКогда применять
ВЫБРАТЬ 1Возвращает константу 1 в каждой строкеНужен факт наличия записей, подсчёт через КОЛИЧЕСТВО, соединения без чтения полей
ВЫБРАТЬ ПЕРВЫЕ 1Ограничивает результат одной строкойНужна одна запись или проверка существования с минимальной нагрузкой
ВЫБРАТЬ РАЗЛИЧНЫЕ 1Одна строка с единицей, если записи естьПроверка существования без ПЕРВЫЕ, когда порядок не важен

Как проверить существование записей

Самая частая задача: узнать, есть ли в базе записи по условию, не загружая сами данные. Типовой шаблон в модуле выглядит так: формируется запрос с «ВЫБРАТЬ ПЕРВЫЕ 1», результат проверяется методом Пустой().

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| 1
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Контрагент = &Контрагент
| И Реализация.Проведен";
Запрос.УстановитьПараметр("Контрагент", Контрагент);

Если Запрос.Выполнить().Пустой() Тогда
 // документов нет
КонецЕсли;

Обратите внимание на условие по проведённости: без него в выборку попадут помеченные на удаление и непроведённые документы, и проверка даст ложноположительный результат. Всегда уточняйте, какие именно записи считаются «существующими» в вашей логике.

Альтернатива без запроса — метод Выбрать() менеджера объекта с обходом выборки, но для проверки существования запрос с ПЕРВЫЕ 1 обычно эффективнее, особенно на больших таблицах.

Порядок действий
  1. 1
    Сформулируйте условие отбора и добавьте фильтры на пометку удаления или проведение, если они значимы
  2. 2
    Напишите запрос: ВЫБРАТЬ ПЕРВЫЕ 1, затем 1, затем ИЗ с таблицей и ГДЕ с условиями
  3. 3
    Установите параметры запроса и выполните его
  4. 4
    Проверьте результат методом Пустой(): Истина — записей нет, Ложь — есть хотя бы одна

Использование в соединениях и подзапросах

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

Также «ВЫБРАТЬ 1» удобен внутри существования через вложенный запрос в условии ГДЕ: конструкция вида «ГДЕ 1 В (ВЫБРАТЬ 1 ИЗ ...)» или сгруппированные запросы, где считается КОЛИЧЕСТВО(1) вместо КОЛИЧЕСТВО(Поле). Подсчёт константы избавляет от неоднозначности с NULL-значениями полей.

При группировке помните: КОЛИЧЕСТВО(Поле) не учитывает строки, где поле равно NULL, а КОЛИЧЕСТВО(1) считает все строки группы. Это частая причина расхождений в отчётах.

Производительность и ограничения

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

Конструкция ПЕРВЫЕ 1 даёт выигрыш именно для проверки существования: сервер прекращает поиск после первой найденной строки. Без ПЕРВЫЕ будут прочитаны все подходящие записи — на больших таблицах это заметная разница.

Ограничение приёма: результат с константой нельзя использовать там, где дальше нужны реальные данные. Если после проверки существования всё равно потребуются поля найденной записи, выбирайте сразу нужные поля с ПЕРВЫЕ 1 — два отдельных запроса обойдутся дороже одного.

Типичные ошибки

Самая распространённая — проверять существование через выборку полей без ПЕРВЫЕ: запрос читает тысячи строк, хотя нужен ответ «да/нет». Вторая — забыть отбор по пометке удаления, из-за чего «существующей» считается запись, которую пользователь уже удалил.

Третья ошибка — сравнение результата через Выбрать().Следующий() без проверки возвращаемого значения, либо попытка обратиться к полю результата, которого нет, потому что выбрана константа. Если в запросе «ВЫБРАТЬ 1», то обращение Выборка.Ссылка вызовет ошибку — поля Ссылка в результате нет.

Типичные ошибки
01
Проверка существования без ПЕРВЫЕ 1 — читаются все подходящие строки вместо одной
02
Отсутствие отбора по ПометкаУдаления или Проведен — проверка находит неактуальные записи
03
Обращение к реальным полям результата, когда выбрана константа 1 — ошибка обращения к полю
04
КОЛИЧЕСТВО(Поле) вместо КОЛИЧЕСТВО(1) — строки с NULL выпадают из подсчёта

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

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

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

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

Результат.Пустой() при отсутствии записей
Норма

Возвращает Истина

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

Возвращает Ложь — условие слишком широкое или параметр не установлен

Результат при наличии одной записи
Норма

Одна строка со значением 1

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

Несколько строк — забыто ПЕРВЫЕ 1 или РАЗЛИЧНЫЕ

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

Помеченные записи не попадают в результат при соответствующем отборе

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

Помеченные учитываются — добавьте условие НЕ ПометкаУдаления

FAQ

Чем ВЫБРАТЬ РАЗЛИЧНЫЕ 1 отличается от ВЫБРАТЬ ПЕРВЫЕ 1?

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

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

Да, допустимы числа, строки в кавычках, ИСТИНА, даты. Единица — просто соглашение: она короткая и однозначно читается как «флаг наличия». Смысл запроса от выбора константы не меняется.

Почему запрос с ВЫБРАТЬ 1 всё равно работает медленно?

Константа сокращает только объём передаваемых данных, но не ускоряет поиск строк. Если условия ГДЕ идут по неиндексированным полям или используются функции над полем в условии, выполняется полное сканирование таблицы. Проверьте план запроса и индексы по полям отбора.

Как проверить существование записи без запроса?

Можно использовать менеджер объекта: например, выборку через Выбрать() с отбором и проверку Следующий(). Для справочников также доступен поиск по наименованию или реквизиту через НайтиПоРеквизиту. Но на больших таблицах запрос с ПЕРВЫЕ 1 обычно предпочтительнее.

Работает ли ВЫБРАТЬ 1 в СКД и динамических списках?

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

Что вернёт запрос, если записей нет?

Пустой результат: метод Пустой() вернёт Истина, а обход выборки не выполнится ни разу. Никаких строк с NULL или нулём запрос не создаёт — отсутствие строк и есть признак отсутствия записей.

Итог

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

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