При переходе с платформы 1С версии 7.7 на версию 8.Х у программистов часто возникают вопросы из-за особенностей новой платформы. Иногда это касается даже самых простых функций, которые в новой версии платформы работают совершенно по-другому. С одной из таких особенностей столкнулся наш слушатель.
Вопрос
Если Число(Данные77.Уровень) = 12 Тогда КонецЕсли;
Реквизит Данные77.Уровень всегда тип «Строка». При выполнении кода выдается ошибка «Преобразование значения к типу Число не может быть выполнено». В 1С 7.7 всегда преобразовывалась строка в число. Как сделать то же самое в 8-ке?
Ответ тренера
Если параметр функции «Число» не является строковым представлением числа, система выдаст ошибку.
В синтакс-помощнике подробнее расписано:
Можно воспользоваться вот такой конструкцией:
Попытка ТекЧисло = Число(ТекстовоеПоле); Исключение ТекЧисло = 0; КонецПопытки;
Тогда если в переменной ТекстовоеПоле будет не строковое представление числа, возникнет ошибка, которую мы обработаем, например, присвоим переменной ТекЧисло значение 0.
Разработка расширений и технологии доработки конфигураций 1С без снятия с поддержки.
в своЁ время тоже сталкивался с ошибками преобразования строки в число. в моих случаях ошибки возникали из-за того, что:
– в строковом представлении число разделялось на триады, а в качестве символа разделения мог быть как обычный пробел (код символа 32), так и неразрывной пробел (код символа 0160);
– в строковом представлении дробная часть отделялась от целой части либо точкой, либо запятой.
если заранее известно, что в строковом представлении всегда указано только число и никаких иных символов и знаков, то преобразовать строку в число можно одной строкой, несколько раз обернув строку через функцию СтрЗаменить, например так:
Число (СтрЗаменить (СтрЗаменить (СтрЗаменить (стрЧисло, ” “, “”), ” “, “”), “,”, “.”));
где сначала в ” ” используется обычный пробел, а во втором ” ” – неразрывной пробел.
примечание: в зависимости от региональных настроек базы (в конфигураторе пункт «Региональные установки информационной базы» в меню «Администрирование») или ОС (если в региональных настройках информационной базы установлена галка «Использовать региональные установки текущего сеанса») в качестве разделителя триад может выступать и запятая.
эти моменты надо заранее учесть, чтоб верно указать что и на что в строке надо заменить до преобразования строки в число.
Спасибо за подробный и обстоятельный комментарий!
Еще есть такой вариант
ОписаниеТипа = Новый ОписаниеТипов(“Число”);
Текчисло = ОписаниеТипа.ПривестиЗначение(ТекстовоеПоле);
Добрый день!
Да, хороший вариант.
Преимущество такого способа в том, что не вызывается исключение, когда в ТекстовоеПоле содержится не строковое представление числа.
Например:
ОписаниеТипа = Новый ОписаниеТипов("Число");
ТекЧисло = ОписаниеТипа.ПривестиЗначение(ТекстовоеПоле);
После выполнения такого кода ТекЧисло = 0.
А подобный код вызывает ошибку выполнения:
Да, на сайте ИТС в #std499 п.3.7 явно указано, что подобная конструкция приведения к типу с помощью исключения является нарушением стандартов разработки.
Добрый день!
Да, есть такая рекомендация в стандартах разработки.
На практике исключения часто используются для решения подобных задач.
Например, при помощи исключения можно обработать использование ошибочной строки, присвоить произвольное значение в случае возникновения ошибки, выдать сообщение:
ТекЧисло = Число(ТекстовоеПоле);
Исключение
ТекЧисло = -999;
Сообщить("!");
КонецПопытки;