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

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

Число как текст в 1С: причины, преобразование и практические решения

Как в 1С преобразовать число в строку и обратно, почему числа сохраняются как текст в Excel и справочниках, типовые функции Формат, Строка, Число и обработка ошибок.

При загрузке из Excel или обмене с сайтом в 1С нередко оказывается, что сумма хранится как строка: сортировка идёт «1, 10, 2», итоги не считаются, а запрос не находит нужное значение. Обратная задача встречается так же часто — число требуется вывести строкой в печатную форму, наименование или файл обмена. Дальше разберём обе ситуации: как преобразовать типы в коде и запросах и как определить, где именно «потерялся» числовой формат.

Ключевая проблема в том, что платформа 1С строго различает типы «Число» и «Строка». Сравнение "10" > "9" для строк даст результат «истина», потому что строки сравниваются посимвольно, а не по числовому значению. Из-за этого документы сортируются неправильно, итоги не сходятся, а отборы в отчётах «не находят» данные.

Ниже разобраны практические приёмы: как преобразовать число в строку и обратно во встроенном языке, как исправить данные, загруженные как текст, как работать с типами в запросах и как не сломать учёт при исправлении реквизитов.

Когда число становится текстом и почему это проблема

Чаще всего число оказывается строкой после загрузки данных из внешних источников: Excel, CSV, веб-сервисов, обменов с сайтом. Файл Excel может хранить значение с зелёным треугольником «число сохранено как текст» — при чтении через COM-объект или табличный документ 1С получает именно строку. То же происходит при разборе XML и JSON, где все значения изначально текстовые.

Второй источник — проектные решения. Разработчики нередко делают реквизит «Количество» или «Цена» строковым, чтобы хранить «договорную» цену, диапазоны или значения с единицами измерения («от 100 до 500»). Через год такой реквизит невозможно суммировать в отчётах без дополнительной обработки.

Признаки того, что числа хранятся как текст: сортировка идёт в порядке 1, 10, 100, 2, 20; итоги по колонке в динамическом списке или отчёте не считаются; сравнение в отборе СКД работает неожиданно; при выгрузке в Excel значения помечены как текст.

Сортировка1, 10, 2, 25, 3

Значения сравниваются посимвольно — тип данных строковый

ИтогиНе считаются или равны нулю

Числовые итоги по строковой колонке платформа не суммирует

ExcelЗелёный треугольник в ячейке

Значение сохранено как текст, при загрузке в 1С придёт строкой

ОтборОтбор по значению ничего не находит

Тип параметра отбора не совпадает с типом поля

Преобразование числа в строку во встроенном языке

Базовый способ — функция Строка(Значение). Она возвращает строковое представление числа, но результат зависит от региональных настроек сеанса: группы разрядов могут разделяться неразрывными пробелами, а дробная часть — запятой. Строка Строка(12345.67) может выглядеть как «12 345,67», что неприемлемо для XML, CSV и форматов обмена, где ожидается точка и отсутствие разделителей разрядов.

Для контролируемого вывода используют функцию Формат(Значение, ФорматнаяСтрока). Конструкция Формат(Сумма, "ЧГ=; ЧРД=.; ЧН=0") убирает группировку разрядов, задаёт точку разделителем дробной части и выводит ноль вместо пустой строки для нулевого значения. Именно такой вариант применяют при формировании файлов обмена.

Для печатных форм и прописей сумм применяют ЧислоПрописью() и форматную строку с локализацией, например Формат(Сумма, "ЧПР; Л=ru_RU") в сочетании с параметрами предмета исчисления. Это даёт корректную сумму прописью в счетах и договорах.

1c
Сумма = 12345.67;
СтрокаПростая = Строка(Сумма); // "12 345,67" — зависит от настроек
СтрокаДляФайла = Формат(Сумма, "ЧГ=; ЧРД=.; ЧН=0"); // "12345.67"
СуммаПрописью = ЧислоПрописью(Сумма, "Л=ru_RU", "рубль, рубля, рубля, м, копейка, копейки, копеек, ж, 2");

Преобразование строки в число

Функция Число(Строка) преобразует строку в число, но требовательна к формату: пробелы-разделители разрядов, запятая вместо точки, буквы и служебные символы вызывают ошибку «Преобразование значения к типу Число не может быть выполнено». Перед преобразованием строку нужно очистить.

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

Для проверки без исключений удобно использовать ОписаниеТипа с квалификатором числа и метод ПривестиЗначение(): он вернёт 0 для нечисловых строк вместо ошибки. Это безопасный вариант при массовой загрузке, когда качество данных неизвестно.

1c
Процедура СтрокаВЧисло(Стр, Результат)
    Подготовленная = СтрЗаменить(Стр, Символ(160), ""); // неразрывный пробел
    Подготовленная = СтрЗаменить(Подготовленная, " ", "");
    Подготовленная = СтрЗаменить(Подготовленная, ",", ".");
    Попытка
        Результат = Число(Подготовленная);
    Исключение
        Результат = 0; // или запись в журнал ошибок
    КонецПопытки;
КонецПроцедуры

