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