Как запретить ввод дробных чисел и сделать реквизит строго целым в 1С?

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

При разработке интерфейсов форм в 1С часто возникает задача ограничить ввод пользователя только целыми числами. Например, это актуально для ввода количества упаковок, номеров очередей или партий, где дробные значения недопустимы. Однако нередко разработчики сталкиваются с ситуацией, когда в поле ввода по-прежнему можно напечатать запятую или точку, а значение сохраняет дробную часть, несмотря на установленную нулевую точность. Разберем по шагам, почему возникает эта ошибка и как гарантированно ограничить поле ввода целыми числами.

Выясним причину некорректного поведения

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

Проанализируем специфику работы платформы 1С:

  1. Нулевая длина реквизита. При создании реквизита формы некоторые версии платформы позволяют установить параметры типа Число со значениями длины 0 и точности 0. На уровне платформы комбинация (0, 0) воспринимается как число произвольной разрядности с плавающей точкой (максимальная разрядность до 38 знаков). В этом случае ограничение на точность полностью отключается, и поле ввода начинает свободно принимать дробную часть.
  2. Разница между «Форматом» и «Форматом редактирования». Свойство элемента формы Формат управляет только отображением числа в тот момент, когда поле не находится в фокусе. Когда пользователь устанавливает курсор в поле, вступает в действие ФорматРедактирования. Если он не заполнен или в нем не указана точность, платформа может позволять ввод знаков точки и запятой, производя округление только при выходе из поля.
  3. Неопределенный или составной тип данных. Если поле ввода привязано к реквизиту составного типа, содержащему тип Строка, либо не задано свойство ОграничениеТипа, поле функционирует в текстовом режиме.

Способ 1. Корректная настройка квалификаторов реквизита

Первое и главное правило — никогда не оставлять общую длину числового реквизита равной нулю. В структуре метаданных длина числа обязана лежать в диапазоне от 1 до 38 знаков, а точность не может превышать общую длину.

Рассмотрим, как правильно настроить реквизит:

  1. Откроем свойства реквизита (объекта или формы).
  2. В поле выбора типа выберем Число.
  3. Установим параметр Длина равным реальному пределу ожидаемого значения (например, 10 или 15). Значение длины обязательно должно быть больше нуля.
  4. Установим параметр Точность равным 0.
  5. При необходимости отметим признак Неотрицательное.

Если тип реквизита задается программно, используем явные квалификаторы числа:


Квалификатор = Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный);
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Число"));
Описание = Новый ОписаниеТипов(МассивТипов, , Квалификатор);

Способ 2. Настройка свойства «ФорматРедактирования» элемента формы

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

Выполним следующие действия:

  1. Выделим элемент формы (поле ввода) и откроем окно его свойств.
  2. Найдем свойство ФорматРедактирования.
  3. Нажмем кнопку открытия конструктора форматной строки и перейдем на вкладку настройки числа.
  4. Установим параметр Число дробной части (ЧДЦ) в значение 0. Также рекомендуется заполнить Число целой части (ЧЦ) в соответствии с общей длиной числа.
  5. В результате форматная строка примет вид: ЧДЦ=0 (или, например, ЧЦ=10; ЧДЦ=0).

После задания параметра ЧДЦ=0 в формате редактирования клавиатурный ввод точки и запятой блокируется на уровне поля ввода: платформа просто игнорирует нажатие этих клавиш.

Способ 3. Программный контроль и использование кнопок регулирования

Для небольших целочисленных значений (например, количество дней, порядковый номер) удобным решением является добавление кнопок счетчика:

  1. В свойствах поля ввода включим флаг КнопкаРегулирования.
  2. Установим свойство ШагРегулирования равным 1. Это позволит пользователю менять значение стрелками с шагом в единицу.

Если требуется защититься от вставки дробных чисел через буфер обмена, добавим принудительное отсечение дробной части в событии ПриИзменении поля ввода:


Процедура КоличествоПриИзменении(Элемент)
    РеквизитКоличество = Цел(РеквизитКоличество);
КонецПроцедуры

Функция Цел() гарантирует, что любое попавшее в реквизит значение будет приведено к целому числу путем отбрасывания дробной части.

← На главную