Ошибка Преобразование значения к типу Число не может быть выполнено 1С 8.3
Очень часто начинающие программисты 1С 8.3 встречаются с этой проблемой. Рассмотрим причины возникновения ошибки Преобразование значения к типу Число не может быть выполнено и методы её решения.
Причина ошибки Преобразование значения к типу Число не может быть выполнено
Причина достаточно банальна. Обычно при каком-либо арифметическом действии над переменными числового типа система ожидает увидеть в этом действии два значения числового типа, например:
а = 2; б = 2; с = а + б; Сообщить(с);
Система, естественно, верно отработает это выражение и вернет 4.
Существуют ситуации, в которых в таких простых случаях в переменных оказывается не число, а, например, строка, NULL неопределено, дата и др.
Вот такой пример обязательно выдаст ошибку Преобразование значения к типу Число не может быть выполнено:
а = 2; б = ТекущаяДата(); с = а + б; Сообщить(с);
Потому как платформа не может сложить значения типа число и значения типа дата.
Единственное исключение — сложения со строкой, в которой содержатся только цифры:
а = 2; б = "2"; с = а + б; Сообщить(с);
Получите понятные самоучители по 1С бесплатно:
Система выдаст результат 4, однако, если поменять слагаемые местами, система выдаст строковые «22», т.к 1С 8 выбирает тип по первому в выражению значению.
Решение Преобразование значения к типу Число не может быть выполнено
Для решения необходимо найти место в коде, в котором вызывается исключение, и исправить его.
В качестве решения рекомендую использовать дополнительные проверки. Например, на тип переменных:
ТипЗнч(Значение) = Тип("Число")
Очень распространенная ошибка — это получение NULL в запросе и использование его в арифметических выражениях:
Запрос = Новый Запрос; Запрос.Текст = " | ВЫБРАТЬ | ВыпускПродукцииУслугОбороты.Организация, | ВыпускПродукцииУслугОбороты.Продукция, | ВыпускПродукцииУслугОбороты.КоличествоОборот, | ВыпускПродукцииУслугОбороты.ПлановаяСтоимостьОборот |ИЗ | РегистрНакопления.ВыпускПродукцииУслуг.Обороты КАК ВыпускПродукцииУслугОбороты"; Выборка = Запрос.Выполнить().Выбрать(); Сч = 0; Пока Выборка.Следующий() Цикл Сч = Сч + Выборка.КоличествоОборот; КонецЦикла;
Здесь в строке Сч = Сч + Выборка.КоличествоОборот вполне вероятно появление данной ошибки в случае получения в качестве значения NULL.
Чтобы избежать данной ошибки, достаточно использовать проверку на NULL ресурсов в запросе:
| ЕСТЬNULL(ВыпускПродукцииУслугОбороты.КоличествоОборот,0) КАК КоличествоОборот | ЕСТЬNULL(ВыпускПродукцииУслугОбороты.ПлановаяСтоимостьОборот,0) КАК ПлановаяСтоимостьОборот
Если в значении будет значение NULL, то система заменит его на ноль, тем самым ошибка будет исправлена.
Другие статьи по 1С:
- Администрирование (обновление 1С, резервные копии и т.д);
- Программирование 1С
- Обучение 1С
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
СПРОСИТЕ в комментариях!
Мурзин Евгений(ЕвгеМур):
Примитивный вопрос: Как в переменной типа строка увеличивать значение на 1. Это нужно для цикла.Пример
Процедура ПечатьТаблицыСЦиклом()
//Печатается столбец таблицы умножения на 7 Необходимо на 1
//увеличивать не только I(тип число), но и К(тип строка)
//при отладке ошибка: преобразование числового типа.
//Спасибо за помощь.Приму Ваши варианты. Прошу для чайничка //подробнее
I=1; // Переменная цикла, тип число
Пока I<11 Цикл
К="1"; //Переменная К для печати тип строка
Сообщить(I+"*7="+I*7);
I=I+1; //Подготовка след.итерации
К=I; //Здесь раньше была команда К=К+1; работает
//без ошибки,но единица к К не добавляется
КонецЦикла;
КонецПроцедуры
Мурзин Евгений(ЕвгеМур):
Сообщить(К+»*7=»+I*7); // В программе бы такой вариант. В
//предыдущем сообщении допущена ошибка
Мурзин Евгений(ЕвгеМур):
Ура! Сам решил! «Прежде, чем задать вопрос, почитай сначала ОС» (Афоризм Шаболтаса Г.В.)
Исключаем переменную К (это балласт), а строка Сообщить выглядит след.образом: Сообщить (Формат(I)+»*7=»+I*7);
Столбец таблицы умножения на 7 выведен в сообщения!!!
Аноним:
Здесь код калькулятора из учебных видео. Но он не работает. Пишет Преобразование к типу число не может быть выполнено. При этом на видео всё сделано точь в точь и всё работает.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
Перем ИсходныеДанные;
ИсходныеДанные=»»;
//1.Вывести данные.
Если НЕ ВвестиСтроку(ИсходныеДанные,»Что считать?») Тогда
Возврат;
КонецЕсли;
//2.Разобрать данные на операнды
ПозицияОперации=0;
ТекущаяОперация=»^»;
Операнд1=Лев(ИсходныеДанные,ПозицияОперации-1);
Операнд2=Сред(ИсходныеДанные,ПозицияОперации+1);
//3. Произвести вычисления
Результат=Pow(Операнд1,Операнд2);
//4.Вывести результат
Сообщить(ИсходныеДанные+»=»+Результат);
КонецПроцедуры
12345678987654:
Почему нигде нет даты статьи? Как я узнаю что это статья 30 летней давности?
dimul:
Вы же программист, посмотрите в коде страницы.
Дата публикации: 2013-05-21T12:57:44+00:00
Дата изменения: article:2018-04-15T08:06:50+00:00
Мини-квест)
Кирилл:
😉 👍
Аноним:
Преобразование значения к типу Число не может быть выполнено
{ВнешняяОбработка.ЗагрузкаДанныхИзIIKO.Форма.Форма.Форма(4248)}:Год = Число(Сред(Стро,7,4));
{ВнешняяОбработка.ЗагрузкаДанныхИзIIKO.Форма.Форма.Форма(4747)}:Док.ДатаВходящегоДокумента=ПолучитьДату(СписДок[0].ВходДата);
{ВнешняяОбработка.ЗагрузкаДанныхИзIIKO.Форма.Форма.Форма(243)}:СоздатьНакладные(Тз,Объект.ПНПрефикс,Объект.ДеньПрефикс,1);
{ВнешняяОбработка.ЗагрузкаДанныхИзIIKO.Форма.Форма.Форма(4392)}:ВыполнитьНажатиеНаСервере();