Разработка и Конфигурация · 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Определите диапазон и формат строковых значений в данных (есть ли пробелы, ведущие нули)
- 2Сформируйте временную таблицу пар «число — строка» через ОБЪЕДИНИТЬ ВСЕ
- 3Соедините основную таблицу с таблицей чисел по строковому полю
- 4Добавьте обработку несоединившихся строк (NULL) через ЕСТЬNULL
- 5Проверьте результат в консоли запросов на граничных значениях
Способ 3: преобразование после запроса — в коде или СКД
Часто правильный ответ — не мучить запрос, а преобразовать данные на следующем этапе. Если результат запроса выгружается в таблицу значений, добавьте колонку с нужным типом и заполните её в цикле, используя обычное преобразование Число(Строка) с защитой через попытку или предварительную проверку содержимого.
В СКД есть вычисляемые поля: на закладке «Вычисляемые поля» задаётся выражение на языке 1С, где доступны функции преобразования. Это удобно для отчётов: запрос остаётся простым, а приведение типов выполняется при формировании. Также в СКД работает функция Формат и вычисляемые выражения в ресурсах.
Третий вариант — исправить данные в источнике. Если строковое поле постоянно используется как число, это признак ошибки проектирования: корректнее добавить числовой реквизит и заполнить его обработкой, а запросы строить уже по нему. Разовая миграция данных дешевле постоянных обходных путей в каждом отчёте.
Сравнение способов
Подходит для 2–20 известных значений; не масштабируется на произвольные числа
Работает для диапазонов целых чисел; требует точного совпадения формата строк
Универсально и безопасно; результат запроса остаётся строкой до обработки
Правильное долгосрочное решение; требует изменения конфигурации и миграции
Сортировка строковых чисел: типовая задача и её решение
Самый частый практический повод для темы — сортировка. Коды, артикулы и номера хранятся строками, и УПОРЯДОЧИТЬ ПО даёт «1, 10, 11, 2, 3». Если менять данные нельзя, а диапазон значений ограничен, применяют трюк с дополнением строки ведущими пробелами или нулями до фиксированной длины — тогда лексикографический порядок совпадает с числовым.
В запросе это реализуется через ПОДСТРОКА и конкатенацию: например, взять последние N символов строки «000000» + значение. Приём громоздкий, но рабочий для сортировки в отчётах. Альтернатива — та же таблица чисел с соединением и упорядочиванием по числовой колонке.
Если сортировка выполняется уже в таблице значений после запроса, задача решается тривиально: добавить числовую колонку, заполнить и вызвать метод сортировки по ней. Это почти всегда проще и понятнее, чем изощрения в тексте запроса.
Проверка результата и границы применимости
Любой обходной приём нужно проверять на реальных данных. Минимальный набор контрольных точек: пустая строка и NULL, строка с пробелами, значение с ведущими нулями («007»), отрицательное число текстом, значение с дробной частью и нечисловой мусор (буквы, дефисы). Каждый из этих случаев способен сломать соединение или ВЫБОР.
Полезный приём — запрос-аудит: выберите из строкового поля значения, которые не соединились с таблицей чисел (условие Числа.Ч ЕСТЬ NULL), и посмотрите, что это за данные. Часто обнаруживаются пробелы, неразрывные пробелы или устаревшие форматы кодов, о которых никто не помнил.
Помните и о производительности: соединение по строковому полю без индекса на больших таблицах работает медленно, а конструкции ВЫБОР с десятками веток увеличивают время компиляции запроса. Если преобразование нужно регулярно и на больших объёмах — это аргумент за изменение структуры данных, а не за усложнение запросов.
Как проверить результат
Число с нужной разрядностью
Строка или NULL там, где ожидалось число
Обработаны через ИНАЧЕ или ЕСТЬNULL
NULL или пропавшие строки
2 идёт раньше 10
Лексикографический порядок «1, 10, 2»
Количество несоединившихся равно нулю или известно
Часть данных молча потеряна
FAQ
Можно ли в запросе 1С преобразовать строку «123» в число 123 напрямую?
Нет, штатной функции парсинга строки в число в языке запросов нет. Используйте ВЫБОР с перечислением значений, соединение с таблицей чисел или преобразование после выполнения запроса — в коде, вычисляемых полях СКД или при заполнении таблицы значений.
Чем ВЫРАЗИТЬ отличается от преобразования типа?
ВЫРАЗИТЬ только уточняет тип поля: сужает составной тип до одного значения или задаёт длину и точность. Она не разбирает текст и не превращает строку в число — значение уже должно иметь соответствующий тип в данных.
Почему ПРЕДСТАВЛЕНИЕ числа даёт строку с пробелами?
При формировании представления числа платформа может вставлять разделители групп разрядов — неразрывные пробелы, например «1 000». Поэтому сравнивать такое представление со строкой «1000» бесполезно: соединение и сравнение не сработают. Учитывайте формат при построении таблицы чисел.
Как отсортировать строковые коды как числа, не меняя данные?
Три рабочих варианта: соединение с таблицей чисел и упорядочивание по числовой колонке; дополнение строки ведущими нулями до фиксированной длины через ПОДСТРОКУ и конкатенацию; либо сортировка уже после запроса — в таблице значений по добавленной числовой колонке.
Что делать со строками, которые не преобразовались?
Обязательно предусмотрите ветку ИНАЧЕ в ВЫБОР или ЕСТЬNULL после соединения, а затем выполните аудит: отдельным запросом выберите все значения, не попавшие в преобразование. Обычно там пробелы, буквы или устаревшие форматы кодов, которые нужно исправлять в данных.
Когда стоит менять структуру данных вместо трюков в запросе?
Если преобразование нужно в нескольких отчётах, данные объёмные, а строковое поле по смыслу всегда числовое — добавьте числовой реквизит и заполните его разовой обработкой. Это ускорит запросы за счёт индексов и избавит от хрупких обходных конструкций.
Что важно запомнить
Прямого преобразования строки в число в запросе 1С не существует: ПРЕДСТАВЛЕНИЕ работает только в сторону строки, а ВЫРАЗИТЬ не парсит текст. Для известных значений используйте ВЫБОР, для диапазонов — таблицу чисел, для универсальности — постобработку в коде или СКД, а при постоянной потребности — числовой реквизит в данных.