Поля в запросе 1С: выбор, разыменование, вычисления и объединения

· 9 мин

Содержание

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

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

Где именно добавляется поле: конструктор и текст

Поле попадает в результат только из списка ВЫБРАТЬ. Всё остальное — ИЗ, ГДЕ, соединения — лишь определяет, откуда поле берётся и по какому условию.

В конструкторе запроса (кнопка Конструктор запроса в модуле, в консоли запросов или в схеме компоновки данных) добавление поля выглядит так:

  1. Слева, в области Таблицы, раскройте нужную таблицу (плюсик).
  2. Найдите реквизит и перенесите его в область Поля двойным кликом или мышью.
  3. Порядок полей меняется стрелками над списком — на результат в колонках он влияет напрямую.

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

В коде текст запроса кладут в свойство Текст объекта Запрос, в СКД — на вкладку Запрос. Синтаксис везде один.

Базовый выбор и обращение к полю через точку

Минимальный запрос перечисляет поля после ВЫБРАТЬ и указывает источник после ИЗ:

ВЫБРАТЬ
    Номенклатура.Наименование,
    Номенклатура.Артикул,
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура

Чтобы добавить поле из связанной таблицы, не пишут соединение вручную — достаточно обратиться по точке. Это называют разыменованием ссылки: платформа сама подставит нужное соединение.

ВЫБРАТЬ
    Номенклатура.Наименование,
    Номенклатура.ЕдиницаИзмерения.Наименование КАК Единица,
    Номенклатура.ВидНоменклатуры.Наименование КАК Вид
ИЗ
    Справочник.Номенклатура КАК Номенклатура

Точек в цепочке может быть несколько: Заказ.Контрагент.ОсновнойБанковскийСчет.Банк.Наименование. В конструкторе эта же цепочка раскрывается плюсиками у ссылочных реквизитов — удобно, когда точного имени поля вы не помните.

Разыменование работает только для ссылочных полей. У строки, числа или даты точки нет — попытка написать Номенклатура.Наименование.Длина вызовет ошибку.

Псевдонимы: как переименовать колонку и таблицу

Псевдоним задаёт имя колонки в результате и имя таблицы в запросе. Обе роли — через слово КАК.

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

ВЫБРАТЬ
    Товар.Наименование КАК ИмяТовара,
    Товар.ЕдиницаИзмерения.Наименование КАК ИмяЕдиницы
ИЗ
    Справочник.Номенклатура КАК Товар

Здесь Товар — псевдоним таблицы, он короче полного имени Справочник.Номенклатура и обязателен, когда в запросе участвует эта таблица несколько раз (например, иерархия: товар и его родитель). ИмяТовара и ИмяЕдиницы — псевдонимы полей; без них обе колонки назывались бы Наименование, и обратиться к ним из кода или СКД было бы нельзя.

В псевдонимах нельзя использовать пробелы и начинать имя с цифры. КАК Цена За Единицу — ошибка, КАК ЦенаЗаЕдиницу — верно.

Поля из виртуальных таблиц регистров

Остатки, обороты и срезы в таблице регистра напрямую не лежат — их считает виртуальная таблица. Её выбирают в конструкторе в ветке регистра (например, РегистрНакопления.ТоварыНаСкладах.Остатки), и тогда в списке полей появляются ресурсы с суффиксом: КоличествоОстаток, СуммаОстаток.

ВЫБРАТЬ
    Остатки.Номенклатура КАК Товар,
    Остатки.Склад,
    Остатки.КоличествоОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки

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

Названия полей-ресурсов зависят от типа таблицы:

Виртуальная таблицаПоля-ресурсы (пример)
.Остатки()КоличествоОстаток, СуммаОстаток
.Обороты()КоличествоОборот, СуммаОборот
.ОстаткиИОбороты()...НачальныйОстаток, ...Оборот, ...КонечныйОстаток
РегистрСведений.…СрезПоследних()обычные ресурсы регистра (например, Цена)

