Почему возникает ошибка "Преобразование значения к типу Число не может быть выполнено"?
Оглавление
Про ошибку
Причиной такой ошибки является попытка преобразования в число значения, которое в число преобразовано быть не может.
Рассмотрим такой пример:
Для Шаг = 1 По 3 Цикл Сообщить(Шаг + "абв"); КонецЦикла; |
Программист, который пишет этот код ожидает, что 1С выведет пользователю следующие значения:
1абв 2абв 3абв |
Вместо этого возникает ошибка преобразования значения в число.
Всё дело в том, что платформа 1С определяет тип выражения по первому слагаемому. В нашем случае первым слагаемым идёт переменная Шаг, в которой хранится числовое значение. А значит и второе слагаемое будет преобразовано в число. А так как строка "абв" в число никак не преобразуется - мы и получаем ошибку времени выполнения.
Мы должны подсказать системе, что собираемся складывать строки, а не числа. Для этого мы можем явно указать преобразование первого слагаемого в строку, вот так:
Для Шаг = 1 По 3 Цикл Сообщить(Строка(Шаг) + "абв"); КонецЦикла; |
Другой вариант - поставить первым слагаемым любое строковое значение, например, пустое:
Для Шаг = 1 По 3 Цикл Сообщить("" + Шаг + "абв"); КонецЦикла; |
На заметку
Раз мы заговорили про неявные преобразования значений, рассмотрим сразу ещё и такой пример:
Сообщить("Результат: " + 1 + 2 + 3); |
Программист ожидает, что 1С выведет пользователю:
Результат: 6 |
Вместо этого он видит:
Результат: 123 |
Причина та же самая. Платформа 1С смотрит на тип первого слагаемого и видит там строку. Значит, решает она, речь идёт о сложении строк, а не чисел. И пытается преобразовать каждое слагаемое в строку и затем соединить их как строки.
В данном случае необходимо расставить скобки, чтобы 1С сначала посчитала результат в скобках (как сумму чисел), а уже затем преобразовала результат в строку, вот так:
Сообщить("Результат: " + (1 + 2 + 3)); |