Как реализовать проверку поля «Фамилия» в 1С на наличие только букв с помощью регулярных выражений?

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

При разработке интерфейсов ввода данных в 1С часто возникает задача строгой валидации текстовых полей. Одной из наиболее типичных ситуаций является проверка полей «Фамилия», «Имя» или «Отчество» на корректность. Мы должны гарантировать, что пользователь ввел только буквы, исключив цифры, спецсимволы и лишние знаки препинания. Рассмотрим подробнее, как решить эту задачу с помощью механизмов регулярных выражений, проанализируем типичные ошибки начинающих разработчиков и разберем современные способы реализации этой проверки.

Анализ проблемы и использование COM-объекта VBScript.RegExp

Традиционно в 1С для работы с регулярными выражениями до выхода последних версий платформы использовался внешний COM-объект VBScript.RegExp. Это мощный инструмент, который позволяет сопоставлять строки с заданными шаблонами. Разберем ситуацию, когда при записи элемента справочника нам необходимо проверить реквизит Объект.Фамилия.

Первая проблема, с которой сталкиваются разработчики — это ошибка «Слишком много фактических параметров». Проанализируем причину: это происходит, когда в коде вызова функции передается больше аргументов, чем описано в самом определении функции (заголовок Функция Имя(Параметр1)...). Для решения этой задачи мы должны привести в соответствие вызов функции и ее описание.

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


&НаКлиенте
Функция ПроверитьСтрокуНаТолькоБуквы(СтрокаАнализа)
    
    // Создаем объект для работы с регулярными выражениями
    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина;
    
    // Устанавливаем шаблон: искать только кириллические буквы
    RegExp.Pattern = "[а-яА-Я]"; 
    
    // Выполняем поиск всех совпадений
    Matches = RegExp.Execute(СтрокаАнализа);
    
    // Сравниваем количество найденных букв с общей длиной строки
    КоличествоБукв = Matches.Count;
    КоличествоСимволов = СтрДлина(СтрокаАнализа);
    
    Если КоличествоБукв <> КоличествоСимволов Тогда
        Возврат Ложь; // В строке есть что-то кроме букв
    Иначе
        Возврат Истина; // Строка чистая
    КонецЕсли;
    
КонецФункции

Интеграция проверки в процедуру ПередЗаписью

Теперь разберем, как правильно вызвать эту проверку в модуле формы. Нам важно не просто проверить данные, но и остановить запись объекта, если данные некорректны, а также оповестить пользователя. Проанализируем пример кода в процедуре ПередЗаписью:


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    
    // Проверка Фамилии
    Если ПустаяСтрока(Объект.Фамилия) Тогда
        Сообщить("Заполните поле Фамилия!");
        Отказ = Истина;
    ИначеЕсли Не ПроверитьСтрокуНаТолькоБуквы(Объект.Фамилия) Тогда
        Сообщить("В поле Фамилия недопустимы цифры и специальные символы!");
        Отказ = Истина;
    КонецЕсли;
    
    // Проверка Имени (используем ту же функцию)
    Если Не Отказ И Не ПроверитьСтрокуНаТолькоБуквы(Объект.Имя) Тогда
        Сообщить("В поле Имя обнаружены некорректные символы!");
        Отказ = Истина;
    КонецЕсли;

КонецПроцедуры

Обратите внимание на использование переменной Отказ. Устанавливая ее в значение Истина, мы сообщаем платформе, что запись объекта выполнять нельзя. Использование одной универсальной функции для разных полей (Фамилия, Имя, Отчество) делает код чище и удобнее для поддержки.

Оптимизация шаблонов и учет особенностей кириллицы

Проанализируем используемый шаблон [а-яА-Я]. В нем есть несколько нюансов, которые могут привести к ошибкам в реальной работе:

  1. Проблема буквы «ё»: В кодировке Unicode буква «ё» стоит отдельно от основного диапазона «а-я». Если ваша фамилия «Семёнов», стандартный шаблон может посчитать ее некорректной. Правильнее использовать шаблон [а-яА-ЯёЁ].
  2. Сложные фамилии: Фамилии могут быть двойными, например, «Мамин-Сибиряк». В этом случае проверка на «только буквы» выдаст ошибку из-за дефиса. Если бизнес-логика допускает дефисы, шаблон следует изменить на [а-яА-ЯёЁ\-].
  3. Лишние пробелы: Пользователи часто копируют данные из других документов вместе с невидимыми пробелами в конце. Перед проверкой всегда рекомендуется использовать функцию СокрЛП().

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


// Более эффективный шаблон для проверки всей строки
RegExp.Pattern = "^[а-яА-ЯёЁ]+$";
Результат = RegExp.Test(СтрокаАнализа); // Метод Test возвращает Булево

Метод Test работает значительно быстрее, чем Execute, так как он прекращает проверку сразу же, как только находит первый недопустимый символ, а не собирает коллекцию всех совпадений.

Современный подход в платформе 8.3.24 и выше

Важно отметить, что начиная с версии платформы 8.3.24, в 1С появился встроенный объект РегулярноеВыражение. Это долгожданное обновление, которое позволяет отказаться от использования COMОбъект. Это критично для систем, работающих на операционных системах Linux, где компоненты VBScript недоступны.

Выясним, как выглядит современная реализация этой же функции:


&НаКлиенте
Функция ПроверитьСтрокуСовременно(Знач СтрокаАнализа)
    
    // Удаляем лишние пробелы по краям
    СтрокаАнализа = СокрЛП(СтрокаАнализа);
    
    Если ПустаяСтрока(СтрокаАнализа) Тогда
        Возврат Ложь;
    КонецЕсли;
    
    // Создаем встроенный объект регулярного выражения
    // Шаблон: ^ - начало, [буквы кириллицы]+ - одна и более, $ - конец
    РегЭксп = Новый РегулярноеВыражение("^[а-яА-ЯёЁ]+$");
    
    // Проверяем на соответствие
    Возврат РегЭксп.Проверить(СтрокаАнализа);
    
КонецФункции

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

Заключение и рекомендации

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

Разбор данных примеров поможет вам избежать типичных ошибок «новичка» и создавать надежные механизмы контроля качества данных в ваших конфигурациях 1С.

← На главную