Как правильно вводить отрицательные числа в поле ввода 1С и избежать склеивания значений?

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

При работе с полями ввода числового типа в 1С разработчики и пользователи часто сталкиваются с неочевидным поведением платформы. Представим типовую ситуацию: в ячейке табличной части или в реквизите на форме уже находится число (например, 5). Пользователь полностью выделяет это число и начинает вводить отрицательное значение, нажимая клавиши -, 1, 0. Ожидаемый результат — получить число -10. Однако на практике платформа преобразует значение в -510. Разберем детально, почему так происходит и какие существуют пути решения данной проблемы.

Выясним причину поведения платформы

Для числовых полей ввода разработчики платформы 1С реализовали поведение, аналогичное классическому настольному калькулятору. Клавиша «минус» при наличии уже введенного значения расценивается не как текстовый символ дефиса, а как команда инверсии знака текущего числа (функциональный аналог кнопки ±).

Когда в ячейке выделено число 5, нажатие клавиши «минус» выполняет следующие действия:

  1. Платформа не очищает выделенный фрагмент, а меняет знак текущего числа с положительного на отрицательный (число становится равным -5).
  2. Выделение немедленно сбрасывается.
  3. Текстовый курсор перемещается в самый конец значения.
  4. Все последующие нажатия клавиш (в нашем примере 1 и 0) просто дописываются справа к уже существующему значению. В итоге получается число -510.

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

Способ 1. Пользовательский ввод: изменение последовательности нажатий клавиш

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

Существуют два рабочих пользовательских сценария:

  1. Ввод знака после набора цифр: пользователь выделяет ячейку, набирает само число 10, а затем нажимает клавишу -. Платформа заменит старое значение на 10 и сразу инвертирует его знак в -10.
  2. Предварительная очистка ячейки: перед вводом отрицательного числа пользователь нажимает клавишу Delete или Backspace. В пустом поле нажатие минуса обрабатывается корректно — как знак будущего числа, после чего ввод -10 отработает штатно.

Способ 2. Программный сброс значения через событие НачалоВыбора

Посмотрим на программный вариант, предложенный на форуме. Если для элемента включена кнопка выбора или редактирование активируется интерактивно через кнопку выбора, можно переопределить стандартное поведение в обработчике события НачалоВыбора:


Процедура Графа4НачалоВыбора(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Элемент.Значение = 0;
КонецПроцедуры

Разберем особенности этого метода. Отключение стандартной обработки и обнуление значения предотвращают сохранение предыдущего числа. Однако важно учитывать ограничение: событие НачалоВыбора срабатывает только при нажатии кнопки с тремя точками или по горячей клавише F4. При обычном клике мышью в ячейку или при прямом вводе с клавиатуры данный обработчик вызван не будет.

Способ 3. Перехват ввода через событие АвтоПодборТекста

Если требуется контролировать процесс ввода непосредственно с клавиатуры, обратимся к событию АвтоПодборТекста элемента формы. Это событие вызывается интерактивно на каждое изменение текста пользователем до момента завершения редактирования строки.

В обработчик передается параметр Текст, содержащий текущую набранную строку. Проанализировав первый введенный символ, можно программно отследить нажатие минуса и сбросить предыдущее значение ячейки, оставив только знак отрицания для последующего набора цифр.

Способ 4. Использование вспомогательного строкового поля

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

Для этого числовой редактор обходят следующим образом:

  1. На форме размещается элемент управления со строковым типом данных вместо числового. Для строкового поля платформа не запускает логику калькулятора, поэтому нажатие минуса по выделенному тексту просто заменяет всю строку на дефис.
  2. В обработчике события ПриИзменении строкового реквизита выполняется валидация текста и явное преобразование строки в число с записью в целевой числовой реквизит объекта.
  3. При открытии формы или считывании данных число форматируется и передается в строковое поле отображения.

Таким образом, в зависимости от требований проекта можно либо обучить пользователей вводу отрицательных величин через инверсию знака, либо перехватывать ввод на уровне кода формы.

← На главную