При работе с полями ввода числового типа в 1С разработчики и пользователи часто сталкиваются с неочевидным поведением платформы. Представим типовую ситуацию: в ячейке табличной части или в реквизите на форме уже находится число (например, 5). Пользователь полностью выделяет это число и начинает вводить отрицательное значение, нажимая клавиши -, 1, 0. Ожидаемый результат — получить число -10. Однако на практике платформа преобразует значение в -510. Разберем детально, почему так происходит и какие существуют пути решения данной проблемы.
Для числовых полей ввода разработчики платформы 1С реализовали поведение, аналогичное классическому настольному калькулятору. Клавиша «минус» при наличии уже введенного значения расценивается не как текстовый символ дефиса, а как команда инверсии знака текущего числа (функциональный аналог кнопки ±).
Когда в ячейке выделено число 5, нажатие клавиши «минус» выполняет следующие действия:
-5).1 и 0) просто дописываются справа к уже существующему значению. В итоге получается число -510.В стандартной палитре свойств элементов формы нет флага или переключателя, который мог бы отключить данное системное поведение для чисел.
Проанализируем самый простой способ, не требующий модификации конфигурации. Поскольку платформа работает в режиме калькулятора, пользователям достаточно скорректировать привычный порядок ввода данных.
Существуют два рабочих пользовательских сценария:
10, а затем нажимает клавишу -. Платформа заменит старое значение на 10 и сразу инвертирует его знак в -10.Delete или Backspace. В пустом поле нажатие минуса обрабатывается корректно — как знак будущего числа, после чего ввод -10 отработает штатно.Посмотрим на программный вариант, предложенный на форуме. Если для элемента включена кнопка выбора или редактирование активируется интерактивно через кнопку выбора, можно переопределить стандартное поведение в обработчике события НачалоВыбора:
Процедура Графа4НачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Элемент.Значение = 0;
КонецПроцедуры
Разберем особенности этого метода. Отключение стандартной обработки и обнуление значения предотвращают сохранение предыдущего числа. Однако важно учитывать ограничение: событие НачалоВыбора срабатывает только при нажатии кнопки с тремя точками или по горячей клавише F4. При обычном клике мышью в ячейку или при прямом вводе с клавиатуры данный обработчик вызван не будет.
Если требуется контролировать процесс ввода непосредственно с клавиатуры, обратимся к событию АвтоПодборТекста элемента формы. Это событие вызывается интерактивно на каждое изменение текста пользователем до момента завершения редактирования строки.
В обработчик передается параметр Текст, содержащий текущую набранную строку. Проанализировав первый введенный символ, можно программно отследить нажатие минуса и сбросить предыдущее значение ячейки, оставив только знак отрицания для последующего набора цифр.
Рассмотрим радикальное решение задачи, когда необходимо обеспечить строго офисное поведение редактирования (при котором выделение полностью стирается любым введенным символом, включая минус).
Для этого числовой редактор обходят следующим образом:
ПриИзменении строкового реквизита выполняется валидация текста и явное преобразование строки в число с записью в целевой числовой реквизит объекта.Таким образом, в зависимости от требований проекта можно либо обучить пользователей вводу отрицательных величин через инверсию знака, либо перехватывать ввод на уровне кода формы.