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

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

Что такое амперсанд в 1С и как его использовать

Амперсанд в 1С: как работает символ & в языке запросов, объявление параметров, оператор & для веб-ссылок и расширений, типичные ошибки и примеры кода.

Амперсанд — это символ «&», который в экосистеме 1С встречается сразу в нескольких ролях. Чаще всего под «амперсандом в 1С» понимают обозначение параметра в языке запросов: конструкция вида &Номенклатура указывает, что в это место запроса будет подставлено значение, переданное из кода. Без амперсанда запрос воспринял бы это слово как имя поля или таблицы, и результат был бы ошибкой или неверными данными.

Кроме языка запросов, амперсанд используется в аннотациях расширений конфигурации (&Перед, &После, &Вместо), в директивах компиляции (&НаСервере, &НаКлиенте) и в литералах дат. Понимание этих контекстов помогает читать чужой код, писать собственные запросы и не путать параметр с полем таблицы.

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

Где встречается амперсанд в 1С

Символ «&» в платформе 1С имеет несколько независимых применений, и путать их нельзя — синтаксис и логика у каждого своя. Основные контексты:

  • Язык запросов — &ИмяПараметра обозначает параметр, значение которого передаётся из встроенного языка или задаётся в консоли запросов.
  • Директивы компиляции — &НаКлиенте, &НаСервере, &НаСервереБезКонтекста определяют, где выполняется процедура или функция.
  • Аннотации в расширениях — &Перед("ИмяМетода"), &После("ИмяМетода"), &Вместо("ИмяМетода") управляют перехватом методов типовой конфигурации.
  • Литералы дат — запись вида '20260115' в запросе задаёт конкретную дату.

Когда говорят «амперсанд в 1С», в подавляющем большинстве случаев речь идёт именно о параметрах запроса — это самый частый сценарий и основной источник вопросов у начинающих.

Амперсанд в языке запросов: параметры

В тексте запроса амперсанд ставится непосредственно перед именем параметра без пробела: &Склад, &НачалоПериода, &СписокТоваров. Запрос сам по себе не знает, чему равен параметр, — значение ему передаёт код, который этот запрос выполняет. Пока значение не установлено, выполнить запрос нельзя: платформа выдаст ошибку о незаданном параметре.

Типичный пример — выборка остатков по конкретному складу:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Остатки.Номенклатура,

| Остатки.КоличествоОстаток

|ИЗ

| РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки";

Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());

Запрос.УстановитьПараметр("Склад", СкладОтбора);

Результат = Запрос.Выполнить();

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

Параметры в виртуальных таблицах

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

Какие значения можно передавать в параметры

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

// Отбор по нескольким контрагентам

СписокКонтрагентов = Новый Массив;

СписокКонтрагентов.Добавить(Контрагент1);

СписокКонтрагентов.Добавить(Контрагент2);

Запрос.УстановитьПараметр("Контрагенты", СписокКонтрагентов);

// В тексте запроса: ГДЕ Продажи.Контрагент В (&Контрагенты)

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

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

Амперсанд в директивах и расширениях

Вторая большая группа применений — служебные конструкции встроенного языка. Директивы &НаКлиенте и &НаСервере пишутся перед объявлением процедуры и определяют контекст её выполнения. В тонком клиенте процедура с директивой &НаСервере выполняется на сервере и не имеет доступа к данным формы напрямую; &НаКлиенте — наоборот, работает с интерфейсом, но не обращается к базе напрямую.

В расширениях конфигурации амперсанд входит в аннотации перехвата методов:

  • &Перед("ПередЗаписью") — метод расширения выполнится до типового обработчика;
  • &После("ПриЗаписи") — после типового;
  • &Вместо("ОбработкаПроведения") — полностью заменяет типовой метод; внутри можно вызвать продолжение через ПродолжитьВызов().

Здесь амперсанд — часть синтаксиса аннотации, а не параметр. Значение в кавычках — это имя перехватываемого метода в виде строки, и опечатка в нём приведёт к ошибке при проверке расширения или в момент вызова.

