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

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

Представление как число в запросе 1С: способы и ограничения

Как в языке запросов 1С вывести представление числом: функция ПРЕДСТАВЛЕНИЕ, ВЫРАЗИТЬ, ВЫБОР, обходные пути и типичные ошибки разработчика.

Разработчики 1С часто сталкиваются с обратной задачей: есть строковое представление числа (например, код, артикул или значение из текстового поля) и его нужно превратить в число прямо в запросе — для сортировки, сравнения или агрегации. При этом функция ПРЕДСТАВЛЕНИЕ работает в противоположную сторону: она возвращает строковое представление ссылки или значения. Понимание того, что умеет и чего не умеет язык запросов 1С, избавляет от часов отладки.

Ключевой факт: в языке запросов 1С нет прямой функции «строка в число». Конструкция ВЫРАЗИТЬ(Поле КАК ЧИСЛО) не выполняет преобразование строки «123» в число 123 — она лишь ограничивает тип поля, если поле составного типа. Поэтому задача «представление как число» решается обходными путями: через ВЫБОР с перечислением вариантов, через соединение с таблицей чисел или через постобработку результата запроса в коде.

Что делает функция ПРЕДСТАВЛЕНИЕ и почему она не решает задачу

Функция ПРЕДСТАВЛЕНИЕ(Значение) возвращает строку — текстовое представление ссылки, даты, числа или другого значения. Типичное применение — вывести наименование контрагента или номер документа в отчёте, не делая лишних соединений. Результат всегда имеет тип Строка неограниченной длины, что важно учитывать при группировках и сортировках.

Из этого следует главное ограничение: ПРЕДСТАВЛЕНИЕ превращает число в строку, а не наоборот. Если в запросе написать ПРЕДСТАВЛЕНИЕ(Товары.Количество), получится строка «10», и сортировка по ней пойдёт в лексикографическом порядке: «10» окажется раньше «2». Именно эта особенность чаще всего и приводит к поиску способа вернуть представление обратно в число.

Кроме того, результат ПРЕДСТАВЛЕНИЕ зависит от настроек представления в конфигурации: для ссылок это может быть наименование, код или комбинация полей. Использовать его как источник числовых данных ненадёжно — представление может измениться после переименования объекта или смены настроек.

Почему ВЫРАЗИТЬ(Поле КАК ЧИСЛО) не преобразует строку

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

Легитимный сценарий выглядит так: регистр сведений имеет ресурс составного типа (Число, Строка, Булево), и в запросе пишут ВЫРАЗИТЬ(Значение КАК ЧИСЛО(15,2)), чтобы отобрать только числовые значения и корректно их суммировать. Здесь значение уже число — оператор просто убирает неопределённость типа.

Проверить, что произойдёт с реальным полем, просто: выполните запрос в консоли запросов и посмотрите тип колонки результата. Если в строковом поле лежат «числа текстом», корректного числового результата от ВЫРАЗИТЬ вы не получите — нужны обходные приёмы из следующих разделов.

Способ 1: преобразование через ВЫБОР с перечислением значений

Когда набор строковых значений конечен и известен (например, оценки «1»–«5», коды статусов, месяцы текстом), самый надёжный вариант — конструкция ВЫБОР:

ВЫБОР

КОГДА Таб.Оценка = "1" ТОГДА 1

КОГДА Таб.Оценка = "2" ТОГДА 2

КОГДА Таб.Оценка = "3" ТОГДА 3

КОГДА Таб.Оценка = "4" ТОГДА 4

КОГДА Таб.Оценка = "5" ТОГДА 5

ИНАЧЕ 0

КОНЕЦ КАК ОценкаЧислом

Ветка ИНАЧЕ обязательна: она защищает от NULL и от значений, не попавших в список (пробелы, пустые строки, опечатки). Без неё результат для непредусмотренных строк будет NULL, что сломает суммирование и сравнения дальше по запросу.

