Как запретить ввод любых символов, кроме цифр, в текстовом поле 1С?

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

При разработке интерфейсов в системе «1С:Предприятие» перед программистом часто возникает задача: ограничить ввод данных в определенное поле так, чтобы пользователь мог вводить исключительно цифры. Классическим примером является поле для ввода номера телефона, ИНН, СНИЛС, артикула или ОГРН. Если данные заносятся с лишними символами (пробелами, дефисами, буквами), это гарантированно приводит к сбоям при интеграциях, отправке SMS, сверке контрагентов или поиске записей в базе данных.

В этой статье мы подробно проанализируем, почему стандартные подходы вроде маски ввода или смены типа реквизита на числовой часто не подходят для реальных задач бизнеса. Мы рассмотрим современные и классические способы очистки строк «на лету» и по завершении ввода, изучим работу с регулярными выражениями в платформе 1С и разберем готовые механизмы Библиотеки Стандартных Подсистем (БСП).

Почему стандартная маска ввода неудобна для пользователей?

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

  1. Произвольное позиционирование курсора. Пользователь может кликнуть мышкой в любую часть поля ввода (например, посередине) и начать вводить символы оттуда. В результате строка заполнится некорректно, превратившись в нечто вроде "380 3 ".
  2. Проблемы с копированием данных. Если пользователь попытается скопировать полученный из мессенджера или почты номер телефона и вставить его в поле с маской, спецсимволы (скобки, дефисы, пробелы) либо сломают структуру вставки, либо номер вставится не полностью.
  3. Негибкая длина. Маска жестко фиксирует количество символов. Если у вас могут вводиться номера разной длины (например, городские номера без кода страны или международные номера разного формата), одна маска физически не сможет покрыть все сценарии.

Таким образом, маска ввода подходит только для строго фиксированных документов (например, серии и номера паспорта), но крайне нежелательна для гибких текстовых полей.

Недостатки использования типа данных «Число» на форме

На форумах часто предлагают альтернативный вариант: сделать реквизит формы с типом Число, а при записи объекта преобразовывать его значение в строку. Мы настоятельно рекомендуем избегать этого метода из-за следующих архитектурных проблем:

Следовательно, правильный путь — хранить данные в текстовом реквизите и контролировать ввод программно.

Решение 1: Динамическая фильтрация при вводе (ИзменениеТекстаРедактирования)

Рассмотрим вариант фильтрации текста «на лету», когда платформа анализирует каждый символ в момент его нажатия на клавиатуре. Для этого у поля ввода на управляемой форме существует событие ИзменениеТекстаРедактирования.

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

Однако помните о важном нюансе: динамическая перезапись текста в процессе редактирования может приводить к смещению курсора (каретки) в самый конец текстового поля, что мешает редактированию середины строки. Данный метод следует применять аккуратно.

Решение 2: Программная очистка при потере фокуса (ПриИзменении)

Гораздо более стабильным, надежным и удобным для пользователя подходом является очистка строки в момент завершения ввода. Пользователь может вставить скопированный текст в любом формате (например, "+7 (999) 123-45-67"), а система при потере фокуса полем ввода автоматически отбросит все лишнее, оставив только чистые цифры: "79991234567".

Для реализации этого подхода мы используем событие поля ввода ПриИзменении.

Решение 3: Очистка строки с помощью регулярных выражений (Рекомендуется для 1С 8.3.23+)

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

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


&НаКлиенте
Процедура НомерТелефонаПриИзменении(Элемент)
    
    // Получаем текущее значение из реквизита
    ИсходныйТекст = Объект.НомерТелефона;
    
    // Регулярное выражение [^0-9] находит любой символ, не являющийся цифрой от 0 до 9
    // Функция СтрЗаменитьПоРегулярномуВыражению заменяет все такие символы на пустую строку
    ОчищенныйТекст = СтрЗаменитьПоРегулярномуВыражению(ИсходныйТекст, "[^0-9]", "");
    
    // Записываем очищенный результат обратно в реквизит
    Объект.НомерТелефона = ОчищенныйТекст;
    
КонецПроцедуры

Этот код работает на стороне клиента мгновенно и без лишней нагрузки на сервер.

Решение 4: Способы очистки строки для старых версий платформ (до 8.3.23)

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

Вариант А. Высокопроизводительный трюк со «СтрРазделить» и «СтрСоединить» (начиная с 1С 8.3.6)

Классический посимвольный перебор строки в цикле работает достаточно медленно на длинных строках. Мы можем использовать оригинальный метод разделения строки, который работает на уровне платформенных C++ алгоритмов чрезвычайно быстро:


&НаКлиенте
Функция ОчиститьСтрокуТолькоЦифры(Знач ИсходнаяСтрока)
    
    // Шаг 1: Получаем все нецифровые символы из исходной строки
    МассивЛишнихСимволов = СтрРазделить(ИсходнаяСтрока, "0123456789", Ложь);
    СтрокаЛишнихСимволов = СтрСоединить(МассивЛишнихСимволов, "");
    
    // Шаг 2: Разделяем исходную строку по найденным нецифровым символам
    МассивТолькоЦифр = СтрРазделить(ИсходнаяСтрока, СтрокаЛишнихСимволов, Ложь);
    
    // Шаг 3: Соединяем фрагменты обратно в единую строку
    Возврат СтрСоединить(МассивТолькоЦифр, "");
    
КонецФункции

Этот алгоритм работает без единого цикла Для, что делает его оптимальным выбором для оптимизации производительности мобильных клиентов и слабых рабочих станций.

Вариант Б. Использование регулярных выражений через COM (VBScript.RegExp)

Если ваши пользователи работают исключительно под управлением операционной системы Windows (тонкий или толстый клиент), вы можете обратиться к системному движку регулярных выражений Microsoft Active Scripting через COM-объект:


&НаКлиенте
Функция ОчиститьСтрокуЧерезCOM(Знач ИсходнаяСтрока)
    
    Попытка
        RegExp = Новый COMОбъект("VBScript.RegExp");
        RegExp.Global = Истина;
        RegExp.Pattern = "[^0-9]";
        Возврат RegExp.Replace(ИсходнаяСтрока, "");
    Исключение
        // На случай запуска на Linux или macOS клиенте, используем резервный метод
        Возврат ОчиститьСтрокуТолькоЦифры(ИсходнаяСтрока);
    КонецПопытки;
    
КонецФункции

Вариант В. Использование готовых функций БСП

Разработчикам типовых конфигураций нет необходимости изобретать велосипед. Библиотека Стандартных Подсистем уже содержит готовые оптимизированные функции. Например, общий модуль УправлениеКонтактнойИнформациейКлиентСервер предоставляет готовую экспортную функцию:


&НаКлиенте
Процедура НомерТелефонаПриИзменении(Элемент)
    
    Объект.НомерТелефона = УправлениеКонтактнойИнформациейКлиентСервер.ОставитьТолькоЦифрыВСтроке(Объект.НомерТелефона);
    
КонецПроцедуры

Если же перед вами стоит задача не очистить строку, а просто проверить, состоит ли она целиком из цифр, используйте функцию из строкового модуля БСП:


Если Не СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Объект.НомерТелефона) Тогда
    // Обработка ошибки заполнения поля
КонецЕсли;

Решение 5: Использование стандартной подсистемы Контактной Информации (БСП)

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

Этот подход решает проблему ввода на системном уровне:

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

← На главную