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

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

Как выбрать все поля в запросе 1С

Как выбрать все поля в запросе 1С через ВЫБРАТЬ *, когда это оправданно, какие есть ограничения, риски производительности и альтернативы с примерами кода.

В языке запросов 1С выбрать все поля источника можно двумя способами: указать символ звёздочки (ВЫБРАТЬ *) или перечислить нужные поля через запятую. Звёздочка выглядит самым быстрым решением, но в реальных конфигурациях она часто становится источником лишней нагрузки на сервер СУБД и скрытых ошибок при доработках.

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

Синтаксис выбора всех полей

Базовая форма запроса со звёздочкой выглядит так: ВЫБРАТЬ * ИЗ Справочник.Номенклатура. Платформа вернёт все доступные поля объекта: стандартные реквизиты (Ссылка, Код, Наименование, ПометкаУдаления и другие), а также все реквизиты, добавленные в конфигураторе.

Звёздочку можно комбинировать с псевдонимом таблицы и дополнительными полями: ВЫБРАТЬ Товары.*, Товары.Ссылка.Организация ИЗ Документ.РеализацияТоваров.Товары КАК Товары. Такой приём полезен, когда нужны все поля табличной части плюс отдельные реквизиты шапки документа.

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

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

"ВЫБРАТЬ

| *

|ИЗ

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

|ГДЕ

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

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

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

Где звёздочка работает, а где нет

Конструкция ВЫБРАТЬ * поддерживается не во всех контекстах языка запросов. Она корректно работает в основном запросе к таблицам базы данных и в запросах к временным таблицам. Но есть ограничения: звёздочку нельзя использовать в объединениях (ОБЪЕДИНИТЬ) без явного списка полей в каждой части, если состав полей различается, а также в пакетных запросах с различными источниками нужно следить за совпадением структуры.

Ещё одно ограничение — виртуальные таблицы регистров. Для них звёздочка вернёт только поля самой виртуальной таблицы (например, Период, Регистратор, измерения и ресурсы остатков), а не поля физической таблицы движений. Это часто путают начинающие разработчики, ожидая увидеть полный набор колонок.

Почему в прикладном коде рекомендуют перечислять поля явно

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

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

Третья причина — работа оптимизатора СУБД. При явном списке полей запрос чаще покрывается индексами, и сервер может обойтись чтением только индексных страниц. Звёздочка практически всегда заставляет читать полные строки таблицы.

Типичные ошибки
01
Использовать ВЫБРАТЬ * из документа с несколькими табличными частями — результат содержит дублирующиеся строки и лишние поля всех табличных частей сразу
02
Соединять две таблицы со звёздочкой с обеих сторон — при совпадении имён полей возникает ошибка неоднозначности или непредсказуемый состав колонок
03
Оставлять звёздочку в запросе динамического списка — список начинает тянуть все реквизиты, что заметно замедляет открытие форм
04
Забывать, что звёздочка включает служебные поля типа ПометкаУдаления и Предопределенный, которые затем мешают при выгрузке в таблицу значений

Когда ВЫБРАТЬ * оправдано

Есть сценарии, где звёздочка — разумный выбор. Первый и главный — обращение к временной таблице в пакетном запросе. Временная таблица уже содержит только нужные поля, поэтому ВЫБРАТЬ * ИЗ ВТ_Данные не создаёт лишней нагрузки и делает текст короче.

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

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

Сравнение вариантов

ВЫБРАТЬ *

Быстро пишется, подходит для временных таблиц и отладки. Ограничение: лишняя нагрузка и хрупкость при доработках конфигурации

Явный список полей

Оптимален для прикладного кода: предсказуем, быстрее выполняется, легче сопровождается. Требует актуализации при изменении структуры

Программное построение списка полей через метаданные

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

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

Самый простой способ — выполнить запрос в консоли запросов в режиме предприятия и посмотреть состав колонок результата. Убедитесь, что присутствуют все ожидаемые поля и нет неожиданных дублей с суффиксами вида «Поле1», «Поле2» — они появляются при конфликте имён в соединениях.

Программно состав колонок проверяется через свойство Колонки результата выгрузки: ТаблицаРезультата = Запрос.Выполнить().Выгрузить(); Для Каждого Колонка Из ТаблицаРезультата.Колонки Цикл ... КонецЦикла;. Это удобно для автоматических проверок в тестах.

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

Порядок действий при написании запроса
  1. 1
    Определите, какие поля реально нужны прикладной логике
  2. 2
    Напишите запрос с явным списком полей и псевдонимом таблицы
  3. 3
    Выполните запрос в консоли и проверьте состав колонок и число строк
  4. 4
    Если запрос обращается к временной таблице — при необходимости замените список на звёздочку
  5. 5
    Убедитесь, что в соединениях нет конфликтов имён полей

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

Если запрос со звёздочкой уже работает в продуктивной базе и тормозит, первый шаг — заменить звёздочку на список реально используемых полей. Часто это даёт ускорение без какой-либо другой оптимизации, потому что сокращается объём читаемых и передаваемых данных.

Для диагностики используйте технологический журнал с событиями DBMSSQL или DBPOSTGRS и план запроса на стороне СУБД. Если видно, что запрос читает всю таблицу (сканирование), а выбирается пара полей — это прямой сигнал переписать выборку.

Отдельная тема — динамические списки. В их произвольных запросах звёздочка особенно вредна: список обновляется часто, и каждый раз из базы тянутся все реквизиты. Здесь явный список полей — практически обязательное требование.

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

Можно ли использовать ВЫБРАТЬ * с соединением таблиц?

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

Почему после конструктора запроса звёздочка исчезла?

Конструктор запросов не хранит звёздочку как таковую — при открытии он раскрывает её в актуальный список полей. Это нормальное поведение: в сохранённом тексте окажется явное перечисление, что даже полезнее для сопровождения.

Выбирает ли звёздочка поля табличных частей документа?

Нет. Запрос к таблице документа со звёздочкой вернёт только реквизиты шапки и стандартные поля. Данные табличных частей нужно получать отдельным обращением к таблице вида Документ.ИмяДокумента.ИмяТабличнойЧасти.

Влияет ли звёздочка на скорость запроса?

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

Как выбрать все поля кроме одного-двух?

В языке запросов 1С нет синтаксиса исключения полей. Нужно перечислить все требуемые поля явно. Если список длинный, его можно сформировать программно, перебрав реквизиты объекта через метаданные и исключив ненужные.

Работает ли ВЫБРАТЬ * в СКД?

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

Итог

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

Все поля в запросе 1С выбираются через ВЫБРАТЬ *, но в прикладном коде безопаснее явный список полей: он быстрее, устойчивее к доработкам и понятнее при сопровождении. Звёздочку оставляйте для временных таблиц, отладки и универсальных механизмов.