Как автоматически разделять число точками в процессе ввода в 1С?

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

При проектировании пользовательских интерфейсов в системе «1С:Предприятие 8» разработчики часто сталкиваются с требованиями сделать ввод данных максимально наглядным. Одно из таких требований — автоматическое разделение разрядов числа точками непосредственно в процессе ввода (например, чтобы число 1234567 превращалось в 1.234.567 прямо «на лету»).

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

Способ 1. Использование маски ввода (Решение автора темы)

Самым быстрым решением, к которому часто прибегают разработчики, является использование стандартного свойства поля ввода — Маска. Этот способ позволяет жестко задать шаблон, по которому пользователь будет вносить данные.

Рассмотрим пример настройки маски ввода для условного кода или числа:

  1. Откроем свойства нужного элемента формы (Поле ввода).
  2. В строке Маска зададим шаблон, например: 999.9999.9999999999 (где девятки означают обязательный ввод цифр, а точки выступают в роли статических разделителей).
  3. Установим тип значения для данного поля как Строка.

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

Способ 2. Стандартная настройка формата (Рекомендованный платформенный подход)

Платформа «1С:Предприятие 8» имеет встроенные механизмы форматирования чисел. Для этого у поля ввода существуют свойства Формат и ФорматРедактирования.

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

  1. Убедимся, что реквизит имеет числовой тип (например, Число с длиной 15 и точностью 0).
  2. В свойстве поля ввода Формат вызовем конструктор форматной строки и установим флаг «Группировать». В строке формата появится параметр ЧГ=3,0.
  3. Чтобы в качестве разделителя использовалась именно точка, мы можем вручную дописать параметр ЧРГ=. (Числовой Разделитель Групп). Итоговая форматная строка будет выглядеть так: ЧГ=3,0; ЧРГ=..

Важная особенность поведения платформы: Стандартный механизм 1С устроен так, что разделители групп разрядов отображаются в поле ввода только тогда, когда оно неактивно (когда курсор находится в другом месте). Как только пользователь активирует поле для изменения (фокус ввода переходит внутрь), разделители исчезают, уступая место «чистому» числу. Это сделано для того, чтобы пользователь мог свободно перемещаться по числу стрелками, удалять цифры клавишами Backspace/Delete и не спотыкаться о разделители. Изменить это поведение для числового типа данных штатными средствами невозможно.

Способ 3. Использование события «ИзменениеТекстаРедактирования» (Динамическое форматирование)

Если бизнес-требования категорически настаивают на том, чтобы точки появлялись именно во время нажатия клавиш, можно реализовать программное форматирование «на лету» через обработку событий формы.

Для этого мы можем использовать событие поля ввода ИзменениеТекстаРедактирования. Разберем по шагам логику работы этого метода:

  1. При каждом нажатии клавиши срабатывает обработчик события.
  2. Мы перехватываем текущий введенный текст.
  3. Очищаем строку от старых точек с помощью функции СтрЗаменить.
  4. Разбиваем оставшуюся цифровую строку на группы по 3 символа с конца и объединяем их точками.
  5. Записываем полученную строку обратно в поле ввода.

Пример программного кода для обработчика события:


&НаКлиенте
Процедура ИмяПоляИзменениеТекстаРедактирования(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
    
    // Отключаем стандартную обработку, чтобы применить свой алгоритм
    СтандартнаяОбработка = Ложь;
    
    // Удаляем все имеющиеся точки из текущего текста
    ЧистаяСтрока = СтрЗаменить(Текст, ".", "");
    
    // Проверяем, что в строке только цифры
    // (Дополнительно можно написать валидацию регулярным выражением)
    
    // Форматируем число заново
    Попытка
        ЧисловоеЗначение = Число(ЧистаяСтрока);
        НовыйТекст = Формат(ЧисловоеЗначение, "ЧГ=3,0; ЧРГ=.");
        Текст = НовыйТекст;
    Исключение
        // Если преобразование не удалось, оставляем текст без изменений
    КонецПопытки;
    
КонецПроцедуры

Главная сложность метода: После того как код программно изменяет значение переменной Текст, каретка (курсор) в поле ввода автоматически сбрасывается в начало или в самый конец строки. Пользователю становится неудобно редактировать середину числа. Решение этой проблемы требует сложных манипуляций с выделенным текстом или использования внешних компонент, что сильно усложняет код и делает его нестабильным.

Резюме и рекомендации

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

← На главную