Число как строка: в языке запросов и во встроенном языке 1С

· 9 мин

Содержание

Во встроенном языке число превращает в строку функция Строка(Значение), а гибко оформить его (знаки после запятой, разделители) — Формат(Значение, "..."). В языке запросов этих функций нет: там работает оператор ВЫРАЗИТЬ(Поле КАК СТРОКА(N)). Выбор между ними зависит от того, где вам нужна строка — в коде, прямо в запросе или в ячейке отчёта.

Ниже — рабочие конструкции для каждого случая: как получить число как строку в запросе 1С, как убрать разделитель разрядов, что делать с NULL и дробной частью, и где преобразование лучше не делать ради скорости.

Два языка — два механизма преобразования

В 1С число в строку превращают в двух разных местах, и путать их нельзя.

  • 🧩 Встроенный язык (модули, обработки, формы) — функции Строка(), Формат(), СтрШаблон().
  • 🗄️ Язык запросов — оператор ВЫРАЗИТЬ с типом СТРОКА(длина). Никаких Строка() и Формат() в тексте запроса не существует, попытка их написать вызовет ошибку синтаксиса.

Третий вариант — вообще не преобразовывать число в коде, а задать формат вывода в системе компоновки данных или в ячейке табличного документа. Число остаётся числом, а на экран выводится как текст нужного вида.

Правило простое: если строка нужна для дальнейших вычислений или условий — делайте её во встроенном языке; если только для показа в отчёте — форматируйте на уровне вывода, запрос не трогайте.

Функция Строка() — самый короткий путь

Строка() принимает значение любого типа и возвращает его строковое представление в текущем формате сеанса.

Сумма = 1500.5;
Текст = Строка(Сумма);   // "1 500,5"

Обратите внимание на результат: между разрядами появился пробел, а дробная часть отделена запятой. Для русской локали это нормальное представление числа, но именно оно чаще всего и ломает дальнейший код.

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

Код = 1500;
ИмяФайла = "Выгрузка_" + Строка(Код) + ".xml";
// получится "Выгрузка_1 500.xml" — с лишним пробелом!

Пробел-разделитель здесь не нужен. Чтобы его убрать, Строка() не подходит — нужен Формат().

Формат() — когда важен внешний вид числа

Формат(Значение, "ФорматнаяСтрока") даёт полный контроль над представлением. Параметры перечисляются через точку с запятой.

ПараметрЧто задаётПример
ЧДЦзнаков после запятойЧДЦ=2 → 1 500,50
ЧГразделитель групп разрядовЧГ=0 → без пробелов
ЧРДсимвол разделителя дробиЧРД=. → точка вместо запятой
ЧЦминимальное число знаковЧЦ=10
Ч0что выводить для нуляЧ0= → пустая строка

Самые ходовые приёмы:

Формат(1500.5, "ЧДЦ=2")         // "1 500,50"
Формат(1500.5, "ЧГ=0")          // "1500,5"   — убрали разделитель групп
Формат(1500.5, "ЧДЦ=2; ЧГ=0")   // "1500,50"
Формат(1500.5, "ЧРД=.; ЧГ=0")   // "1500.5"   — точка для дроби
Формат(0, "Ч0=")                // ""          — вместо нуля пустая строка

Вернёмся к примеру с именем файла — теперь он корректен:

ИмяФайла = "Выгрузка_" + Формат(Код, "ЧГ=0") + ".xml";
// "Выгрузка_1500.xml"

Ещё два момента про Формат(), о которых часто забывают:

  • Он округляет, а не обрезает. Формат(1.567, "ЧДЦ=2") вернёт "1,57", а Формат(1.564, "ЧДЦ=2") → "1,56". Если нужно именно отбросить хвост без округления, число обрабатывают заранее функцией Цел().
  • Параметр ЧЦ задаёт минимальную ширину. Формат(42, "ЧЦ=6") дополнит число пробелами слева до шести позиций — удобно для выравнивания колонок в текстовом выводе, но для кодов с ведущими нулями этот способ не годится, нули так не добавить.

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

Текст = Формат(Сумма, "ЧДЦ=2; ЧГ= ") + " руб.";
// "1 500,50 руб." — пробел-разделитель оставили намеренно, для чтения суммы

ЧГ=0 отключает группировку разрядов. Это первое, что нужно писать, когда число идёт в код, ключ, номер счёта или URL, — иначе невидимый пробел между тысячами испортит значение.

