Часто начинающим программистам 1С 8.3 приходится встречаться со следующей проблемой «преобразование значения к типу булево не может быть выполнено». В таком случае надо знать, как разобраться с этой ошибкой предпринять меры по ее устранению.
Причина на самом деле очень проста. При каком-либо арифметическом действии над переменными числового типа система ожидает увидеть в этом действии два значения числового типа, например:
а = 2;б = 2;с = а + б;Сообщить(с);
Система верно отработает это выражение и вернет 4.
Бывают ситуации, когда в таких случаях в переменных оказывается не число, а, например, строка, NULL неопределено, дата и др.
Вот такой пример обязательно выдаст ошибку «Преобразование значения к типу Число не может быть выполнено»:
а = 2;б = ТекущаяДата();с = а + б;Сообщить(с);
Потому как платформа не может сложить значения типа число и значения типа дата.
Единственное исключение — сложения со строкой, в которой содержатся только цифры:
а = 2;б = «2”;с = а + б;Сообщить(с);
Система выдаст результат 4, но если поменять слагаемые местами, система выдаст строковые «22», так как 1С 8 выбирает тип по первому выражению.
Для решения данной проблемы необходимо найти место в коде, в котором вызывается исключение, и исправить его. Также необходимо использовать дополнительные проверки. Например, на тип переменных:
ТипЗнч(Значение) = Тип(«Число”)
Очень распространенная ошибка — это получение NULL в запросе и использование его в арифметических выражениях:
Запрос = Новый Запрос;Запрос.Текст = «ВЫБРАТЬВыпускПродукцииУслугОбороты.Организация,ВыпускПродукцииУслугОбороты.Продукция,ВыпускПродукцииУслугОбороты.КоличествоОборот,ВыпускПродукцииУслугОбороты.ПлановаяСтоимостьОборотИЗРегистрНакопления.ВыпускПродукцииУслуг.Обороты КАК ВыпускПродукцииУслугОбороты”;Выборка = Запрос.Выполнить().Выбрать();Сч = 0;Пока Выборка.Следующий() ЦиклСч = Сч + Выборка.КоличествоОборот;КонецЦикла;
Здесь в строке Сч = Сч + Выборка.КоличествоОборот вполне вероятно появление данной ошибки в случае получения в качестве значения NULL.
Чтобы избежать данной ошибки, достаточно использовать проверку на NULL ресурсов в запросе:
ЕСТЬNULL(ВыпускПродукцииУслугОбороты.КоличествоОборот,0) КАК КоличествоОборотЕСТЬNULL(ВыпускПродукцииУслугОбороты.ПлановаяСтоимостьОборот,0) КАК ПлановаяС
Если в значении будет значение NULL, то система заменит его на ноль, и в итоге ошибка будет исправлена.
Более 8 лет работаю системным администратором и сертифицированным специалистом 1С. Стараюсь излагать мысли понятно для любого уровня подготовки. Есть вопрос? Я на связи: ns@asd1c.ru
оглавление | Почему порядок строк в результате запроса может не совпадать с уроком |
Почему возникает ошибка «Преобразование значения к типу Число не может быть выполнено»?
Про ошибку
Причиной такой ошибки является попытка преобразования в число значения, которое в число преобразовано быть не может.
Рассмотрим такой пример:
Для Шаг = 1 По 3 Цикл Сообщить(Шаг + «абв»); КонецЦикла;
Программист, который пишет этот код ожидает, что 1С выведет пользователю следующие значения:
1абв 2абв 3абв
Вместо этого возникает ошибка преобразования значения в число.
Всё дело в том, что платформа 1С определяет тип выражения по первому слагаемому. В нашем случае первым слагаемым идёт переменная Шаг, в которой хранится числовое значение. А значит и второе слагаемое будет преобразовано в число. А так как строка «абв» в число никак не преобразуется — мы и получаем ошибку времени выполнения.
Мы должны подсказать системе, что собираемся складывать строки, а не числа. Для этого мы можем явно указать преобразование первого слагаемого в строку, вот так:
Для Шаг = 1 По 3 Цикл Сообщить(Строка(Шаг) + «абв»); КонецЦикла;
Другой вариант — поставить первым слагаемым любое строковое значение, например, пустое:
Для Шаг = 1 По 3 Цикл Сообщить(«» + Шаг + «абв»); КонецЦикла;
На заметку
Раз мы заговорили про неявные преобразования значений, рассмотрим сразу ещё и такой пример:
Сообщить(«Результат: » + 1 + 2 + 3);
Программист ожидает, что 1С выведет пользователю:
Результат: 6
Вместо этого он видит:
Результат: 123
Причина та же самая. Платформа 1С смотрит на тип первого слагаемого и видит там строку. Значит, решает она, речь идёт о сложении строк, а не чисел. И пытается преобразовать каждое слагаемое в строку и затем соединить их как строки.
В данном случае необходимо расставить скобки, чтобы 1С сначала посчитала результат в скобках (как сумму чисел), а уже затем преобразовала результат в строку, вот так:
Сообщить(«Результат: » + (1 + 2 + 3));
оглавление | Почему порядок строк в результате запроса может не совпадать с уроком |