Как настроить маску ввода в 1С, чтобы разрешить ввод только буквенных символов?

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

При разработке интерфейсов в 1С часто возникает задача ограничить ввод пользователя определенным форматом. Типичный пример — ввод государственного регистрационного номера автотранспорта (например, «А 777 АА»). Стандартное свойство Маска у поля ввода кажется очевидным решением, однако разработчики быстро сталкиваются с проблемой: в платформе 1С не существует специального символа маски, который разрешал бы ввод только букв, полностью исключая цифры.

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

Ограничения стандартного механизма масок

Для начала проанализируем поведение стандартных символов маски в 1С. Обычно разработчики пытаются использовать следующие символы:

  1. @ — допускает ввод любых алфавитно-цифровых символов (буквы и цифры).
  2. U — аналогично @, но переводит символы в верхний регистр.
  3. N — алфавитно-цифровой символ.

Как мы видим, все эти символы являются «смешанными». Если мы установим маску @ 999 @@, платформа позволит пользователю ввести «1 222 33», так как в позиции @ цифры считаются допустимыми символами. Символ ^ в маске также не является инверсией (как в регулярных выражениях); он лишь запрещает интерактивный ввод в конкретной позиции, пропуская курсор дальше.

Таким образом, использование только свойства Маска недостаточно. Нам необходимо комбинировать маску для визуальной структуры строки с программной проверкой введенных данных.

Решение 1: Маска в сочетании с регулярными выражениями (VBScript)

Если вы работаете на версиях платформы ниже 8.3.23, самым надежным способом проверки строки будет использование объекта VBScript.RegExp. Этот метод позволяет проверить, соответствует ли введенная строка нашему шаблону, где в нужных местах стоят именно буквы.

Рассмотрим пример функции для проверки номера автотранспорта (формат: Буква ЦифраЦифраЦифра БукваБуква):


Функция НомерСоответствуетФормату(Знач ТекстНомера) Экспорт
    
    // Удаляем лишние пробелы
    ТекстНомера = СокрЛП(ТекстНомера);
    
    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.MultiLine = Ложь;
    RegExp.Global = Ложь;
    RegExp.IgnoreCase = Истина; // Игнорируем регистр при проверке
    
    // Шаблон: одна русская буква, три цифры, две русские буквы
    // Используем набор допустимых символов для госномеров РФ
    RegExp.Pattern = "^[АВЕКМНОРСТУХ]{1}\d{3}[АВЕКМНОРСТУХ]{2}$";
    
    Возврат RegExp.Test(ТекстНомера);
    
КонецФункции

Эту функцию следует вызывать в событии ПриИзменении или ПередЗаписью. Если результат Ложь, мы можем вывести предупреждение пользователю и очистить поле или вернуть предыдущее значение.

Решение 2: Использование встроенных функций (Платформа 8.3.23 и выше)

В современных версиях платформы 1С (начиная с 8.3.23) работа с регулярными выражениями стала нативной. Нам больше не нужно обращаться к COM-объектам Windows, что значительно повышает производительность и кроссплатформенность решения (актуально для Linux-серверов и веб-клиента).

Разберем, как проверить строку с помощью новой функции СтрПодобна. Эта функция возвращает Истина, если строка соответствует шаблону. Шаблоны здесь поддерживают квантификаторы и группы символов.


// Пример проверки в событии ПриИзменении
&НаКлиенте
Процедура ГосНомерПриИзменении(Элемент)
    
    ШаблонНомера = "[А-Я]{1}[0-9]{3}[А-Я]{2}"; // Шаблон для кириллицы
    
    Если Не СтрПодобна(Объект.ГосНомер, ШаблонНомера) Тогда
        Сообщить("Номер введен некорректно! Ожидается формат: Б ЦЦЦ ББ");
        // Дополнительная логика очистки
    КонецЕсли;
    
КонецПроцедуры

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

Решение 3: Ограничение набора символов согласно ГОСТ

Выясним важный нюанс, касающийся номеров автотранспорта. Согласно ГОСТу, в российских номерах используются не все буквы алфавита, а только те 12, которые имеют графические аналоги в латинском алфавите: А, В, Е, К, М, Н, О, Р, С, Т, У, Х.

Проанализируем ситуацию: если пользователь введет букву «Щ» или «Ы», это будет технически «буквой», но фактически — ошибкой в номере. Поэтому при программной проверке лучше использовать строгий набор символов. Посмотрим на пример кода для фильтрации «на лету»:


&НаКлиенте
Процедура ГосНомерАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
    
    // Приводим к верхнему регистру
    ТекстВРег = ВРег(Текст);
    
    // Оставляем только разрешенные буквы и цифры
    ДопустимыеБуквы = "АВЕКМНОРСТУХ";
    ДопустимыеЦифры = "0123456789";
    
    ЧистыйТекст = "";
    Для Поз = 1 По СтрДлина(ТекстВРег) Цикл
        Символ = Сред(ТекстВРег, Поз, 1);
        Если СтрНайти(ДопустимыеБуквы + ДопустимыеЦифры, Символ) > 0 Тогда
            ЧистыйТекст = ЧистыйТекст + Символ;
        КонецЕсли;
    КонецЦикла;
    
    // Если текст изменился после чистки - обновляем его
    Если ЧистыйТекст <> Текст Тогда
        Текст = ЧистыйТекст;
    КонецЕсли;
    
КонецПроцедуры

Подводные камни и рекомендации

При реализации ввода только буквенных символов важно учитывать следующие моменты:

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

← На главную