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

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

Ошибка «Преобразование к типу Число не может быть выполнено» в 1С: причины и исправление

Разбираем ошибку «Преобразование значения к типу Число не может быть выполнено» в 1С: причины, типовые места возникновения, способы исправления в коде и запросах.

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

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

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

Что означает эта ошибка и когда она возникает

Платформа 1С умеет автоматически преобразовывать значения между типами, но только если преобразование однозначно. Строка «123,45» станет числом без проблем, а строка «1 234,56» (с пробелом-разделителем разрядов), «12а3», «Н/Д» или пустая строка — нет. В этот момент и возникает исключение «Преобразование значения к типу Число не может быть выполнено».

Типичные ситуации возникновения:

  • явный вызов Число(СтроковоеЗначение) в коде;
  • арифметическая операция, где один из операндов — строка, которую платформа пытается привести к числу;
  • приведение типов в запросе через ВЫРАЗИТЬ(... КАК ЧИСЛО(...));
  • загрузка данных из Excel, CSV, XML, где числовые поля содержат текст или пробелы;
  • обмен данными, когда в числовой реквизит пришло нечисловое значение;
  • работа с NULL в запросе при числовых операциях.
Ошибка у пользователя в типовой конфигурацииПроблема в данных

Проверить введённые значения: количество, цена, сумма — нет ли букв, пробелов, лишних символов

Ошибка при загрузке из Excel/CSVГрязные данные в файле

Открыть файл и поискать неразрывные пробелы, текст в числовых колонках, пустые ячейки

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

Проверить соединения таблиц (NULL при левом соединении) и ВЫРАЗИТЬ к числу

Ошибка после обновления конфигурацииИзменился формат данных

Сравнить поведение на копии базы, проверить журнал регистрации

Как найти место возникновения ошибки

Первый шаг — понять, в какой строке кода или в каком объекте происходит сбой. Текст ошибки обычно содержит указание на модуль и строку, например: {Документ.РеализацияТоваровУслуг.МодульОбъекта(145)}: Преобразование значения к типу Число не может быть выполнено. Число в скобках — номер строки модуля.

Если ошибка возникает у пользователя без указания строки, полезные источники информации:

  • Журнал регистрации (Администрирование → Обслуживание → Журнал регистрации) — там фиксируются ошибки с контекстом;
  • Конфигуратор с отладкой — запуск базы под отладчиком с остановкой по ошибке покажет точное место и значения переменных;
  • Технологический журнал — для серверных баз, когда ошибка происходит на сервере и не видна в клиенте.

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

Порядок локализации ошибки
  1. 1
    Прочитайте полный текст ошибки: найдите имя модуля и номер строки
  2. 2
    Откройте указанный модуль в конфигураторе и перейдите к строке
  3. 3
    Определите, какая переменная участвует в преобразовании
  4. 4
    Запустите отладку с остановкой по ошибке и посмотрите фактическое значение переменной
  5. 5
    Проверьте источник значения: откуда оно пришло (файл, реквизит, запрос, ввод пользователя)
  6. 6
    Выберите способ исправления: очистка данных, проверка перед преобразованием или обработка NULL

Исправление в коде: безопасное преобразование строки в число

Очистка строки перед преобразованием

Самая частая причина — пробелы и неразрывные пробелы (символ с кодом 160, который часто приходит из Excel и веб-страниц как разделитель разрядов). Также встречаются запятые вместо точек, символы валют и буквы «О» вместо нуля. Перед преобразованием строку нужно очистить:

СтрокаЧисла = "1 234,56";

СтрокаЧисла = СтрЗаменить(СтрокаЧисла, Символ(160), ""); // неразрывный пробел

СтрокаЧисла = СтрЗаменить(СтрокаЧисла, " ", ""); // обычный пробел

СтрокаЧисла = СтрЗаменить(СтрокаЧисла, ",", "."); // запятая в точку

Результат = Число(СтрокаЧисла);

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

Проверка перед преобразованием через попытку

Если заранее неизвестно, корректна ли строка, безопасный вариант — обернуть преобразование в попытку и задать значение по умолчанию:

Функция СтрокаВЧисло(Знач Строка, ЗначениеПоУмолчанию = 0)

Строка = СтрЗаменить(Строка, Символ(160), "");

Строка = СтрЗаменить(Строка, " ", "");

Строка = СтрЗаменить(Строка, ",", ".");

Попытка

Возврат Число(Строка);

Исключение

Возврат ЗначениеПоУмолчанию;

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

КонецФункции

Такая функция удобна при загрузке внешних данных: вместо падения всей обработки на одной «плохой» строке вы получаете ноль (или другое значение по умолчанию) и можете записать проблемную строку в протокол загрузки.

bsl
Попытка
    Результат = Число(СтрЗаменить(ИсходнаяСтрока, Символ(160), ""));
