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