Как проверить запрос с параметрами

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

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

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

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

Все параметры установлены
Норма

Запрос выполняется без ошибки «Параметр не задан»

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

Исключение при Выполнить() с указанием имени параметра

Тип значения параметра
Норма

Тип совпадает с типом сравниваемого поля (ссылка со ссылкой, дата с датой)

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

Пустой результат или ошибка сравнения типов

Отбор по параметру
Норма

Изменение значения параметра меняет состав выборки

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

Результат одинаков при любых значениях — условие не срабатывает

Типичные ошибки при работе с амперсандом

Большинство проблем с параметрами сводится к нескольким повторяющимся ситуациям. Знание их экономит время отладки.

Типичные ошибки
01
Амперсанд в имени при установке: УстановитьПараметр("&Склад", ...) — параметр не будет найден, имя указывается без &
02
Параметр объявлен в тексте, но значение не установлено — ошибка при выполнении запроса
03
Опечатка в имени: в тексте &Склад, а устанавливается "Склады" — платформа не сопоставит параметры
04
Передача строки вместо ссылки: условие Ссылка = &Парам со строковым значением даст пустую выборку
05
Попытка подставить через & имя поля или таблицы — параметры подставляют только значения, не фрагменты текста

Отдельно стоит упомянуть сравнение с NULL: условие Поле = &Параметр не найдёт записи, где поле равно NULL, даже если параметр тоже не заполнен. Для таких случаев используют ЕСТЬ NULL или функцию ЕСТЬNULL() в тексте запроса.

Порядок действий при написании запроса с параметрами

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

Порядок действий
  1. 1
    Сформулируйте текст запроса и отметьте амперсандом все места, куда подставляются значения: &Период, &Склад и т.д.
  2. 2
    Проверьте запрос в консоли запросов, задав значения параметров вручную, и убедитесь в корректности выборки
  3. 3
    В коде создайте объект Запрос, присвойте текст и вызовите УстановитьПараметр для каждого параметра — по имени без &
  4. 4
    Выполните запрос и проверьте результат на граничных случаях: пустой отбор, единственная запись, большой массив в условии В()
  5. 5
    При пустом результате проверьте типы значений параметров и наличие NULL в сравниваемых полях

Если запрос большой и параметров много, держите их имена говорящими и единообразными: &НачалоПериода и &КонецПериода читаются лучше, чем &П1 и &П2, и снижают риск перепутать значения при установке.

Итог

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

Амперсанд в 1С — это прежде всего обозначение параметра запроса: &Имя в тексте, УстановитьПараметр(Имя, Значение) в коде, имя без &. Параметры подставляют только значения, а не имена полей. Тот же символ используется в директивах &НаСервере и аннотациях расширений &Вместо.

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

Нужно ли ставить амперсанд в методе УстановитьПараметр?

Нет. В тексте запроса параметр пишется как &Имя, а в методе УстановитьПараметр имя передаётся строкой без амперсанда: Запрос.УстановитьПараметр("Имя", Значение). Символ & в строке имени приведёт к тому, что платформа не найдёт параметр.

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

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

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

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

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

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

Чем отличаются &НаСервере и &НаСервереБезКонтекста?

Обе директивы выполняют код на сервере, но &НаСервереБезКонтекста не передаёт данные формы на сервер — такой вызов быстрее и дешевле, однако внутри процедуры недоступны реквизиты и элементы формы. Процедуры без контекста используют для обращений к базе, когда данные формы не нужны.

Что означает &Вместо в расширении конфигурации?

Аннотация &Вместо("ИмяМетода") полностью замещает типовой обработчик методом из расширения. Если нужно сохранить типовую логику и лишь дополнить её, внутри своего метода вызывают ПродолжитьВызов() — тогда выполнится и исходный обработчик. Без этого вызова типовой код не выполнится вообще.