Ограничение очевидно: способ не масштабируется на произвольные числа. Перечислять тысячу вариантов в запросе нельзя — запрос станет нечитаемым и медленным. Для диапазонов больше 10–20 значений переходите к таблице чисел.

Способ 2: соединение с таблицей чисел

Если строковые значения — целые числа в известном диапазоне (например, порядковые номера от 0 до 999), работает приём «таблица чисел»: создаётся виртуальная таблица, где каждому числу соответствует его строковое представление, и к ней делается соединение.

Таблицу чисел можно построить через последовательность ВЫБРАТЬ ... ОБЪЕДИНИТЬ ВСЕ с литералами, либо взять из подходящего системного регистра, где числа уже есть (например, периоды или порядковые номера). Соединение выполняется по условию СтроковоеПоле = ПРЕДСТАВЛЕНИЕ(Число) или по заранее сформированной паре «строка — число» во временной таблице.

ВЫБРАТЬ 0 КАК Ч, "0" КАК С

ПОМЕСТИТЬ Числа

ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, "1"

ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, "2"

;

ВЫБРАТЬ Т.Артикул, Числа.Ч КАК АртикулЧислом

ИЗ Данные КАК Т

ЛЕВОЕ СОЕДИНЕНИЕ Числа ПО Т.Артикул = Числа.С

Учитывайте формат строки: ПРЕДСТАВЛЕНИЕ числа может содержать неразрывные пробелы-разделители разрядов («1 000»), поэтому для больших чисел строковые литералы во временной таблице надо задавать вручную, в точности совпадающие с данными. Проверяйте на реальных значениях, а не на предположениях о формате.

Как построить преобразование через таблицу чисел
  1. 1
    Определите диапазон и формат строковых значений в данных (есть ли пробелы, ведущие нули)
  2. 2
    Сформируйте временную таблицу пар «число — строка» через ОБЪЕДИНИТЬ ВСЕ
  3. 3
    Соедините основную таблицу с таблицей чисел по строковому полю
  4. 4
    Добавьте обработку несоединившихся строк (NULL) через ЕСТЬNULL
  5. 5
    Проверьте результат в консоли запросов на граничных значениях

Способ 3: преобразование после запроса — в коде или СКД

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

В СКД есть вычисляемые поля: на закладке «Вычисляемые поля» задаётся выражение на языке 1С, где доступны функции преобразования. Это удобно для отчётов: запрос остаётся простым, а приведение типов выполняется при формировании. Также в СКД работает функция Формат и вычисляемые выражения в ресурсах.

Третий вариант — исправить данные в источнике. Если строковое поле постоянно используется как число, это признак ошибки проектирования: корректнее добавить числовой реквизит и заполнить его обработкой, а запросы строить уже по нему. Разовая миграция данных дешевле постоянных обходных путей в каждом отчёте.

Сравнение способов

ВЫБОР с перечислением

Подходит для 2–20 известных значений; не масштабируется на произвольные числа

Таблица чисел + соединение

Работает для диапазонов целых чисел; требует точного совпадения формата строк

Постобработка в коде или СКД

Универсально и безопасно; результат запроса остаётся строкой до обработки

Числовой реквизит в данных

Правильное долгосрочное решение; требует изменения конфигурации и миграции

Сортировка строковых чисел: типовая задача и её решение

Самый частый практический повод для темы — сортировка. Коды, артикулы и номера хранятся строками, и УПОРЯДОЧИТЬ ПО даёт «1, 10, 11, 2, 3». Если менять данные нельзя, а диапазон значений ограничен, применяют трюк с дополнением строки ведущими пробелами или нулями до фиксированной длины — тогда лексикографический порядок совпадает с числовым.

В запросе это реализуется через ПОДСТРОКА и конкатенацию: например, взять последние N символов строки «000000» + значение. Приём громоздкий, но рабочий для сортировки в отчётах. Альтернатива — та же таблица чисел с соединением и упорядочиванием по числовой колонке.

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

