Почему возникает ошибка «Преобразование значения к типу число не может быть выполнено» в управляемых формах 1С и как её исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке пользовательских интерфейсов в платформе 1С:Предприятие 8.3 (особенно при переходе с обычных форм 8.2 на управляемые формы) начинающие разработчики часто сталкиваются с ошибкой «Преобразование значения к типу число не может быть выполнено». Данное исключение возникает во время выполнения кода при попытке приведения строки или объекта к числовому типу с помощью функции Число().

Рассмотрим подробнее причины возникновения этой ошибки на примере создания простой формы калькулятора и разберем по шагам, как правильно организовать работу с данными на форме.

Причина 1. Обращение к элементам формы вместо реквизитов

Главная причина этой ошибки в управляемых формах — попытка передать объект интерфейса в математические функции или функции приведения типов. Проанализируем следующее выражение:


// Неправильно:
Буфер = Число(Элементы.ТаблоКалькулятора);

Коллекция Элементы содержит элементы графического интерфейса. В данном случае Элементы.ТаблоКалькулятора имеет тип ПолеФормы. Элемент формы визуализирует данные, но сам по себе данными не является. Платформа 1С не умеет преобразовывать объект типа ПолеФормы в число, из-за чего и возникает ошибка.

Для решения этой проблемы необходимо обращаться напрямую к реквизиту формы, к которому привязано поле:


// Правильно:
Буфер = Число(ТаблоКалькулятора); // ТаблоКалькулятора — реквизит формы

Причина 2. Ошибки при работе со строковыми функциями и типами

Выясним причину второй частой ошибки: некорректное использование строковых функций Лев(), Прав(), СтрЗаменить() над числовыми переменными или некорректное смешивание типов. Функции работы со строками всегда возвращают тип Строка, а при повторном вызове функции Число() от строки, содержащей некорректные символы или пустые значения, возникает сбой.

Рассмотрим некорректный пример:


ВыводЦифры = 1; // Число
ТаблоКалькулятора = ТаблоКалькулятора + Лев(ВыводЦифры, 9); // Попытка применить Лев к числу
ТаблоКалькулятора = Число(Прав(ТаблоКалькулятора, 10)); // Преобразование в число

В приведенном фрагменте тип переменной ТаблоКалькулятора постоянно меняется с числа на строку и обратно. Если переменная становится пустой строкой "", то вызов Число("") приведет к ошибке приведения типа.

Пошаговое решение и правильная организация кода

Чтобы избежать подобных ошибок при создании калькулятора или обработке пользовательского ввода в 1С 8.3, выполним следующие шаги:

  1. Разделим данные и интерфейс. Для хранения вводимых символов создадим реквизит формы ТаблоКалькулятора с типом Строка, а для хранения промежуточных результатов — реквизит Буфер с типом Число.
  2. Исключим использование коллекции Элементы для вычислений. Обращаемся к данным формы напрямую по имени реквизита.
  3. Формируем значение как строку во время ввода цифр. Конкатенируем символы без постоянного вызова Число():
    
    &НаКлиенте
    Процедура Цифра1Нажатие(Элемент)
        // Реквизит ТаблоКалькулятора имеет тип Строка
        ТаблоКалькулятора = ТаблоКалькулятора + "1";
    КонецПроцедуры
    
  4. Выполняем преобразование в число только при вычислении operations. В момент нажатия кнопок операций (плюс, минус, равно) переводим накопленную строку в число:
    
    &НаКлиенте
    Процедура СложениеНажатие(Элемент)
        Буфер = Число(ТаблоКалькулятора);
        ТаблоКалькулятора = "";
        Операция = "Сложение";
    КонецПроцедуры
    

Безопасное преобразование строки в число

Если вводимые данные могут содержать пробелы, неразрывные пробелы (разделители триад) или быть пустыми, рекомендуется использовать блок защиты Попытка ... Исключение или предварительную очистку строки:


&НаКлиенте
Функция ПреобразоватьВЧислоБезопасно(СтроковоеЗначение)
    // Удаляем неразрывные и обычные пробелы
    ОчищеннаяСтрока = СтрЗаменить(СтроковоеЗначение, Символы.НПП, "");
    ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, " ", "");
    ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, ",", ".");
    
    Результат = 0;
    Попытка
        Результат = Число(ОчищеннаяСтрока);
    Исключение
        Результат = 0;
    КонецПопытки;
    
    Возврат Результат;
КонецФункции

Соблюдение правил работы с управляемыми формами, явное разделение типы данных и отказ от обращения к элементам интерфейса через Элементы при арифметических расчетах гарантируют отсутствие ошибок приведения типов в 1С.

← На главную