Для регистра сведений поле актуального значения берут из среза: РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК Цены, затем в полях — Цены.Цена.

Поле из соединённой таблицы: когда точки не хватает

Разыменование по точке закрывает только случаи, когда таблицы связаны одним ссылочным реквизитом. Если связь сложнее — две таблицы соединяют явно через СОЕДИНЕНИЕ … ПО и берут поле из присоединённой таблицы.

Явное соединение нужно, когда:

  • 🔗 связь идёт не по реквизиту-ссылке, а по совпадению значений (товар и цена из регистра сведений);
  • 🔗 важно управлять типом соединения — оставить все строки или только совпавшие;
  • 🔗 присоединяется виртуальная таблица регистра, а не справочник.
ВЫБРАТЬ
    Строки.Номенклатура КАК Товар,
    Строки.Количество,
    Цены.Цена КАК ТекущаяЦена
ИЗ
    Документ.ЗаказПокупателя.Товары КАК Строки
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК Цены
    ПО Цены.Номенклатура = Строки.Номенклатура

Поле ТекущаяЦена здесь добавлено из другой таблицы, связанной условием ПО. Тип соединения определяет, какие строки останутся:

ТипЧто остаётся в результате
ВНУТРЕННЕЕтолько строки, где нашлась пара в обеих таблицах
ЛЕВОЕвсе строки левой таблицы, из правой — совпавшие
ПРАВОЕвсе строки правой, из левой — совпавшие
ПОЛНОЕвсе строки обеих таблиц

Для подстановки справочного значения почти всегда берут ЛЕВОЕ СОЕДИНЕНИЕ: оно не теряет строки документа, даже если цены на дату ещё не было. Там, где пары может не быть, поле из правой таблицы прикрывают ЕСТЬNULL.

Вычисляемые поля: арифметика, выбор и агрегаты

Вычисляемое поле — это выражение в списке ВЫБРАТЬ, а не готовый реквизит. Ему обязательно нужен псевдоним.

Арифметика:

ВЫБРАТЬ
    Строка.Номенклатура,
    Строка.Количество,
    Строка.Цена,
    Строка.Количество * Строка.Цена КАК Сумма
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Строка

Условие — через конструкцию ВЫБОР … КОГДА … ТОГДА … ИНАЧЕ … КОНЕЦ:

ВЫБОР
    КОГДА Строка.Сумма > 100000
        ТОГДА "Крупная"
    ИНАЧЕ "Обычная"
КОНЕЦ КАК ТипСтроки

Агрегатные функции (СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ) сворачивают строки. Как только в запросе появляется агрегат, все остальные невычисляемые поля обязаны попасть в СГРУППИРОВАТЬ ПО:

ВЫБРАТЬ
    Продажи.Номенклатура КАК Товар,
    СУММА(Продажи.Количество) КАК Количество,
    СУММА(Продажи.Сумма) КАК Сумма
ИЗ
    РегистрНакопления.Продажи КАК Продажи
СГРУППИРОВАТЬ ПО
    Продажи.Номенклатура

Деление в запросе на ноль вызывает ошибку выполнения. Если знаменатель может оказаться нулём, прикройте его: ВЫБОР КОГДА Строка.Количество = 0 ТОГДА 0 ИНАЧЕ Строка.Сумма / Строка.Количество КОНЕЦ.

Отдельный частый случай — поле ссылочного типа, которое может оказаться пустым после соединения. Обработать пустое значение помогает функция ЕСТЬNULL:

ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток

Когда поле составного типа (например, Регистратор регистра), до его реквизитов добираются через приведение типа функцией ВЫРАЗИТЬ:

ВЫРАЗИТЬ(Движение.Регистратор КАК Документ.РеализацияТоваровУслуг).Номер КАК НомерДок