Работа с типами в запросах

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

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

При соединении таблиц по полю, которое в одной таблице числовое, а в другой строковое, приводите обе стороны к одному типу явно. Неявное сравнение разных типов в запросе либо даст пустой результат, либо ошибку — в зависимости от контекста.

Исправление данных, загруженных как текст

Если реквизит справочника или документа имеет составной тип (строка и число) и часть данных записана строками, исправлять вручную каждый элемент долго и рискованно. Правильный путь — обработка: запросом выбрать объекты, где реквизит имеет строковый тип, преобразовать значение и записать объект.

Проверить тип значения в коде можно функцией ТипЗнч(Значение) в сравнении с Тип("Строка"). Перед массовой обработкой обязательно сделайте копию базы и прогоните обработку на копии: проверьте, что итоги отчётов после исправления сходятся с ожиданиями.

Порядок исправления данных
  1. 1
    Сделайте резервную копию информационной базы
  2. 2
    Запросом выберите объекты, где реквизит хранит строку вместо числа
  3. 3
    В цикле очистите строку от пробелов и замените разделитель
  4. 4
    Преобразуйте значение функцией Число() внутри Попытка/Исключение
  5. 5
    Запишите объект, ошибочные строки зафиксируйте в журнале
  6. 6
    Сверьте итоги отчётов до и после обработки на копии базы

Числа как текст при обмене с Excel и внешними системами

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

При выгрузке из 1С в Excel обратная проблема: коды с ведущими нулями (артикулы, ИНН, номера договоров) Excel автоматически превращает в числа и «съедает» нули. Чтобы этого не случилось, такие поля нужно передавать как текст с явным форматом ячейки, а в коде выгрузки использовать строковое представление без попытки преобразования к числу.

В обменах через XML и JSON помните: JSON различает число и строку на уровне формата, а XML — нет. Если контрагентская система присылает суммы строками, нормализуйте их при чтении, а не храните «как есть» в надежде разобраться позже.

Типичные ошибки
01
Использовать Строка() для выгрузки в файл обмена — в файл попадают пробелы-разделители и запятая вместо точки
02
Вызывать Число() без Попытка/Исключение — одна битая строка останавливает всю загрузку
03
Сравнивать строковое поле с числовым параметром в запросе — отбор молча ничего не находит
04
Менять тип реквизита в конфигураторе без копии базы — нечисловые значения теряются при обновлении
05
Забывать про неразрывный пробел (символ 160) — Число() падает на строках, которые выглядят чистыми

Проверка результата и контрольные точки

После любого преобразования или исправления данных проверьте результат на контрольных примерах: ноль, отрицательное число, число с дробной частью, большое число с разрядами, строка с валютой. Убедитесь, что сортировка стала числовой (1, 2, 10, 25), итоги считаются, а выгрузка в файл открывается без замечаний со стороны принимающей системы.

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

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

Сортировка списка по реквизиту
Норма

Порядок 1, 2, 10, 25, 100

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

Порядок 1, 10, 100, 2, 25

Итог по колонке в отчёте
Норма

Сумма считается и совпадает с контрольным расчётом

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

Итог пустой, нулевой или меньше ожидаемого

Выгрузка в файл обмена
Норма

Числа без пробелов, дробная часть через точку

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

Разделители разрядов, запятая, пустые значения вместо нуля

Журнал загрузки
Норма

Все строки обработаны, ошибки зафиксированы списком

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

Загрузка прервалась на первой ошибочной строке

Итог

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

Число в строку — через Формат() с явной форматной строкой, строку в число — через Число() после очистки и внутри Попытка/Исключение, в запросах — через ВЫРАЗИТЬ. Массовое исправление данных делается обработкой на копии базы с последующей сверкой итогов.

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

Почему Число() выдаёт ошибку на строке, где видно только цифры?

Чаще всего в строке есть неразрывный пробел (код 160) — он визуально неотличим от обычного и попадает в данные при копировании из Excel или веб-страниц. Удалите его через СтрЗаменить(Строка, Символ(160), "") перед преобразованием.

Как вывести число без разделителей разрядов в печатной форме?

Используйте Формат(Значение, "ЧГ=") — пустое значение параметра ЧГ отключает группировку разрядов. Для файлов обмена дополнительно задайте ЧРД=. чтобы дробная часть отделялась точкой.

Можно ли в запросе сложить значения строкового реквизита?

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

Что будет, если изменить тип реквизита со «Строка» на «Число» в конфигураторе?

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

Как сохранить ведущие нули в артикуле при выгрузке в Excel?

Храните такие коды в строковых реквизитах и передавайте в Excel как текст, задавая ячейке текстовый формат. Если преобразовать значение в число, ведущие нули будут утеряны безвозвратно для выгрузки.

Чем ЧислоПрописью() отличается от Формат() с прописью?

ЧислоПрописью() позволяет явно задать параметры предмета исчисления (рубль/копейка, штука и т.п.) и локаль, что удобно для денежных сумм в документах. Форматная строка с ЧПР выводит число прописью без гибкой настройки единиц измерения.