При разработке пользовательских интерфейсов в платформе 1С:Предприятие 8.3 (особенно при переходе с обычных форм 8.2 на управляемые формы) начинающие разработчики часто сталкиваются с ошибкой «Преобразование значения к типу число не может быть выполнено». Данное исключение возникает во время выполнения кода при попытке приведения строки или объекта к числовому типу с помощью функции Число().
Рассмотрим подробнее причины возникновения этой ошибки на примере создания простой формы калькулятора и разберем по шагам, как правильно организовать работу с данными на форме.
Главная причина этой ошибки в управляемых формах — попытка передать объект интерфейса в математические функции или функции приведения типов. Проанализируем следующее выражение:
// Неправильно:
Буфер = Число(Элементы.ТаблоКалькулятора);
Коллекция Элементы содержит элементы графического интерфейса. В данном случае Элементы.ТаблоКалькулятора имеет тип ПолеФормы. Элемент формы визуализирует данные, но сам по себе данными не является. Платформа 1С не умеет преобразовывать объект типа ПолеФормы в число, из-за чего и возникает ошибка.
Для решения этой проблемы необходимо обращаться напрямую к реквизиту формы, к которому привязано поле:
// Правильно:
Буфер = Число(ТаблоКалькулятора); // ТаблоКалькулятора — реквизит формы
Выясним причину второй частой ошибки: некорректное использование строковых функций Лев(), Прав(), СтрЗаменить() над числовыми переменными или некорректное смешивание типов. Функции работы со строками всегда возвращают тип Строка, а при повторном вызове функции Число() от строки, содержащей некорректные символы или пустые значения, возникает сбой.
Рассмотрим некорректный пример:
ВыводЦифры = 1; // Число
ТаблоКалькулятора = ТаблоКалькулятора + Лев(ВыводЦифры, 9); // Попытка применить Лев к числу
ТаблоКалькулятора = Число(Прав(ТаблоКалькулятора, 10)); // Преобразование в число
В приведенном фрагменте тип переменной ТаблоКалькулятора постоянно меняется с числа на строку и обратно. Если переменная становится пустой строкой "", то вызов Число("") приведет к ошибке приведения типа.
Чтобы избежать подобных ошибок при создании калькулятора или обработке пользовательского ввода в 1С 8.3, выполним следующие шаги:
ТаблоКалькулятора с типом Строка, а для хранения промежуточных результатов — реквизит Буфер с типом Число.Элементы для вычислений. Обращаемся к данным формы напрямую по имени реквизита.Число():
&НаКлиенте
Процедура Цифра1Нажатие(Элемент)
// Реквизит ТаблоКалькулятора имеет тип Строка
ТаблоКалькулятора = ТаблоКалькулятора + "1";
КонецПроцедуры
&НаКлиенте
Процедура СложениеНажатие(Элемент)
Буфер = Число(ТаблоКалькулятора);
ТаблоКалькулятора = "";
Операция = "Сложение";
КонецПроцедуры
Если вводимые данные могут содержать пробелы, неразрывные пробелы (разделители триад) или быть пустыми, рекомендуется использовать блок защиты Попытка ... Исключение или предварительную очистку строки:
&НаКлиенте
Функция ПреобразоватьВЧислоБезопасно(СтроковоеЗначение)
// Удаляем неразрывные и обычные пробелы
ОчищеннаяСтрока = СтрЗаменить(СтроковоеЗначение, Символы.НПП, "");
ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, " ", "");
ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, ",", ".");
Результат = 0;
Попытка
Результат = Число(ОчищеннаяСтрока);
Исключение
Результат = 0;
КонецПопытки;
Возврат Результат;
КонецФункции
Соблюдение правил работы с управляемыми формами, явное разделение типы данных и отказ от обращения к элементам интерфейса через Элементы при арифметических расчетах гарантируют отсутствие ошибок приведения типов в 1С.