Если число нужно подставить в текст сообщения, удобнее СтрШаблон(). Он сам приводит аргументы к строке, но оформление лучше задавать через Формат():

Сообщение = СтрШаблон("Остаток %1 шт. на сумму %2 руб.",
    Формат(Количество, "ЧДЦ=0; ЧГ=0"),
    Формат(Сумма, "ЧДЦ=2"));

ВЫРАЗИТЬ КАК СТРОКА — число в строку внутри запроса

Если преобразование нужно прямо в запросе (для соединения со строкой, для группировки по текстовому значению, для вывода в поле типа «Строка»), используют оператор ВЫРАЗИТЬ:

ВЫБРАТЬ
    ВЫРАЗИТЬ(Товары.Количество КАК СТРОКА(15)) КАК КоличествоСтрокой
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Товары

Число в скобках СТРОКА(15) — максимальная длина результирующей строки. Берите её с запасом под самое длинное значение, иначе строку обрежет.

У результата есть особенность: преобразованное число часто получает ведущие пробелы (выравнивание по правому краю). Поэтому почти всегда ВЫРАЗИТЬ оборачивают в СОКРЛП() — она убирает пробелы слева и справа:

ВЫБРАТЬ
    "№ " + СОКРЛП(ВЫРАЗИТЬ(Товары.Количество КАК СТРОКА(15))) КАК Обозначение
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Товары

Без СОКРЛП между "№ " и числом влез бы десяток лишних пробелов. Склеивать число со строкой в запросе напрямую ("№ " + Товары.Количество) нельзя — это разные типы, будет ошибка. Сначала приводим к строке, потом складываем.

Вычисляемые поля и соединение типов

Частый сценарий — собрать из числовых и ссылочных полей единое текстовое обозначение в вычисляемом поле запроса или СКД.

Правила, которые экономят отладку:

  1. Каждое число перед конкатенацией оборачивайте в СОКРЛП(ВЫРАЗИТЬ(... КАК СТРОКА(N))).
  2. Ссылку на объект (номенклатуру, контрагента) приводите к строке через ВЫРАЗИТЬ(Ссылка КАК СТРОКА(150)) — она берёт представление (наименование).
  3. Все слагаемые должны быть строками; смешивать строку с числом или ссылкой запрещено.
ВЫБРАТЬ
    СОКРЛП(ВЫРАЗИТЬ(Товары.Номенклатура КАК СТРОКА(100)))
    + " — "
    + СОКРЛП(ВЫРАЗИТЬ(Товары.Количество КАК СТРОКА(15)))
    + " шт." КАК Строка
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Товары

Для дробных чисел результат ВЫРАЗИТЬ ... КАК СТРОКА зависит от СУБД: файловая база, PostgreSQL и MS SQL могут по-разному показать дробную часть и разделитель. Если нужен строго предсказуемый вид (две цифры, точка), не форматируйте дробь в запросе — выведите число как есть, а оформление задайте в СКД или в ячейке отчёта.

Форматирование чисел в отчётах без преобразования

Самая частая ошибка новичка — тащить ВЫРАЗИТЬ КАК СТРОКА в запрос только для того, чтобы показать «красивое» число в отчёте. Так делать не надо.

В системе компоновки данных у каждого поля есть свойство Формат. Оно принимает ту же форматную строку, что и функция Формат():

  • откройте схему компоновки → вкладка Наборы данных (или Ресурсы);
  • найдите нужное поле, в колонке Формат вызовите конструктор (кнопка с многоточием);
  • задайте, например, ЧДЦ=2; ЧГ=0 для суммы без разделителей или ЧДЦ=0 для целого.

Поле при этом остаётся числом: по нему считаются итоги, работают условное оформление и сортировка. А на экран выводится текст нужного вида.

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

Где нужна строкаЧем делать
Код, ключ, имя файлаФормат(Число, "ЧГ=0")
Текст сообщенияСтрШаблон + Формат
Склейка в запросеСОКРЛП(ВЫРАЗИТЬ(... КАК СТРОКА(N)))
Вывод суммы в отчётесвойство Формат поля СКД
Число в ячейке макетасвойство Формат ячейки

Граничные случаи: NULL, пустые значения и ноль

Три ситуации, где преобразование числа ведёт себя не так, как ждёшь.

NULL в запросе. Если поле пришло из левого соединения и может быть NULL, оборачивать его в ВЫРАЗИТЬ КАК СТРОКА бессмысленно — вернётся NULL, а не «0». Сначала заменяем:

