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

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

1С: число сохранено как текст — как найти причину и исправить

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

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

Чаще всего проблема возникает при загрузке данных из Excel, при обмене между конфигурациями, при программном преобразовании значений через функцию Строка() или когда разработчик реквизита выбрал тип «Строка» вместо «Число». Реже виноваты настройки региональных форматов, неразрывные пробелы и невидимые символы в исходных данных.

Исправить ситуацию можно несколькими способами: от простого преобразования в пользовательском режиме до корректировки типа реквизита в конфигураторе. Выбор зависит от того, где именно хранится значение — в реквизите объекта, в таблице значений обработки, в результате запроса или в файле-источнике. Ниже разобраны типичные сценарии и безопасные способы решения.

Как понять, что число хранится как текст

Признаки строкового хранения чисел видны даже без конфигуратора. В списках и отчётах такие значения сортируются лексикографически: после «9» идёт «10», а не «100». При группировке в отчётах на СКД суммы по таким полям равны нулю или поле вообще недоступно для агрегации — система не умеет суммировать строки.

В формах ввода строковое поле с числом обычно выравнено по левому краю (числа в 1С выравниваются вправо), не имеет кнопок увеличения-уменьшения и позволяет ввести буквы. При выгрузке в Excel такие ячейки получают зелёный маркер «число сохранено как текст» и не участвуют в формулах суммирования.

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

Порядок лексикографический, а не арифметический — значение строковое

Итоги в отчётеНоль или пусто

СКД не суммирует строки, поле недоступно для агрегирования

Выравнивание в полеПо левому краю

Числовые поля 1С выравниваются вправо

Excel после выгрузкиЗелёный треугольник

Excel сам сигнализирует: число сохранено как текст

Почему число превращается в текст: основные причины

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

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

Отдельный случай — составной тип реквизита. Если реквизит допускает и строку, и число, конкретное значение могло быть записано как строка. В запросе такое поле вернёт смешанные данные, и агрегатные функции поведут себя непредсказуемо.

Исправление в пользовательском режиме

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

При проблеме «число как текст» в выгруженном Excel исправляйте уже в Excel: выделите столбец, используйте «Данные → Текст по столбцам → Готово» или умножьте диапазон на 1 через «Специальную вставку». Предварительно убедитесь, что в ячейках нет неразрывных пробелов — их заменяют через «Найти и заменить» (в поле поиска вставьте символ с кодом 0160 через Alt).

Если данные загружаются из Excel в 1С типовой обработкой загрузки, откройте исходный файл и принудительно установите для числовых колонок формат «Числовой», уберите пробелы-разделители разрядов. После этого повторите загрузку — большинство типовых механизмов корректно распознают числовые ячейки.

Порядок действий в пользовательском режиме
  1. 1
    Определите, где проявляется проблема: в отчёте, списке или выгрузке в Excel
  2. 2
    Проверьте сортировку колонки — лексикографический порядок подтверждает текстовый формат
  3. 3
    Если проблема в Excel — преобразуйте ячейки через «Текст по столбцам» или умножение на 1
  4. 4
    Если проблема при загрузке — исправьте формат в исходном файле и загрузите заново
  5. 5
    Если тип реквизита строковый — передайте задачу разработчику, самостоятельно тип не изменить

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

Во встроенном языке 1С для преобразования используется функция Число(Значение). Она корректно обрабатывает строки вида «123,45» и «123.45» в зависимости от региональных настроек, но возвращает 0 или вызывает ошибку, если в строке есть посторонние символы. Поэтому перед преобразованием строку очищают.

Типовой безопасный шаблон выглядит так: сначала удаляются пробелы (включая неразрывные), затем при необходимости запятая заменяется на точку или наоборот, и только потом вызывается Число(). Для проверки результата удобно сравнивать исходную строку с обратным преобразованием или оборачивать вызов в попытку-исключение.

СтрокаЧисло = "1 250,75";

Очищенная = СтрЗаменить(СтрокаЧисло, Символ(160), "");

Очищенная = СтрЗаменить(Очищенная, " ", "");

Очищенная = СтрЗаменить(Очищенная, ",", ".");

Попытка

ЗначениеЧисло = Число(Очищенная);

Исключение

ЗначениеЧисло = 0;

КонецПопытки;

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

bsl
ВЫБРАТЬ ВЫРАЗИТЬ(Таб.СтроковоеПоле КАК ЧИСЛО(15, 2)) КАК Сумма ИЗ Документ.Реализация КАК Таб

Когда нужно менять тип реквизита в конфигураторе

Если числовые данные систематически хранятся в строковом реквизите, правильное решение — изменить тип реквизита на «Число» с нужной длиной и точностью. Это делается в конфигураторе: свойства реквизита → Тип → Число, далее указываются длина и число знаков после запятой. После обновления конфигурации базы данных платформа попытается преобразовать существующие значения.

