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