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

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

Как добавить новое поле в запросе 1С

Как добавить новое поле в запросе 1С: конструктор запроса, ручное редактирование текста, вычисляемые поля, виртуальные таблицы и типичные ошибки разработчика.

Добавление поля в запрос — одна из самых частых задач при доработке отчётов, обработок и печатных форм в 1С. Сделать это можно двумя способами: через встроенный конструктор запроса или ручной правкой текста на встроенном языке. Оба подхода дают одинаковый результат, но различаются удобством и контролем над итоговым кодом.

Прежде чем добавлять поле, важно понимать, откуда оно берётся: это может быть реквизит уже выбранной таблицы, поле связанного объекта через точку, результат вычисления или поле из новой таблицы, которую придётся присоединить к запросу. От этого зависит, насколько простой будет доработка и потребуется ли менять структуру запроса целиком.

Ниже разобраны оба способа, работа с вычисляемыми полями, добавление полей из связанных таблиц, а также типичные ошибки, из-за которых запрос перестаёт выполняться или возвращает не те данные.

Как добавить поле через конструктор запроса

Конструктор запроса — визуальный инструмент, который открывается из модуля: установите курсор внутрь текста запроса, нажмите правую кнопку мыши и выберите пункт «Конструктор запроса». Если текст написан корректно, конструктор загрузит его структуру: таблицы, связи, выбранные поля и условия.

Чтобы добавить поле, найдите нужный реквизит в дереве таблиц слева и перетащите его в список полей либо выделите и нажмите кнопку «>». Порядок полей в списке определяет порядок колонок в результате запроса — это важно, если результат выводится в табличный документ или таблицу значений с обращением по индексу.

После нажатия «ОК» конструктор перезапишет текст запроса. Учтите: он форматирует код по-своему, и ручные комментарии внутри текста запроса могут быть потеряны. Если запрос сложный и активно правится вручную, сохраните исходный текст перед открытием конструктора.

Порядок действий в конструкторе
  1. 1
    Установите курсор внутрь текста запроса в модуле
  2. 2
    Откройте контекстное меню и выберите «Конструктор запроса»
  3. 3
    На закладке «Таблицы и поля» найдите нужный реквизит в дереве
  4. 4
    Перенесите поле в список выбранных полей кнопкой «>» или перетаскиванием
  5. 5
    Нажмите «ОК» и проверьте сформированный текст запроса
  6. 6
    Выполните код в отладке и убедитесь, что поле появилось в результате

Как добавить поле вручную в тексте запроса

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

Типичный пример — добавление реквизита «Комментарий» к уже существующему запросу по документам:

ВЫБРАТЬ

РеализацияТоваровУслуг.Номер КАК Номер,

РеализацияТоваровУслуг.Дата КАК Дата,

РеализацияТоваровУслуг.Контрагент КАК Контрагент,

РеализацияТоваровУслуг.Комментарий КАК Комментарий

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

Обращайте внимание на псевдонимы: конструкция «КАК Комментарий» задаёт имя колонки в результате. Именно по этому имени поле будет доступно в выборке через Выборка.Комментарий. Если псевдоним не указан, платформа присвоит имя автоматически, и обращение к полю станет менее очевидным.

Добавление поля через точку из связанного объекта

Часто нужное значение находится не в самой таблице, а в связанном объекте: например, нужен ИНН контрагента, а в документе хранится только ссылка на контрагента. В языке запросов такие поля получают через точку: Реализация.Контрагент.ИНН.

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

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

Добавление вычисляемых полей и полей из других таблиц

Вычисляемые поля и псевдонимы

В секции ВЫБРАТЬ допустимы не только реквизиты, но и выражения: арифметика, функции, конструкция ВЫБОР. Например, поле с суммой с НДС или признак просрочки документа добавляется прямо в список полей:

ВЫБРАТЬ

Товары.Номенклатура КАК Номенклатура,

Товары.Количество * Товары.Цена КАК Сумма,

ВЫБОР

КОГДА Товары.Количество > 0

ТОГДА ИСТИНА

ИНАЧЕ ЛОЖЬ

КОНЕЦ КАК ЕстьОстаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки КАК Товары

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

Поле из новой таблицы через соединение

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

ВЫБРАТЬ

Заказ.Номер КАК Номер,

Заказ.Менеджер КАК Менеджер,

