Разработка и Конфигурация · 13 мин
Ошибка «Преобразование к типу Число не может быть выполнено» в 1С: причины и исправление
Разбираем ошибку «Преобразование значения к типу Число не может быть выполнено» в 1С: причины, типовые места возникновения, способы исправления в коде и запросах.
Ошибка «Преобразование значения к типу Число не может быть выполнено» — одна из самых частых проблем, с которой сталкиваются разработчики и пользователи 1С. Она возникает, когда платформа пытается превратить строку, дату, NULL или другой тип данных в число, но сделать это невозможно: в строке есть буквы, лишние пробелы, неразрывные пробелы, либо значение вообще пустое.
Ошибка может появляться как при работе пользователя (проведение документа, формирование отчёта, загрузка данных из Excel), так и при выполнении программного кода — в модуле объекта, в запросе или при обмене данными. Способ исправления зависит от того, где именно происходит преобразование: в явном вызове функции Число(), в неявном преобразовании при арифметической операции или в запросе.
Ниже разобраны основные причины возникновения ошибки, способы быстрой локализации проблемного места и безопасные приёмы исправления — как для разработчика, так и для пользователя, столкнувшегося с ошибкой в типовой конфигурации.
Что означает эта ошибка и когда она возникает
Платформа 1С умеет автоматически преобразовывать значения между типами, но только если преобразование однозначно. Строка «123,45» станет числом без проблем, а строка «1 234,56» (с пробелом-разделителем разрядов), «12а3», «Н/Д» или пустая строка — нет. В этот момент и возникает исключение «Преобразование значения к типу Число не может быть выполнено».
Типичные ситуации возникновения:
- явный вызов
Число(СтроковоеЗначение)в коде; - арифметическая операция, где один из операндов — строка, которую платформа пытается привести к числу;
- приведение типов в запросе через
ВЫРАЗИТЬ(... КАК ЧИСЛО(...)); - загрузка данных из Excel, CSV, XML, где числовые поля содержат текст или пробелы;
- обмен данными, когда в числовой реквизит пришло нечисловое значение;
- работа с NULL в запросе при числовых операциях.
Проверить введённые значения: количество, цена, сумма — нет ли букв, пробелов, лишних символов
Открыть файл и поискать неразрывные пробелы, текст в числовых колонках, пустые ячейки
Проверить соединения таблиц (NULL при левом соединении) и ВЫРАЗИТЬ к числу
Сравнить поведение на копии базы, проверить журнал регистрации
Как найти место возникновения ошибки
Первый шаг — понять, в какой строке кода или в каком объекте происходит сбой. Текст ошибки обычно содержит указание на модуль и строку, например: {Документ.РеализацияТоваровУслуг.МодульОбъекта(145)}: Преобразование значения к типу Число не может быть выполнено. Число в скобках — номер строки модуля.
Если ошибка возникает у пользователя без указания строки, полезные источники информации:
- Журнал регистрации (Администрирование → Обслуживание → Журнал регистрации) — там фиксируются ошибки с контекстом;
- Конфигуратор с отладкой — запуск базы под отладчиком с остановкой по ошибке покажет точное место и значения переменных;
- Технологический журнал — для серверных баз, когда ошибка происходит на сервере и не видна в клиенте.
В отладчике настройте остановку по ошибке: меню «Отладка» → «Остановка по ошибке». Воспроизведите ситуацию — выполнение прервётся ровно в проблемной строке, и вы увидите фактическое значение переменной, которое не удалось преобразовать.
- 1Прочитайте полный текст ошибки: найдите имя модуля и номер строки
- 2Откройте указанный модуль в конфигураторе и перейдите к строке
- 3Определите, какая переменная участвует в преобразовании
- 4Запустите отладку с остановкой по ошибке и посмотрите фактическое значение переменной
- 5Проверьте источник значения: откуда оно пришло (файл, реквизит, запрос, ввод пользователя)
- 6Выберите способ исправления: очистка данных, проверка перед преобразованием или обработка NULL
Исправление в коде: безопасное преобразование строки в число
Очистка строки перед преобразованием
Самая частая причина — пробелы и неразрывные пробелы (символ с кодом 160, который часто приходит из Excel и веб-страниц как разделитель разрядов). Также встречаются запятые вместо точек, символы валют и буквы «О» вместо нуля. Перед преобразованием строку нужно очистить:
СтрокаЧисла = "1 234,56";
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, Символ(160), ""); // неразрывный пробел
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, " ", ""); // обычный пробел
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, ",", "."); // запятая в точку
Результат = Число(СтрокаЧисла);
Обратите внимание: функция СокрЛП() убирает пробелы только по краям строки и не помогает против пробелов внутри числа. Для внутренних разделителей нужен именно СтрЗаменить().
Проверка перед преобразованием через попытку
Если заранее неизвестно, корректна ли строка, безопасный вариант — обернуть преобразование в попытку и задать значение по умолчанию:
Функция СтрокаВЧисло(Знач Строка, ЗначениеПоУмолчанию = 0)
Строка = СтрЗаменить(Строка, Символ(160), "");
Строка = СтрЗаменить(Строка, " ", "");
Строка = СтрЗаменить(Строка, ",", ".");
Попытка
Возврат Число(Строка);
Исключение
Возврат ЗначениеПоУмолчанию;
КонецПопытки;
КонецФункции
Такая функция удобна при загрузке внешних данных: вместо падения всей обработки на одной «плохой» строке вы получаете ноль (или другое значение по умолчанию) и можете записать проблемную строку в протокол загрузки.
Попытка
Результат = Число(СтрЗаменить(ИсходнаяСтрока, Символ(160), ""));
Исключение
Результат = 0;
ЗаписьЖурналаРегистрации("ЗагрузкаДанных", УровеньЖурналаРегистрации.Предупреждение,,, "Не удалось преобразовать: " + ИсходнаяСтрока);
КонецПопытки;Ошибка в запросе: NULL и ВЫРАЗИТЬ
В запросах ошибка чаще всего возникает в двух случаях. Первый — числовая операция над NULL, который появляется при левом соединении, если в присоединённой таблице нет подходящей записи. Второй — явное приведение ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15,2)) к полю, которое содержит нечисловые строки.
От NULL защищает функция ЕСТЬNULL():
ВЫБРАТЬ
ЕСТЬNULL(Остатки.Количество, 0) КАК Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
При использовании ВЫРАЗИТЬ к числу убедитесь, что исходное поле действительно хранит только числовые представления. Если в строковом реквизите могут встречаться произвольные значения, приведение в запросе небезопасно — правильнее очистить данные в самом реквизите или выполнять преобразование в коде с обработкой исключений.
Отдельный случай — сравнение или арифметика с полями составного типа. Если реквизит может хранить и строку, и число, платформа в операции сложения попытается привести строку к числу и упадёт с той же ошибкой. Решение — сузить тип значения перед операцией через ВЫРАЗИТЬ с предварительной фильтрацией по типу через ВЫБОР КОГДА ... ТОГДА.
Ошибка при загрузке данных из Excel и внешних файлов
Загрузка прайсов, остатков и банковских выписок — классический источник ошибки. Excel визуально показывает число, но фактически ячейка может содержать текст: с неразрывным пробелом, с символом валюты, с апострофом в начале. При чтении такого файла через COM-объект или табличный документ значение приходит как строка.
Практический порядок действий:
- перед загрузкой откройте файл и проверьте формат проблемных колонок: выделите колонку и посмотрите, выравнены ли значения по правому краю (числа) или по левому (текст);
- в обработке загрузки применяйте очистку строки и преобразование через попытку, как показано выше;
- ведите протокол: фиксируйте номер строки файла и исходное значение, которое не удалось преобразовать, — это ускорит разбор проблемных позиций;
- не прерывайте всю загрузку из-за одной строки, если это допустимо по смыслу: пропустите строку с записью в протокол.
Если ошибка возникает в типовой обработке загрузки (например, в «Загрузке данных из табличного документа»), проверьте сопоставление колонок: возможно, числовой реквизит сопоставлен с колонкой, содержащей текст, либо в файле есть строки итогов или заголовки посередине таблицы.
Ошибка у пользователя в типовой конфигурации: что проверить без программирования
Если ошибка возникает в типовой конфигурации (1С:Бухгалтерия, Управление торговлей, ERP) у обычного пользователя, чаще всего причина — в данных, а не в коде. Начните с простого:
- проверьте числовые поля документа или справочника: нет ли в них букв, лишних символов, значений, вставленных копированием из Excel или из почты;
- если ошибка при расчёте итогов или в отчёте — проверьте цены и количества в табличных частях, включая скрытые строки;
- если ошибка после обмена с другой базой или сайтом — вероятно, из внешней системы пришло нечисловое значение в числовое поле; посмотрите протокол обмена;
- если ошибка появилась после обновления конфигурации — проверьте, не связана ли она с конкретным документом или отчётом, и воспроизведите её на копии базы.
Когда источник найден, исправьте данные вручную и повторите операцию. Если ошибка воспроизводится на корректных данных — это повод передать информацию разработчику или в поддержку вендора конфигурации, приложив полный текст ошибки и последовательность действий.
Проверка результата и профилактика
После исправления убедитесь, что проблема решена полностью, а не замаскирована. Повторите операцию, вызвавшую ошибку, на тех же данных. Если исправляли код — прогоните загрузку или проведение на файле, который раньше «падал», и на заведомо корректном файле: оба сценария должны отработать предсказуемо.
Как проверить результат
Операция завершается, значения корректны
Ошибка повторяется или число превращается в ноль там, где должно быть реальное значение
Все строки обработаны, отказы зафиксированы с номерами строк
Строки пропущены молча, итоговые суммы не сходятся с файлом
Суммы совпадают с ожидаемыми
Появились нулевые значения там, где раньше были числа
Для профилактики в собственных разработках придерживайтесь простых правил: никогда не вызывайте Число() от непроверенной строки без попытки; очищайте входные данные от пробелов и неразрывных пробелов; в запросах оборачивайте числовые поля соединений в ЕСТЬNULL(); при обменах валидируйте значения до записи в базу.
Что важно запомнить
Ошибка означает, что в число преобразуется нечисловое значение: строка с пробелами или буквами, пустое значение, NULL. Найдите место по тексту ошибки или отладкой, очистите строку через СтрЗаменить, используйте попытку со значением по умолчанию, в запросах применяйте ЕСТЬNULL. Массовые исправления делайте только на копии базы.
Частые вопросы
Почему СокрЛП() не помогает убрать ошибку?
СокрЛП() удаляет только пробельные символы в начале и конце строки. Если пробел или неразрывный пробел стоит внутри числа как разделитель разрядов («1 234»), он останется, и преобразование снова завершится ошибкой. Используйте СтрЗаменить() для удаления символов внутри строки.
Число выглядит нормально, но ошибка всё равно возникает. Что не так?
Скорее всего, в строке есть неразрывный пробел (код символа 160) — он визуально неотличим от обычного пробела и часто приходит из Excel, браузера или PDF. Удалите его вызовом СтрЗаменить(Строка, Символ(160), ""). Также проверьте невидимые символы вроде табуляции и перевода строки.
Ошибка возникает в запросе, хотя поле числовое. Почему?
При левом соединении таблиц поле может принимать значение NULL, если в присоединяемой таблице нет подходящей записи. Арифметика с NULL вызывает ошибку или даёт NULL. Оберните поле в ЕСТЬNULL(Поле, 0). Также проверьте, не используется ли ВЫРАЗИТЬ к числу над строковым полем с нечисловыми значениями.
Можно ли исправить ошибку, не меняя код конфигурации?
Да, если причина в данных: исправьте значения в документе, справочнике или загружаемом файле. Если ошибка в коде типовой конфигурации, правильный путь — расширение конфигурации или обращение к разработчику, а не прямая правка модулей: при обновлении изменения будут потеряны.
Как преобразовать строку в число, если неизвестно, какой разделитель дробной части используется?
Определите формат по источнику данных: в файлах из русскоязычного Excel чаще запятая, в выгрузках из веб-систем — точка. Универсальный приём — заменить запятую на точку после удаления пробелов, но следите, чтобы точка не использовалась как разделитель разрядов (например, «1.234.567»): в таком случае сначала убираются разделители разрядов, потом обрабатывается дробная часть.
Чем опасно просто обернуть весь код в Попытка/Исключение без обработки?
Ошибка перестанет показываться, но данные будут теряться или искажаться незаметно: вместо реальных значений в базу попадут нули или пустые значения, а учётные итоги разойдутся. В ветке Исключение всегда фиксируйте факт ошибки и исходное значение — в журнале регистрации или протоколе обработки.