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