Здесь есть серьёзный риск: строки, которые нельзя преобразовать в число (пустые значения, тексты, коды с буквами), при реструктуризации будут потеряны или превращены в нули. Поэтому перед изменением типа обязательно сделайте резервную копию и проанализируйте фактические данные запросом — выберите все distinct-значения реквизита и проверьте, все ли они числовые.

Если в поле смешаны числа и тексты (например, «10», «15,5», «нет»), прямое изменение типа недопустимо. Сначала обработкой приведите данные к единому виду или перенесите числовые значения в новый числовой реквизит, а старый оставьте для истории.

Проблема при загрузке из Excel и обменах

При чтении Excel через ТабличныйДокумент.Прочитать() или COM-объект значение ячейки часто приходит как строка, потому что в файле ячейка имеет текстовый формат. Надёжный подход — читать не отображаемый текст, а значение ячейки (через COM: Cells.Value вместо Cells.Text), либо явно преобразовывать каждое значение функцией Число() с предварительной очисткой.

В обменах через CSV и текстовые файлы обращайте внимание на разделитель дробной части: файл с точкой, загруженный в систему с запятой в региональных настройках (или наоборот), даст либо ошибку, либо строку. Унифицируйте формат на этапе формирования файла или нормализуйте разделитель при чтении.

При выгрузке из 1С в Excel обратная задача: чтобы числа не сохранялись как текст, записывайте в ячейки именно числовые значения, а не Строка(Сумма). В табличном документе для числовых ячеек задавайте тип значения «Число» — тогда Excel получит настоящие числа без зелёных маркеров.

Типичные ошибки
01
Использование Строка(Сумма) при выгрузке в Excel — все числа становятся текстом и не суммируются
02
Преобразование Число() без очистки от неразрывных пробелов — результат 0 или исключение
03
Смена типа реквизита без копии и анализа данных — потеря нечисловых значений при реструктуризации
04
Чтение Cells.Text вместо Cells.Value при загрузке из Excel — числа приходят строками
05
Игнорирование разделителя дробной части при обмене файлами между системами с разными региональными настройками

Проверка результата и выбор подходящего способа

После исправления убедитесь, что проблема решена полностью. Отсортируйте список по проблемной колонке — порядок должен стать арифметическим. Постройте отчёт с группировкой и суммой по полю — итоги должны считаться. Выгрузите в Excel — зелёные маркеры должны исчезнуть, а формула СУММ по столбцу — работать.

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

Маршрут решения

Как выбрать действие

Проблема только в выгруженном файле ExcelПреобразуйте ячейки в Excel: Текст по столбцам или умножение на 1
Числа как текст при загрузке из файла в 1СИсправьте формат ячеек в источнике или добавьте очистку и Число() в обработку загрузки
Строковый реквизит системно хранит числаПланируйте смену типа реквизита с копией базы и анализом значений
Нужна сумма по строковому полю только в отчётеИспользуйте ВЫРАЗИТЬ(Поле КАК ЧИСЛО) в запросе, не меняя структуру
Итог

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

Число «как текст» — это всегда строковый тип хранения. Диагностируйте по сортировке и итогам, очищайте данные от неразрывных пробелов, преобразуйте через Число() или ВЫРАЗИТЬ, а тип реквизита меняйте только после резервного копирования и проверки всех значений.

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

Почему в отчёте СКД сумма по полю равна нулю, хотя числа видны?

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

Функция Число() возвращает 0, хотя в строке корректное число. В чём дело?

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

Как массово исправить числа-текст в уже загруженных документах?

Напишите обработку: запросом выберите документы, в цикле очистите строковое значение от пробелов, преобразуйте через Число() и запишите в числовой реквизит. Запускайте сначала на копии базы и на небольшой выборке, проверяя результат вручную.

Можно ли в запросе отфильтровать только те строки, где поле действительно число?

Да, с помощью условия ПОДОБНО с шаблоном цифр, например проверки, что поле содержит только цифры и разделитель. Точный шаблон зависит от СУБД, поэтому надёжнее выгрузить distinct-значения и проанализировать их, либо использовать ВЫРАЗИТЬ и отсекать NULL-результаты.

Почему при выгрузке в Excel из 1С числа становятся текстом?

Потому что в ячейку табличного документа записано строковое значение — например, через Строка(Сумма) или Формат(). Записывайте само числовое значение и задавайте ячейке тип «Число»; форматирование при этом настраивается свойством формата ячейки, а не преобразованием значения.

Опасно ли менять тип реквизита со «Строка» на «Число» в рабочей базе?

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