Для оформления добавленного поля пригодятся встроенные функции языка запросов. Они работают прямо в списке ВЫБРАТЬ:

  • ПРЕДСТАВЛЕНИЕ(Поле) — строковое представление ссылки, удобно для вывода в отчёт;
  • НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) и КОНЕЦПЕРИОДА(…) — приведение даты к началу или концу месяца, дня, года;
  • ПОДСТРОКА(Строка, 1, 10) — часть строки по позиции и длине;
  • ГОД(Дата), МЕСЯЦ(Дата) — числовые части даты для группировки по периодам.

Эти функции не меняют данные в базе — они формируют значение только на время выполнения запроса, поэтому добавлять такие поля безопасно даже в рабочей базе.

Общие поля при объединении нескольких запросов

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

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

ВЫБРАТЬ
    "Поступление" КАК ВидДвижения,
    Поступление.Номенклатура КАК Товар,
    Поступление.Количество КАК Количество
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК Поступление

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Реализация",
    Реализация.Номенклатура,
    Реализация.Количество
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Реализация

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

Если какое-то поле есть только в одной части, в остальных на его месте ставят заглушку совместимого типа: 0 для числа, "" для строки, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) для ссылки. В конструкторе этим управляет вкладка Объединения/Псевдонимы — галочками сопоставляют поля разных запросов между собой.

Соединение (СОЕДИНЕНИЕ … ПО) и объединение решают разные задачи. Соединение добавляет колонки сбоку (поля другой таблицы в той же строке), объединение добавляет строки снизу. Если нужно подтянуть реквизит из связанной таблицы — это соединение или разыменование по точке, а не ОБЪЕДИНИТЬ.

Частые ошибки при добавлении поля и как их найти

Большинство ошибок видно сразу при попытке выполнить запрос — текст ошибки точно указывает на проблемное место. Разберите симптом ниже и сопоставьте с решением.

Диагностика: выберите симптом

Чтобы посмотреть результат, не запуская всю обработку, пользуются консолью запросов — типовой обработкой, которая выполняет текст запроса и показывает таблицу с колонками. В схеме компоновки данных тот же результат даёт предпросмотр на вкладке настроек. В коде результат разворачивают методом Выбрать() у результата запроса и смотрят значения в отладчике через точку останова.

Когда поле «не считается», а ошибки нет, проверьте три вещи по порядку: правильный ли источник указан в ИЗ, нет ли лишнего отбора в ГДЕ, который отсекает строки, и не схлопнула ли группировка то, что вы ждали в разрезе.

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

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

Можно ли добавить поле в запрос, не открывая конструктор?
Да. Допишите имя поля после ВЫБРАТЬ через запятую прямо в тексте запроса. Конструктор нужен для наглядности и для сложных соединений, но текст первичен — он и исполняется.
Почему добавленное поле вернуло NULL, хотя значение в базе есть?
Чаще всего поле пришло через левое соединение, которое не нашло пару, либо обращение идёт к полю составного типа без приведения. Оберните поле в ЕСТЬNULL или примените ВЫРАЗИТЬ для нужного типа.
Как добавить поле, которого нет в таблице, — например, разницу или признак?
Это вычисляемое поле: напишите выражение в списке ВЫБРАТЬ и дайте ему псевдоним через КАК. Для признака удобна конструкция ВЫБОР … КОГДА … КОНЕЦ, для суммы или разницы — обычная арифметика по другим полям.
Нужно ли поле добавлять во все части объединения?
Да. Число полей во всех частях ОБЪЕДИНИТЬ должно совпадать. Если в одной части поля нет, поставьте на его место заглушку совместимого типа: 0, "" или пустую ссылку.
Чем отличается псевдоним поля от псевдонима таблицы?
Псевдоним таблицы (после источника в ИЗ) — это короткое имя, по которому к таблице обращаются внутри запроса. Псевдоним поля (после выражения в ВЫБРАТЬ) задаёт имя колонки в результате. Оба пишутся через КАК.