Интерполяция строк

Строковые литералы поддерживают интерполяцию строк. Интерполяция строк — это процесс вычисления значения строкового литерала, включающего одно или несколько выражений интерполяции.

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

Синтаксис

Поддерживаются следующие варианты синтаксиса выражения интерполяции:

%имя-переменной
В этом случае для преобразования значения используется метод ВСтроку():
// Краткая форма - %имя-переменной
пер Обращение = "Иван Иванович"
пер Сообщение = "Дорогой %Обращение!"
// Полная форма - %{выражение}
пер Длина = 100
пер Ширина = 30
пер Сообщение = "Площадь равна %{Длина * Ширина} м2"
$имя-переменной
В этом случае для преобразования значения используется метод Представление():
// Краткая форма - $имя-переменной
пер Обращение = "Иван Иванович"
пер Сообщение = "Дорогой $Обращение!"
// Полная форма - ${выражение}
пер Длина = 100
пер Ширина = 30
пер Сообщение = "Площадь равна ${Длина * Ширина} м2"
// С форматированием - ${выражение|формат}
пер Сейчас = ДатаВремя.Сейчас()
пер Сообщение = "Текущая дата ${Сейчас|дд ММММ гггг, дддд}" 
Для обоих вариантов краткого синтаксиса (%имя-переменной и $имя-переменной):
  • имя-переменной это последовательность символов, образующая допустимое имя переменной.
  • Символ после имя-переменной не должен быть буквой, цифрой или знаком подчеркивания.
  • Указанное имя-переменной должно быть доступно в текущей области видимости.

Например, в выражении %Переменная.Поле имя переменной — это Переменная. Это выражение эквивалентно %{Переменная}.Поле.

Интерполяция с форматированием

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

Форматная строка отделяется от выражения символом | (вертикальная черта). Содержимое форматной строки определяется типом выражения.

Примеры использования интерполяции

знч Стр_Значение = Истина
знч Стр_Дата = Дата{2020-12-11}
знч Стр_Конкат = "" + Стр_Значение                             // "true"
знч Стр_Интер1 = "%Стр_Значение"                               // "true"
знч Стр_Интер2 = "$Стр_Значение"                               // "Истина"
знч Стр_Интер3 = "%{Стр_Значение}"                             // "true"
знч Стр_Интер4 = "${Стр_Значение}"                             // "Истина"
знч Стр_Интер5 = "${Стр_Дата|дд}"                              // "11"
знч Стр_Интер6 = "${Стр_Дата|дд ММММ гггг, дддд}"              // "11 декабря 2020, пятница"

Экранирование выражений интерполяции

Если в строковом литерале имеются сочетания символов, не являющиеся выражениями интерполяции, но подходящие под синтаксис выражений интерполяции, нужно экранировать в них первый символ (% или $x), добавив впереди символ (\):
знч Экр1 = "http://ya.ru?\$search=text,&\$max=100"      // http://ya.ru?$search=text,&$max=100
знч Экр2 = "Где имя типа \"\%Тест\%\""                  // Где имя типа "%Тест%"
знч Экр3 = "\%{}"                                       // %{}
знч Экр4 = "\${}"                                       // ${}
Последовательности символов %x и $x, где x — это любой символ, кроме букв и символа {, не нуждаются в экранировании, так как не подходят под синтаксис выражений интерполяции. Например, в следующих примерах экранирование не требуется:
знч Стр1 = "%0"
знч Стр2 = "$0"
знч Стр3 = "50% заряда"
знч Стр4 = "цена 10$"

Обработка значения «Неопределено»

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

Важно: При конкатенации со строкой значение Неопределено преобразуется не в пустую строку, а в строку "undefined".

Формирование результирующей строки при интерполяции

При использовании интерполяции нужно помнить, что формирование результирующей строки происходит в момент создания строки, включающей выражения интерполяции.

Покажем это на примере:
метод Скрипт()
    область
        // вариант 1
        пер ИмяПользователя: Строка
        пер Приветствие = "Привет, %ИмяПользователя!"
        ИмяПользователя = Консоль.СчитатьСтроку("Как тебя зовут? > ")
        Консоль.Записать(Приветствие)
    ;
    область
        // вариант 2
        пер ИмяПользователя: Строка
        ИмяПользователя = Консоль.СчитатьСтроку("Как тебя зовут? > ")
        пер Приветствие = "Привет, %ИмяПользователя!"
        Консоль.Записать(Приветствие)
    ;
;

В данном примере вариант 1 не позволит получить нужный результат. Вне зависимости от того, что введет пользователь, представляясь «1С:Исполнителю», в консоль будет записана строка Привет, !. Это произойдет потому, что переменная Приветствие будет создана в момент, когда переменная ИмяПользователя заполнена значением по умолчанию (а это пустая строка). То, что будет присвоено в переменную ИмяПользователя после создания переменной Приветствие, уже не повлияет на значение переменной Приветствие.

А вариант 2 приведет к желаемому результату. Если пользователь представится как Ипполит, то код из примера ответит Привет, Ипполит!. В данном варианте переменная Приветствие создается уже после записи нужного значения в переменную ИмяПользователя.

Использование в многострочных литералах

Выражения интерполяции могут использоваться в многострочных литералах. При этом выражения интерполяции могут содержать переносы строк, и эти переносы не включаются в формируемое значение результирующей строки.