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

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

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

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

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

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

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

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

Чаще всего виновник — строка, которая выглядит как число, но содержит скрытые помехи. Типичные примеры: «1 234,56» с неразрывным пробелом из Excel, «12.5» с точкой вместо запятой при русских региональных настройках, « 100 » с пробелами по краям, «N/A», «-», пустая строка. Функция Число() строга: она принимает только цифры, один разделитель дробной части, соответствующий региональным настройкам, и знак минуса в начале.

Вторая группа причин — значения специальных типов. Неопределено (например, незаполненный параметр функции), NULL (результат левого соединения в запросе при отсутствии связанной записи), дата, булево или ссылка на объект не преобразуются в число напрямую. Попытка выполнить Число(Неопределено) гарантированно вызовет исключение.

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

Ошибка при загрузке файлаСтрока из Excel/CSV содержит пробелы, символы валют, текст

Проверить исходную ячейку на неразрывные пробелы (код 160) и разделители

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

Проверить ЕСТЬNULL и содержимое строкового реквизита

Ошибка в формеПользователь ввёл текст в числовое поле или поле не заполнено

Проверить обработчики ПриИзменении и значение перед расчётом

Ошибка при обменеИз другой системы пришло значение в неожиданном формате

Посмотреть сырые данные в файле обмена или теле запроса

Как найти проблемное место в коде

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

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

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

Попытка

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

Исключение

ЗаписьЖурналаРегистрации("ЗагрузкаДанных",

УровеньЖурналаРегистрации.Предупреждение,,,

"Не удалось преобразовать: [" + СтрокаЗначения + "], строка файла " + НомерСтроки);

Результат = 0;

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

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

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

Неразрывный пробел (символ с кодом 160) — главный невидимый враг: он попадает в данные из Excel, веб-страниц и печатных форм. Функция СокрЛП() его не удаляет внутри строки, поэтому заменяйте его явно через СтрЗаменить():

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

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

СтрокаОчищенная = СтрЗаменить(СтрокаОчищенная, ".", ","); // если разделитель — запятая

СтрокаОчищенная = СокрЛП(СтрокаОчищенная);

Если ПустаяСтрока(СтрокаОчищенная) Тогда

Результат = 0;

Иначе

Результат = Число(СтрокаОчищенная);

КонецЕсли;

Если в данных могут встречаться символы валют («₽», «руб.»), единицы измерения или текст, перед преобразованием проверьте, что в строке остались только допустимые символы. В типовых конфигурациях для этого есть функция СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке() (учтите: она не пропускает запятую и минус, поэтому для дробных чисел нужна собственная проверка или регулярное выражение через СтрЧислоВхождений и посимвольный разбор).

Безопасное преобразование: универсальная функция

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

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

Если ТипЗнч(Значение) = Тип("Число") Тогда

Возврат Значение;

КонецЕсли;

Если Значение = Неопределено Или Значение = NULL Тогда

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

КонецЕсли;

Строка = СокрЛП(Строка(Значение));

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

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

Если ПустаяСтрока(Строка) Тогда

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

КонецЕсли;

Попытка

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

Исключение

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

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

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

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

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

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

От NULL защищает функция ЕСТЬNULL(Поле, 0) — ставьте её на все числовые поля, участвующие в расчётах после соединений. От нечисловых строк помогает конструкция ВЫБОР с проверкой: например, проверить, что строка непустая и не содержит букв, через ПОДОБНО, и только тогда выполнять приведение, иначе возвращать 0.

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

Порядок действий при ошибке в запросе
  1. 1
    Найдите в тексте запроса ВЫРАЗИТЬ(... КАК ЧИСЛО) и арифметику с полями соединяемых таблиц
  2. 2
    Оберните поля из левых соединений в ЕСТЬNULL(Поле, 0)
  3. 3
    Для строкового поля проверьте данные: выполните отдельный запрос, выбирающий значения, где поле не подходит под числовой шаблон
  4. 4
    Исправьте некорректные значения в данных или замените приведение на ВЫБОР с проверкой
  5. 5
    Выполните запрос повторно и убедитесь, что результат не содержит неожиданных нулей

Ошибка в формах и при вводе пользователем

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

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

Отдельный случай — программное заполнение: значение присваивается из другого реквизита, результата запроса или параметра, который оказался Неопределено. Перед присваиванием проверяйте тип через ТипЗнч() и заполняйте значение по умолчанию.

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

Проверка результата после исправления

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

Дополнительно проверьте граничные случаи: пустая ячейка, значение «0», отрицательное число, число с дробной частью, число с разделителем-точкой и с запятой, строка с неразрывным пробелом. Если обработка массовая, прогоните её на копии базы и сверьте итоговые суммы с контрольными значениями из источника.

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

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

Загрузка тестового файла
Норма

Все строки обработаны, суммы совпадают с источником

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

Часть строк пропущена или суммы отличаются от контрольных

Журнал регистрации после обмена
Норма

Нет записей о неудачных преобразованиях или они объяснены

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

Предупреждения о пропущенных значениях без реакции

Поведение формы при очистке поля
Норма

Поле принимает 0, расчёт выполняется без ошибок

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

Ошибка появляется при пустом или текстовом вводе

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

Почему Число("1 000") вызывает ошибку, хотя это очевидно число?

Потому что внутри строки есть пробел — обычный или неразрывный (символ с кодом 160), который часто копируется из Excel и веб-страниц. Функция Число() не допускает никаких символов, кроме цифр, одного разделителя и знака минуса. Удалите пробелы через СтрЗаменить(), включая Символ(160), и преобразование пройдёт успешно.

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

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

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

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

Можно ли отключить эту ошибку, чтобы обработка не прерывалась?

Отключить саму проверку платформы нельзя — это штатное исключение. Но можно полностью предотвратить прерывание, обернув каждое преобразование в Попытка/Исключение. При этом обязательно фиксируйте пропущенные значения, иначе потерянные данные обнаружатся только при сверке итогов.

Число("12.5") работает у одного пользователя и падает у другого. В чём причина?

В региональных настройках сеанса. При русских настройках разделитель дробной части — запятая, и точка вызывает ошибку; при английских — наоборот. Если формат входных данных фиксирован, заменяйте разделитель на соответствующий настройкам сеанса перед преобразованием или используйте форматирование через объект ОписаниеТипов.

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

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

Итог

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

Ошибка преобразования к числу всегда означает, что на вход попало нечисловое значение: строка с пробелами или текстом, пустое значение, NULL или Неопределено. Надёжное исправление — очистка строки (включая неразрывные пробелы), проверка типа и пустоты, ЕСТЬNULL в запросах и обёртка преобразования в попытку с протоколированием. Молчаливая подмена ошибочных сумм нулём недопустима в учётных данных — фиксируйте каждый такой случай.