Ключевое слово КАК в языке запросов 1С: имена для таблиц, полей и подзапросов
Содержание
Псевдоним в языке запросов 1С задаётся словом КАК (в английском синтаксисе AS) сразу после таблицы или поля: ИЗ Справочник.Номенклатура КАК Номенклатура, Номенклатура.Наименование КАК Название. Псевдоним таблицы — это короткое имя, по которому к ней обращаются в остальных частях запроса. Псевдоним поля — имя колонки в результате: именно его вы потом читаете в коде как Выборка.Название.
Правила простые, но на них спотыкаются постоянно. Псевдоним живёт только внутри своего запроса, во вложенном запросе он обязателен, в ОБЪЕДИНИТЬ имена колонок берутся из первого запроса, а в ГДЕ псевдоним поля использовать нельзя. Тема общая для платформы 8.3 и не зависит от конфигурации: Бухгалтерия, ЗУП и УТ используют один и тот же язык запросов.
Как объявить псевдоним: синтаксис и правила имени
Псевдоним ставится через КАК после источника в секции ИЗ или после выражения в списке ВЫБРАТЬ:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Товар,
Номенклатура.Наименование КАК Название,
Номенклатура.Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ЭтоГруппа
В результате будут три колонки: Товар, Название и Артикул. У третьего поля псевдонима нет, поэтому колонка получила имя самого реквизита.
Требования к имени такие же, как к любому идентификатору во встроенном языке:
- 🔤 буквы (кириллица или латиница), цифры и знак подчёркивания;
- 🚫 первым символом не может быть цифра;
- ␣ пробелы, точки, дефисы и скобки недопустимы;
- 🔑 нельзя брать ключевые слова языка запросов:
ВЫБРАТЬ,ИЗ,ГДЕ,КАК,ПО,И,ИЛИ,НЕ,ВЫБОР,КОГДА,ТОГДАи подобные; - 🔠 регистр не важен:
Название,названиеиНАЗВАНИЕдля платформы одно и то же.
Имена агрегатных функций ключевыми словами не считаются. Запись СУММА(Продажи.Сумма) КАК Сумма или КОЛИЧЕСТВО(*) КАК Количество встречается в типовых конфигурациях повсюду и работает.
Что будет, если псевдоним не указать
Для поля-реквизита платформа сама подставит его имя, как с Артикул выше. Для вычисляемого выражения имени нет, и колонка получит служебное имя вида Поле1, Поле2:
ВЫБРАТЬ
ЕСТЬNULL(Цены.Цена, 0) // колонка будет называться Поле1
ИЗ
...
Обращаться потом к Выборка.Поле1 неудобно, а при добавлении нового выражения нумерация сдвинется. Каждому выражению, функции и константе давайте псевдоним явно.
Конструктор запроса проставляет псевдонимы таблиц сам: добавили справочник «Номенклатура» — получили КАК Номенклатура. Добавили его второй раз — получили Номенклатура1. Такое имя лучше сразу переименовать по смыслу.
Псевдоним для выражения ВЫБОР и виртуальной таблицы
Выражение ВЫБОР — самый частый случай, когда без псевдонима колонка остаётся безымянной. КАК ставят после КОНЕЦ:
ВЫБРАТЬ
Остатки.Номенклатура КАК Товар,
Остатки.КоличествоОстаток КАК Остаток,
ВЫБОР
КОГДА Остатки.КоличествоОстаток <= 0
ТОГДА "Нет в наличии"
ИНАЧЕ "В наличии"
КОНЕЦ КАК Наличие
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК Остатки
Виртуальной таблице регистра псевдоним дают так же, после закрывающей скобки параметров. Имена её полей (КоличествоОстаток, СуммаОборот) задаёт платформа, а псевдонимы полей позволяют назвать их короче и понятнее для кода. Имя регистра здесь условное: в вашей конфигурации подставьте свой регистр накопления.
Где псевдоним виден: части запроса и вложенные запросы
Псевдоним таблицы действует во всём запросе, где объявлен: в ВЫБРАТЬ, в условиях ПО у соединений, в ГДЕ, СГРУППИРОВАТЬ ПО, ИМЕЮЩИЕ и УПОРЯДОЧИТЬ ПО.
С псевдонимом поля сложнее. Он появляется только на выходе запроса, поэтому виден не везде:
| Часть запроса | Псевдоним поля из ВЫБРАТЬ | Что писать |
|---|---|---|
ГДЕ | нельзя | исходное выражение: Номенклатура.Наименование |
СГРУППИРОВАТЬ ПО | нельзя | исходное выражение |
ИМЕЮЩИЕ | нельзя | агрегатное выражение: СУММА(Продажи.Сумма) > 1000 |
УПОРЯДОЧИТЬ ПО | можно | УПОРЯДОЧИТЬ ПО Название |
ИТОГИ ... ПО | нужно | имена полей из списка выбора |
ИНДЕКСИРОВАТЬ ПО (для ПОМЕСТИТЬ) | нужно | имена полей временной таблицы |
Вложенный запрос в ИЗ
Вложенный запрос в секции ИЗ — это таблица без собственного имени. Поэтому псевдоним для него обязателен, без КАК запрос не пройдёт синтаксический контроль:
ВЫБРАТЬ
Итоги.Контрагент,
Итоги.Сумма
ИЗ
(ВЫБРАТЬ
Реализация.Контрагент КАК Контрагент,
СУММА(Реализация.СуммаДокумента) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
СГРУППИРОВАТЬ ПО
Реализация.Контрагент) КАК Итоги
ГДЕ
Итоги.Сумма > 100000
Здесь видно сразу два правила. Внешний запрос обращается к полям подзапроса по их псевдонимам: Итоги.Сумма. А Реализация снаружи не видна: это имя существует только внутри скобок.
Обратное тоже верно. Вложенный запрос не может ссылаться на таблицы внешнего запроса: связанных (коррелированных) подзапросов в языке запросов 1С нет. Если нужна такая связь, подзапрос выносят во временную таблицу и соединяют по ключу.
Псевдонимы полей: имена колонок результата
Псевдоним поля — это контракт между запросом и кодом, который читает результат. По нему обращаются к колонке выборки и к колонке таблицы значений:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование КАК Название,
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Название + " / " + Выборка.Артикул);
КонецЦикла;
После Выгрузить() колонки таблицы значений называются так же. Отсюда практические следствия:
- 🔁 переименовали псевдоним в запросе — найдите все обращения
Выборка.СтароеИмяиСтрока.СтароеИмяв модуле, иначе получите ошибку на этапе выполнения; - 📊 в системе компоновки данных путь к данным поля набора совпадает с псевдонимом. Переименование ломает уже сохранённые варианты отчёта и пользовательские настройки, где это поле участвует;
- 🧩 при
ПОМЕСТИТЬпсевдонимы становятся именами полей временной таблицы, и следующие пакеты обращаются именно к ним.
Пример с временной таблицей:
ВЫБРАТЬ
Реализация.Контрагент КАК Контрагент,
СУММА(Реализация.СуммаДокумента) КАК Сумма
ПОМЕСТИТЬ ВТ_Продажи
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Проведен
СГРУППИРОВАТЬ ПО
Реализация.Контрагент
ИНДЕКСИРОВАТЬ ПО
Контрагент
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
Продажи.Контрагент,
Продажи.Сумма
ИЗ
ВТ_Продажи КАК Продажи
ВТ_Продажи после ПОМЕСТИТЬ — имя временной таблицы, а не псевдоним. Во втором запросе ей дают обычный псевдоним Продажи, как любой другой таблице.
Человекочитаемое название колонки с пробелами («Сумма продаж, руб.») задают не в запросе, а в оформлении: заголовком поля в СКД или в табличном документе. В запросе остаётся СуммаПродаж.
Соединения и ОБЪЕДИНИТЬ: как не запутаться в именах
Одна таблица дважды
Когда таблица участвует в запросе два раза, без разных псевдонимов не обойтись. Классический пример — товар и его группа из одного справочника:
ВЫБРАТЬ
Товары.Наименование КАК Товар,
Группы.Наименование КАК Группа
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Группы
ПО Товары.Родитель = Группы.Ссылка
ГДЕ
НЕ Товары.ЭтоГруппа
Обе колонки по смыслу — Наименование. Если не дать им разные псевдонимы полей, имена в результате совпадут, и запрос не выполнится. Псевдонимы полей внутри одного списка ВЫБРАТЬ должны быть уникальными, как и псевдонимы таблиц внутри одного запроса.
Тот же конфликт возникает при соединении документа и регистра, где у обоих есть Ссылка, Дата или Количество. Решение одно: каждой колонке — своё имя (ДатаДокумента, ДатаЦены).
Объединение запросов
В ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ колонки сопоставляются по порядку, а не по именам. Имена колонок итогового результата берутся из первого запроса, псевдонимы в остальных частях на результат не влияют:
ВЫБРАТЬ
Поступление.Контрагент КАК Контрагент,
Поступление.СуммаДокумента КАК Сумма,
"Поступление" КАК ВидОперации
ИЗ
Документ.ПоступлениеТоваровУслуг КАК Поступление
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Реализация.Контрагент,
Реализация.СуммаДокумента,
"Реализация"
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
УПОРЯДОЧИТЬ ПО
Сумма УБЫВ
Что из этого следует:
- Число полей во всех частях объединения должно совпадать.
- Порядок полей должен совпадать по смыслу. Если во втором запросе поменять местами контрагента и сумму, ошибки может не быть, но данные уедут не в свои колонки.
УПОРЯДОЧИТЬ ПОпишут один раз, после последней части, и используют в нём псевдонимы из первого запроса.- Таблицы в разных частях объединения могут называться одинаково: каждая часть — отдельный запрос со своими именами.
В конструкторе для этого есть вкладка «Объединения/Псевдонимы». Там поля всех частей выстроены в таблицу: строка — псевдоним итогового поля, колонки — запросы объединения. Удобно сразу видеть, какое поле какой части попало в какую колонку.
Если в одной из частей поля нет по смыслу, не пропускайте его. Подставьте значение-заглушку нужного типа: 0, "", НЕОПРЕДЕЛЕНО или ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка), и порядок колонок сохранится.
Влияют ли псевдонимы на скорость запроса
Не влияют. Платформа переводит запрос 1С в запрос к СУБД со своими служебными именами таблиц и колонок. Короткий псевдоним Н и длинный НоменклатураПоставщика дают одинаковый SQL-запрос и одинаковое время выполнения.
Скорость зависит от другого, и псевдонимы здесь помогают только увидеть проблему:
- 🐢 обращение через точку.
Реализация.Контрагент.ИНН— это неявное соединение с таблицей контрагентов. Цепочка из трёх-четырёх точек по полю составного типа даёт соединения со всеми возможными таблицами; - 🔀 поля составного типа. Для них используют
ВЫРАЗИТЬ(Поле КАК Справочник.Контрагенты). ЗдесьКАКозначает приведение типа, а не псевдоним, хотя слово то же; - 📦 виртуальные таблицы без параметров. Отбор по периоду и измерениям надо передавать в параметры
Остатки(&Дата, Склад = &Склад), а не накладывать вГДЕпо псевдониму таблицы.
Понятные псевдонимы ускоряют не запрос, а чтение и отладку. В запросе на 200 строк с пятью соединениями Т1, Т2, Т3 превращают правку в гадание.
Типичные ошибки и как их узнать
Несколько привычек, которые снимают большую часть этих проблем:
- ✅ называйте таблицы по роли в запросе:
ТоварыиГруппы,ЦеныЗакупкииЦеныПродажи, а неНоменклатура1; - ✅ давайте псевдоним каждому полю, даже если он совпадает с именем реквизита. Тогда структура результата видна сразу;
- ✅ для временных таблиц держите префикс
ВТ_, чтобы отличать их от объектов метаданных; - ✅ не используйте однобуквенные имена в запросах, которые будут читать другие люди;
- ✅ если запрос обрабатывает код, имена колонок не меняйте без поиска по модулю.
Переименовать таблицу в конструкторе можно на вкладке «Таблицы и поля»: выделите таблицу в списке выбранных и вызовите контекстное меню. Конструктор сам поправит все обращения к ней в полях, условиях и соединениях. Ручная замена в тексте надёжна хуже: легко задеть одноимённый реквизит.
Частые вопросы
Можно ли писать псевдонимы латиницей?
КАК Goods. Смешивать алфавиты внутри одного запроса не стоит: читать такой текст тяжело.Чем КАК в ВЫРАЗИТЬ отличается от псевдонима?
ВЫРАЗИТЬ(Поле КАК Строка(100)) слово КАК задаёт тип, к которому приводится значение. Псевдоним самого поля ставят уже после закрывающей скобки: ВЫРАЗИТЬ(Поле КАК Строка(100)) КАК Комментарий.Можно ли одинаково назвать таблицу и поле?
Контрагенты.Ссылка КАК Контрагенты допустима: псевдонимы таблиц и полей живут в разных областях. Но в больших запросах это путает, лучше КАК Контрагент.