При проектировании пользовательских интерфейсов в системе «1С:Предприятие 8» разработчики часто сталкиваются с требованиями сделать ввод данных максимально наглядным. Одно из таких требований — автоматическое разделение разрядов числа точками непосредственно в процессе ввода (например, чтобы число 1234567 превращалось в 1.234.567 прямо «на лету»).
В этой статье мы подробно разберем, какими путями можно решить эту задачу, проанализируем преимущества и скрытые угрозы каждого подхода, а также выясним, почему стандартные механизмы платформы работают именно так, а не иначе.
Самым быстрым решением, к которому часто прибегают разработчики, является использование стандартного свойства поля ввода — Маска. Этот способ позволяет жестко задать шаблон, по которому пользователь будет вносить данные.
Рассмотрим пример настройки маски ввода для условного кода или числа:
999.9999.9999999999 (где девятки означают обязательный ввод цифр, а точки выступают в роли статических разделителей).Строка.Посмотрим на пример работы данного механизма. При вводе символов платформа будет автоматически перескакивать через точки, создавая визуальный эффект разделения. Однако у этого способа есть критические недостатки, о которых предупреждают опытные разработчики:
123.4___.___.Платформа «1С:Предприятие 8» имеет встроенные механизмы форматирования чисел. Для этого у поля ввода существуют свойства Формат и ФорматРедактирования.
Проанализируем, как настроить разделение групп разрядов стандартными средствами:
Число с длиной 15 и точностью 0).ЧГ=3,0.ЧРГ=. (Числовой Разделитель Групп). Итоговая форматная строка будет выглядеть так: ЧГ=3,0; ЧРГ=..Важная особенность поведения платформы: Стандартный механизм 1С устроен так, что разделители групп разрядов отображаются в поле ввода только тогда, когда оно неактивно (когда курсор находится в другом месте). Как только пользователь активирует поле для изменения (фокус ввода переходит внутрь), разделители исчезают, уступая место «чистому» числу. Это сделано для того, чтобы пользователь мог свободно перемещаться по числу стрелками, удалять цифры клавишами Backspace/Delete и не спотыкаться о разделители. Изменить это поведение для числового типа данных штатными средствами невозможно.
Если бизнес-требования категорически настаивают на том, чтобы точки появлялись именно во время нажатия клавиш, можно реализовать программное форматирование «на лету» через обработку событий формы.
Для этого мы можем использовать событие поля ввода ИзменениеТекстаРедактирования. Разберем по шагам логику работы этого метода:
СтрЗаменить.Пример программного кода для обработчика события:
&НаКлиенте
Процедура ИмяПоляИзменениеТекстаРедактирования(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
// Отключаем стандартную обработку, чтобы применить свой алгоритм
СтандартнаяОбработка = Ложь;
// Удаляем все имеющиеся точки из текущего текста
ЧистаяСтрока = СтрЗаменить(Текст, ".", "");
// Проверяем, что в строке только цифры
// (Дополнительно можно написать валидацию регулярным выражением)
// Форматируем число заново
Попытка
ЧисловоеЗначение = Число(ЧистаяСтрока);
НовыйТекст = Формат(ЧисловоеЗначение, "ЧГ=3,0; ЧРГ=.");
Текст = НовыйТекст;
Исключение
// Если преобразование не удалось, оставляем текст без изменений
КонецПопытки;
КонецПроцедуры
Главная сложность метода: После того как код программно изменяет значение переменной Текст, каретка (курсор) в поле ввода автоматически сбрасывается в начало или в самый конец строки. Пользователю становится неудобно редактировать середину числа. Решение этой проблемы требует сложных манипуляций с выделенным текстом или использования внешних компонент, что сильно усложняет код и делает его нестабильным.
Подводя итоги анализа, мы рекомендуем придерживаться следующих правил при проектировании интерфейсов в 1С:
ЧРГ=.. Позвольте платформе управлять отображением разделителей при потере фокуса. Это гарантирует отсутствие ошибок при расчетах и выгрузках данных.192.168.1.1, артикулы или серийные номера специального формата), то использование текстового реквизита с настроенной Маской ввода является наиболее простым и оправданным решением.