Число как строка: в языке запросов и во встроенном языке 1С
Содержание
Во встроенном языке число превращает в строку функция Строка(Значение), а гибко оформить его (знаки после запятой, разделители) — Формат(Значение, "..."). В языке запросов этих функций нет: там работает оператор ВЫРАЗИТЬ(Поле КАК СТРОКА(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))) КАК Обозначение
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
Без СОКРЛП между "№ " и числом влез бы десяток лишних пробелов. Склеивать число со строкой в запросе напрямую ("№ " + Товары.Количество) нельзя — это разные типы, будет ошибка. Сначала приводим к строке, потом складываем.
Вычисляемые поля и соединение типов
Частый сценарий — собрать из числовых и ссылочных полей единое текстовое обозначение в вычисляемом поле запроса или СКД.
Правила, которые экономят отладку:
- Каждое число перед конкатенацией оборачивайте в
СОКРЛП(ВЫРАЗИТЬ(... КАК СТРОКА(N))). - Ссылку на объект (номенклатуру, контрагента) приводите к строке через
ВЫРАЗИТЬ(Ссылка КАК СТРОКА(150))— она берёт представление (наименование). - Все слагаемые должны быть строками; смешивать строку с числом или ссылкой запрещено.
ВЫБРАТЬ
СОКРЛП(ВЫРАЗИТЬ(Товары.Номенклатура КАК СТРОКА(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))), число перед + обязательно приводите к строке.Частые ошибки при преобразовании числа в строку
Проблемы повторяются из проекта в проект — вот на что смотреть в первую очередь.
- 🔸 Лишний пробел в коде или артикуле. Использовали
Строка()вместоФормат(..., "ЧГ=0"). Разделитель разрядов попал в значение. - 🔸 Ошибка «Несовместимые типы» в запросе. Пытались сложить строку с числом напрямую. Нужно сначала
ВЫРАЗИТЬ(... КАК СТРОКА(N)). - 🔸 Куча пробелов перед числом в запросе. Забыли
СОКРЛПвокругВЫРАЗИТЬ. - 🔸 Обрезанное число. Мала длина в
СТРОКА(N)— не хватило под все разряды. - 🔸
NULLвместо нуля. В запросе не обернули поле вЕСТЬNULLдо преобразования. - 🔸 Разная дробь на разных базах. Форматировали дробное число в запросе — оформляйте его на уровне вывода.
Частые вопросы
Чем отличается `Строка()` от `Формат()`?
Строка() даёт представление числа в текущем формате сеанса — с разделителем групп и запятой в дроби, без возможности это изменить. Формат() позволяет управлять видом: число знаков после запятой, разделители, поведение при нуле. Нужен контроль — берите Формат().Как убрать пробел между тысячами?
ЧГ=0: Формат(Число, "ЧГ=0"). Через Строка() убрать его нельзя.Почему в запросе не работает `Строка()` или `Формат()`?
ВЫРАЗИТЬ(Поле КАК СТРОКА(N)), где N — максимальная длина.Как заменить точку на запятую (или наоборот) в дробном числе?
ЧРД: Формат(Число, "ЧРД=.") поставит точку. В запросе предсказуемый разделитель дроби лучше не настраивать: оформляйте дробь на уровне вывода.Что делать, если поле может быть `NULL`?
ВЫРАЗИТЬ оберните поле в ЕСТЬNULL(Поле, 0). Иначе преобразование вернёт NULL, а не ноль, и склейка со строкой даст пустой результат.