Разработка и Конфигурация · 9 мин
Как выбрать все поля в запросе 1С
Как выбрать все поля в запросе 1С через ВЫБРАТЬ *, когда это оправданно, какие есть ограничения, риски производительности и альтернативы с примерами кода.
В языке запросов 1С выбрать все поля источника можно двумя способами: указать символ звёздочки (ВЫБРАТЬ *) или перечислить нужные поля через запятую. Звёздочка выглядит самым быстрым решением, но в реальных конфигурациях она часто становится источником лишней нагрузки на сервер СУБД и скрытых ошибок при доработках.
Понимание того, как именно платформа обрабатывает конструкцию ВЫБРАТЬ *, помогает принимать осознанное решение: где звёздочка допустима и удобна, а где безопаснее явно перечислить поля. Ниже разобраны синтаксис, ограничения, типичные сценарии и способы проверки результата.
Синтаксис выбора всех полей
Базовая форма запроса со звёздочкой выглядит так: ВЫБРАТЬ * ИЗ Справочник.Номенклатура. Платформа вернёт все доступные поля объекта: стандартные реквизиты (Ссылка, Код, Наименование, ПометкаУдаления и другие), а также все реквизиты, добавленные в конфигураторе.
Звёздочку можно комбинировать с псевдонимом таблицы и дополнительными полями: ВЫБРАТЬ Товары.*, Товары.Ссылка.Организация ИЗ Документ.РеализацияТоваров.Товары КАК Товары. Такой приём полезен, когда нужны все поля табличной части плюс отдельные реквизиты шапки документа.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| *
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";
Результат = Запрос.Выполнить().Выгрузить();
Важно понимать: звёздочка раскрывается платформой в конкретный список полей на момент выполнения запроса. Если завтра в конфигурацию добавят новый реквизит, запрос начнёт возвращать и его — без какого-либо предупреждения.
Где звёздочка работает, а где нет
Конструкция ВЫБРАТЬ * поддерживается не во всех контекстах языка запросов. Она корректно работает в основном запросе к таблицам базы данных и в запросах к временным таблицам. Но есть ограничения: звёздочку нельзя использовать в объединениях (ОБЪЕДИНИТЬ) без явного списка полей в каждой части, если состав полей различается, а также в пакетных запросах с различными источниками нужно следить за совпадением структуры.
Ещё одно ограничение — виртуальные таблицы регистров. Для них звёздочка вернёт только поля самой виртуальной таблицы (например, Период, Регистратор, измерения и ресурсы остатков), а не поля физической таблицы движений. Это часто путают начинающие разработчики, ожидая увидеть полный набор колонок.
Почему в прикладном коде рекомендуют перечислять поля явно
Главная причина — производительность. Когда запрос выбирает все поля, сервер СУБД читает больше данных, чем нужно, а платформа передаёт по сети и материализует в памяти лишние колонки. Для документов с десятками реквизитов и табличными частями разница по времени и объёму памяти может быть ощутимой, особенно при больших выборках.
Вторая причина — хрупкость кода. Если обработчик результата обращается к полям по имени, добавление нового реквизита с совпадающим именем в соединяемых таблицах вызовет ошибку неоднозначности или молча изменит поведение. Явный список полей фиксирует контракт запроса и делает доработки предсказуемыми.
Третья причина — работа оптимизатора СУБД. При явном списке полей запрос чаще покрывается индексами, и сервер может обойтись чтением только индексных страниц. Звёздочка практически всегда заставляет читать полные строки таблицы.
Когда ВЫБРАТЬ * оправдано
Есть сценарии, где звёздочка — разумный выбор. Первый и главный — обращение к временной таблице в пакетном запросе. Временная таблица уже содержит только нужные поля, поэтому ВЫБРАТЬ * ИЗ ВТ_Данные не создаёт лишней нагрузки и делает текст короче.
Второй сценарий — отладка и разведочный анализ. В консоли запросов звёздочка позволяет быстро посмотреть состав объекта, не открывая конфигуратор. Это удобно при изучении незнакомой конфигурации или проверке данных конкретного документа.
Третий случай — универсальные механизмы обмена и сериализации, где нужно гарантированно получить полный состав объекта независимо от его структуры. Даже здесь, однако, часто надёжнее получать метаданные объекта и строить список полей программно.
Сравнение вариантов
Быстро пишется, подходит для временных таблиц и отладки. Ограничение: лишняя нагрузка и хрупкость при доработках конфигурации
Оптимален для прикладного кода: предсказуем, быстрее выполняется, легче сопровождается. Требует актуализации при изменении структуры
Подходит для универсальных механизмов обмена. Сложнее в реализации, но устойчиво к изменениям конфигурации
Как проверить, что запрос возвращает нужное
Самый простой способ — выполнить запрос в консоли запросов в режиме предприятия и посмотреть состав колонок результата. Убедитесь, что присутствуют все ожидаемые поля и нет неожиданных дублей с суффиксами вида «Поле1», «Поле2» — они появляются при конфликте имён в соединениях.
Программно состав колонок проверяется через свойство Колонки результата выгрузки: ТаблицаРезультата = Запрос.Выполнить().Выгрузить(); Для Каждого Колонка Из ТаблицаРезультата.Колонки Цикл ... КонецЦикла;. Это удобно для автоматических проверок в тестах.
Дополнительно стоит сравнить количество строк: запрос со звёздочкой к табличной части документа может вернуть больше строк, чем ожидалось, если в выборку попали данные нескольких табличных частей. Признак проблемы — одинаковые значения ссылки, повторяющиеся неожиданное число раз.
- 1Определите, какие поля реально нужны прикладной логике
- 2Напишите запрос с явным списком полей и псевдонимом таблицы
- 3Выполните запрос в консоли и проверьте состав колонок и число строк
- 4Если запрос обращается к временной таблице — при необходимости замените список на звёздочку
- 5Убедитесь, что в соединениях нет конфликтов имён полей
Производительность и оптимизация
Если запрос со звёздочкой уже работает в продуктивной базе и тормозит, первый шаг — заменить звёздочку на список реально используемых полей. Часто это даёт ускорение без какой-либо другой оптимизации, потому что сокращается объём читаемых и передаваемых данных.
Для диагностики используйте технологический журнал с событиями DBMSSQL или DBPOSTGRS и план запроса на стороне СУБД. Если видно, что запрос читает всю таблицу (сканирование), а выбирается пара полей — это прямой сигнал переписать выборку.
Отдельная тема — динамические списки. В их произвольных запросах звёздочка особенно вредна: список обновляется часто, и каждый раз из базы тянутся все реквизиты. Здесь явный список полей — практически обязательное требование.
Частые вопросы
Можно ли использовать ВЫБРАТЬ * с соединением таблиц?
Технически можно, но не рекомендуется. При совпадении имён полей в соединяемых таблицах платформа либо выдаст ошибку неоднозначности, либо переименует колонки автоматически, что сломает обращение к ним по имени. В соединениях всегда перечисляйте поля явно с псевдонимами таблиц.
Почему после конструктора запроса звёздочка исчезла?
Конструктор запросов не хранит звёздочку как таковую — при открытии он раскрывает её в актуальный список полей. Это нормальное поведение: в сохранённом тексте окажется явное перечисление, что даже полезнее для сопровождения.
Выбирает ли звёздочка поля табличных частей документа?
Нет. Запрос к таблице документа со звёздочкой вернёт только реквизиты шапки и стандартные поля. Данные табличных частей нужно получать отдельным обращением к таблице вида Документ.ИмяДокумента.ИмяТабличнойЧасти.
Влияет ли звёздочка на скорость запроса?
Да. Запрос выбирает и передаёт все поля, включая неиспользуемые, что увеличивает объём чтения с диска, сетевой трафик и потребление памяти. На маленьких справочниках разница незаметна, на больших таблицах документов и регистров — существенна.
Как выбрать все поля кроме одного-двух?
В языке запросов 1С нет синтаксиса исключения полей. Нужно перечислить все требуемые поля явно. Если список длинный, его можно сформировать программно, перебрав реквизиты объекта через метаданные и исключив ненужные.
Работает ли ВЫБРАТЬ * в СКД?
В запросе набора данных СКД звёздочка допустима, но система компоновки всё равно потребует явно описать поля, доступные для настроек. Для отчётов на СКД лучше сразу писать явный список полей с понятными псевдонимами.
Что важно запомнить
Все поля в запросе 1С выбираются через ВЫБРАТЬ *, но в прикладном коде безопаснее явный список полей: он быстрее, устойчивее к доработкам и понятнее при сопровождении. Звёздочку оставляйте для временных таблиц, отладки и универсальных механизмов.