Исключение
    Результат = 0;
    ЗаписьЖурналаРегистрации("ЗагрузкаДанных", УровеньЖурналаРегистрации.Предупреждение,,, "Не удалось преобразовать: " + ИсходнаяСтрока);
КонецПопытки;

Ошибка в запросе: NULL и ВЫРАЗИТЬ

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

От NULL защищает функция ЕСТЬNULL():

ВЫБРАТЬ

ЕСТЬNULL(Остатки.Количество, 0) КАК Количество

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки

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

Отдельный случай — сравнение или арифметика с полями составного типа. Если реквизит может хранить и строку, и число, платформа в операции сложения попытается привести строку к числу и упадёт с той же ошибкой. Решение — сузить тип значения перед операцией через ВЫРАЗИТЬ с предварительной фильтрацией по типу через ВЫБОР КОГДА ... ТОГДА.

Ошибка при загрузке данных из Excel и внешних файлов

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

Практический порядок действий:

  • перед загрузкой откройте файл и проверьте формат проблемных колонок: выделите колонку и посмотрите, выравнены ли значения по правому краю (числа) или по левому (текст);
  • в обработке загрузки применяйте очистку строки и преобразование через попытку, как показано выше;
  • ведите протокол: фиксируйте номер строки файла и исходное значение, которое не удалось преобразовать, — это ускорит разбор проблемных позиций;
  • не прерывайте всю загрузку из-за одной строки, если это допустимо по смыслу: пропустите строку с записью в протокол.

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

Типичные ошибки при исправлении
01
Использовать только СокрЛП() — он не убирает пробелы внутри числа и неразрывные пробелы между разрядами
02
Заменять точку на запятую или наоборот без анализа формата — в разных файлах разделитель дробной части разный
03
Глушить ошибку пустой попыткой без протоколирования — проблемные данные теряются незаметно
04
Править код типовой конфигурации без расширения — при следующем обновлении исправление будет потеряно
05
Исправлять код, когда проблема в данных пользователя — ошибка вернётся при следующем вводе

Ошибка у пользователя в типовой конфигурации: что проверить без программирования

Если ошибка возникает в типовой конфигурации (1С:Бухгалтерия, Управление торговлей, ERP) у обычного пользователя, чаще всего причина — в данных, а не в коде. Начните с простого:

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

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

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

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

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

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

Повторение операции на проблемных данных
Норма

Операция завершается, значения корректны

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

Ошибка повторяется или число превращается в ноль там, где должно быть реальное значение

Протокол загрузки
Норма

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

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

Строки пропущены молча, итоговые суммы не сходятся с файлом

Отчёты и итоги после исправления
Норма

Суммы совпадают с ожидаемыми

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

Появились нулевые значения там, где раньше были числа

Для профилактики в собственных разработках придерживайтесь простых правил: никогда не вызывайте Число() от непроверенной строки без попытки; очищайте входные данные от пробелов и неразрывных пробелов; в запросах оборачивайте числовые поля соединений в ЕСТЬNULL(); при обменах валидируйте значения до записи в базу.

Итог

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

Ошибка означает, что в число преобразуется нечисловое значение: строка с пробелами или буквами, пустое значение, NULL. Найдите место по тексту ошибки или отладкой, очистите строку через СтрЗаменить, используйте попытку со значением по умолчанию, в запросах применяйте ЕСТЬNULL. Массовые исправления делайте только на копии базы.

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

Почему СокрЛП() не помогает убрать ошибку?

СокрЛП() удаляет только пробельные символы в начале и конце строки. Если пробел или неразрывный пробел стоит внутри числа как разделитель разрядов («1 234»), он останется, и преобразование снова завершится ошибкой. Используйте СтрЗаменить() для удаления символов внутри строки.

Число выглядит нормально, но ошибка всё равно возникает. Что не так?

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

Ошибка возникает в запросе, хотя поле числовое. Почему?

При левом соединении таблиц поле может принимать значение NULL, если в присоединяемой таблице нет подходящей записи. Арифметика с NULL вызывает ошибку или даёт NULL. Оберните поле в ЕСТЬNULL(Поле, 0). Также проверьте, не используется ли ВЫРАЗИТЬ к числу над строковым полем с нечисловыми значениями.

Можно ли исправить ошибку, не меняя код конфигурации?

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

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

Определите формат по источнику данных: в файлах из русскоязычного Excel чаще запятая, в выгрузках из веб-систем — точка. Универсальный приём — заменить запятую на точку после удаления пробелов, но следите, чтобы точка не использовалась как разделитель разрядов (например, «1.234.567»): в таком случае сначала убираются разделители разрядов, потом обрабатывается дробная часть.

Чем опасно просто обернуть весь код в Попытка/Исключение без обработки?

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