Преобразование значения к типу

Часто начинающим программистам 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));

оглавление Почему порядок строк в результате запроса может не совпадать с уроком