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