СОКРЛП(ВЫРАЗИТЬ(ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК СТРОКА(15)))

Ноль во встроенном языке. По умолчанию Строка(0) и Формат(0, ...) выводят "0". Если в отчёте нули должны оставаться пустыми, добавьте Ч0=:

Формат(Остаток, "ЧДЦ=2; Ч0=")   // при нуле вернёт пустую строку

Отрицательные и большие числа. Строка(-1500) вернёт "-1 500" — минус на месте. Для ВЫРАЗИТЬ в запросе следите за длиной: СТРОКА(15) вмещает число с минусом и дробной частью, но для сумм с миллиардами берите длину больше.

Пустая строка в числовом поле. Обратная задача — строку превратить в число во встроенном языке — решается функцией Число(Текст). Но текст должен быть числовым: Число("1500,5") сработает, а Число("1 500,5") с пробелом-разделителем или Число("") вызовет ошибку. Перед преобразованием такой разделитель убирают через СтрЗаменить(Текст, " ", ""), а пустые значения проверяют заранее.

Если ВЫРАЗИТЬ ... КАК СТРОКА(N) задать слишком малую длину N, строка молча обрежется и вы потеряете старшие разряды. Длину всегда считайте по максимально возможному значению поля.

Где преобразовывать, чтобы не терять скорость

Приведение типов в запросе — операция для СУБД не бесплатная. На больших выборках это заметно.

Ориентиры, которые помогают не перегружать запрос:

  • ✅ Преобразуйте число в строку в запросе только тогда, когда строка участвует в логике: соединение с текстовым полем, группировка по строковому значению, условие ГДЕ по строке.
  • ✅ Для показа в отчёте форматируйте число на уровне вывода (свойство Формат в СКД или в ячейке). Запрос отдаёт число — СУБД не тратит ресурсы на конвертацию каждой строки.
  • ✅ Разовое преобразование в коде (Строка(), Формат()) по скорости неощутимо — оптимизировать там нечего.
  • ⛔ Не оборачивайте в ВЫРАЗИТЬ КАК СТРОКА поля, по которым идёт соединение или отбор: это мешает использованию индексов и замедляет запрос.

Короткое дерево решений, если сомневаетесь, каким способом пользоваться:

Где вам нужна строка из числа?

Частые ошибки при преобразовании числа в строку

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

  • 🔸 Лишний пробел в коде или артикуле. Использовали Строка() вместо Формат(..., "ЧГ=0"). Разделитель разрядов попал в значение.
  • 🔸 Ошибка «Несовместимые типы» в запросе. Пытались сложить строку с числом напрямую. Нужно сначала ВЫРАЗИТЬ(... КАК СТРОКА(N)).
  • 🔸 Куча пробелов перед числом в запросе. Забыли СОКРЛП вокруг ВЫРАЗИТЬ.
  • 🔸 Обрезанное число. Мала длина в СТРОКА(N) — не хватило под все разряды.
  • 🔸 NULL вместо нуля. В запросе не обернули поле в ЕСТЬNULL до преобразования.
  • 🔸 Разная дробь на разных базах. Форматировали дробное число в запросе — оформляйте его на уровне вывода.

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

Чем отличается `Строка()` от `Формат()`?
Строка() даёт представление числа в текущем формате сеанса — с разделителем групп и запятой в дроби, без возможности это изменить. Формат() позволяет управлять видом: число знаков после запятой, разделители, поведение при нуле. Нужен контроль — берите Формат().
Как убрать пробел между тысячами?
Это разделитель групп разрядов. Отключается параметром ЧГ=0: Формат(Число, "ЧГ=0"). Через Строка() убрать его нельзя.
Почему в запросе не работает `Строка()` или `Формат()`?
Их в языке запросов нет — это функции встроенного языка. В запросе число приводят к строке оператором ВЫРАЗИТЬ(Поле КАК СТРОКА(N)), где N — максимальная длина.
Как заменить точку на запятую (или наоборот) в дробном числе?
Во встроенном языке — параметром ЧРД: Формат(Число, "ЧРД=.") поставит точку. В запросе предсказуемый разделитель дроби лучше не настраивать: оформляйте дробь на уровне вывода.
Что делать, если поле может быть `NULL`?
Перед ВЫРАЗИТЬ оберните поле в ЕСТЬNULL(Поле, 0). Иначе преобразование вернёт NULL, а не ноль, и склейка со строкой даст пустой результат.