Типичные ошибки
01
Использовать ВЫРАЗИТЬ(Строка КАК ЧИСЛО) как парсер — результат непредсказуем и зависит от СУБД
02
Забыть ветку ИНАЧЕ в ВЫБОР — непредусмотренные строки превращаются в NULL и ломают итоги
03
Не учесть пробелы-разделители разрядов в представлении чисел — соединение по строке не срабатывает
04
Сортировать строковое поле и ожидать числовой порядок — получаете «10» раньше «2»
05
Тащить преобразование в каждый запрос вместо одного числового реквизита в данных

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

Любой обходной приём нужно проверять на реальных данных. Минимальный набор контрольных точек: пустая строка и NULL, строка с пробелами, значение с ведущими нулями («007»), отрицательное число текстом, значение с дробной частью и нечисловой мусор (буквы, дефисы). Каждый из этих случаев способен сломать соединение или ВЫБОР.

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

Помните и о производительности: соединение по строковому полю без индекса на больших таблицах работает медленно, а конструкции ВЫБОР с десятками веток увеличивают время компиляции запроса. Если преобразование нужно регулярно и на больших объёмах — это аргумент за изменение структуры данных, а не за усложнение запросов.

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

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

Тип колонки результата в консоли запросов
Норма

Число с нужной разрядностью

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

Строка или NULL там, где ожидалось число

Граничные значения (пусто, пробелы, ведущие нули)
Норма

Обработаны через ИНАЧЕ или ЕСТЬNULL

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

NULL или пропавшие строки

Порядок сортировки
Норма

2 идёт раньше 10

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

Лексикографический порядок «1, 10, 2»

Строки без соединения
Норма

Количество несоединившихся равно нулю или известно

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

Часть данных молча потеряна

FAQ

Можно ли в запросе 1С преобразовать строку «123» в число 123 напрямую?

Нет, штатной функции парсинга строки в число в языке запросов нет. Используйте ВЫБОР с перечислением значений, соединение с таблицей чисел или преобразование после выполнения запроса — в коде, вычисляемых полях СКД или при заполнении таблицы значений.

Чем ВЫРАЗИТЬ отличается от преобразования типа?

ВЫРАЗИТЬ только уточняет тип поля: сужает составной тип до одного значения или задаёт длину и точность. Она не разбирает текст и не превращает строку в число — значение уже должно иметь соответствующий тип в данных.

Почему ПРЕДСТАВЛЕНИЕ числа даёт строку с пробелами?

При формировании представления числа платформа может вставлять разделители групп разрядов — неразрывные пробелы, например «1 000». Поэтому сравнивать такое представление со строкой «1000» бесполезно: соединение и сравнение не сработают. Учитывайте формат при построении таблицы чисел.

Как отсортировать строковые коды как числа, не меняя данные?

Три рабочих варианта: соединение с таблицей чисел и упорядочивание по числовой колонке; дополнение строки ведущими нулями до фиксированной длины через ПОДСТРОКУ и конкатенацию; либо сортировка уже после запроса — в таблице значений по добавленной числовой колонке.

Что делать со строками, которые не преобразовались?

Обязательно предусмотрите ветку ИНАЧЕ в ВЫБОР или ЕСТЬNULL после соединения, а затем выполните аудит: отдельным запросом выберите все значения, не попавшие в преобразование. Обычно там пробелы, буквы или устаревшие форматы кодов, которые нужно исправлять в данных.

Когда стоит менять структуру данных вместо трюков в запросе?

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

Итог

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

Прямого преобразования строки в число в запросе 1С не существует: ПРЕДСТАВЛЕНИЕ работает только в сторону строки, а ВЫРАЗИТЬ не парсит текст. Для известных значений используйте ВЫБОР, для диапазонов — таблицу чисел, для универсальности — постобработку в коде или СКД, а при постоянной потребности — числовой реквизит в данных.