Пользователи.Подразделение КАК Подразделение

ИЗ

Документ.ЗаказПокупателя КАК Заказ

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи

ПО Заказ.Менеджер = Пользователи.Ссылка

Левое соединение сохраняет все строки основной таблицы, даже если связанная запись не найдена — тогда добавленное поле будет NULL. Внутреннее соединение отфильтрует такие строки, что часто становится неожиданностью при проверке результата.

Типичные ошибки
01
Пропущенная запятая между полями — запрос не выполняется с синтаксической ошибкой
02
Использование внутреннего соединения вместо левого — из результата пропадают строки без связанной записи
03
Дублирующийся псевдоним поля — ошибка выполнения запроса
04
Имя реквизита взято из синонима в интерфейсе, а не из метаданных — поле не находится
05
Поле добавлено в запрос, но не добавлено в обход выборки или макет печатной формы — визуально ничего не изменилось

Особые случаи: виртуальные таблицы и временные таблицы

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

Если запрос использует временные таблицы (конструкция ПОМЕСТИТЬ В), поле нужно добавить в тот пакетный запрос, где формируется временная таблица. Поле, добавленное только в финальную выборку, не сможет сослаться на данные, которых нет во временной таблице, — будет ошибка «Поле не найдено».

В схеме компоновки данных (СКД), которая используется в большинстве отчётов, поле добавляется в текст запроса набора данных, а затем его нужно включить в настройки отчёта на закладке «Выбранные поля». Без второго шага поле существует в наборе, но не выводится пользователю.

Маршрут решения

Как выбрать способ

Нужно 1–2 поля из той же таблицыДопишите поле вручную в секцию ВЫБРАТЬ — это быстрее и не меняет форматирование
Нужно менять связи, группировки или добавлять таблицуИспользуйте конструктор запроса — он снизит риск синтаксических ошибок
Поле находится в справочнике по ссылке и таких полей многоДобавьте ЛЕВОЕ СОЕДИНЕНИЕ вместо множественных обращений через точку
Отчёт построен на СКДДобавьте поле в запрос набора данных и включите его в выбранные поля настроек

Как проверить, что поле добавлено корректно

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

Второй уровень — выполнение. Установите точку останова после Запрос.Выполнить() и посмотрите результат в отладчике: выгрузите результат в таблицу значений через Выгрузить() и проверьте, что колонка с нужным именем присутствует и заполнена ожидаемыми значениями.

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

Контрольные точки

Как проверить результат

Синтаксис запроса
Норма

Модуль сохраняется без ошибок, конструктор открывает запрос

Тревожный признак

Сообщение о синтаксической ошибке или «Поле не найдено»

Колонка в результате
Норма

В выгруженной таблице значений есть колонка с заданным псевдонимом

Тревожный признак

Колонки нет или она называется иначе, чем ожидает код

Значения в колонке
Норма

Поля заполнены; NULL только там, где связанная запись отсутствует

Тревожный признак

Все значения NULL — вероятно, неверное условие соединения

Вывод пользователю
Норма

Поле видно в отчёте, печатной форме или обработке

Тревожный признак

Поле есть в запросе, но не выведено в макет или настройки СКД

Ответы на частые вопросы

Можно ли добавить поле в запрос, не открывая конфигуратор?

Да, если речь о динамическом списке или отчёте на СКД в режиме предприятия: в настройках отчёта можно добавить доступное поле через «Ещё — Изменить вариант отчёта». Но добавить поле, которого нет в запросе набора данных, без доработки конфигурации нельзя.

Почему после добавления поля запрос стал работать медленнее?

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

Что делать, если конструктор запроса не открывает мой текст?

Конструктор не понимает некоторые конструкции, написанные вручную с ошибками, и отдельные редкие операторы. Проверьте текст на синтаксические ошибки, уберите лишние символы и попробуйте снова. Если запрос корректен, но конструктор всё равно отказывает — правьте текст вручную.

Как добавить поле в запрос динамического списка формы?

Откройте свойства динамического списка, установите признак «Произвольный запрос» и отредактируйте текст запроса, добавив поле в секцию ВЫБРАТЬ. После этого добавьте соответствующую колонку в таблицу формы, связав её с новым полем по пути данных.

Можно ли добавить поле с фиксированным значением или параметром?

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

Поле добавлено, но в выборке оно пустое — в чём причина?

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

Итог

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

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