К статье
Практический материал

Разработка и Конфигурация · 11 мин

Проверка строки на наличие только букв в 1С

Способы проверить, что строка состоит только из букв, в 1С 8.3: перебор символов, регулярные выражения, СтрРазделить. Готовые функции на встроенном языке.

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

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

Почему в 1С нет готовой функции и что считать буквой

Платформа 1С:Предприятие 8.3 предоставляет базовые строковые функции: СтрДлина, Сред, Лев, Прав, Найти, СтрЗаменить, ВРег, НРег. Специализированной функции проверки «только буквы» среди них нет, потому что понятие «буква» зависит от прикладной задачи. Для ФИО допустимы кириллица, пробел и дефис; для логина — латиница и цифры; для артикула — смешанный набор.

Поэтому первый шаг — точно определить допустимый алфавит. Типичные варианты:

  • только русские буквы: «абвгдеёжзийклмнопрстуфхцчшщъыьэюя» в обоих регистрах;
  • русские и латинские буквы;
  • буквы плюс пробел, дефис, апостроф (фамилии вроде «Салтыков-Щедрин», «Д'Артаньян»);
  • буквы Unicode других алфавитов (казахский, украинский и другие).

Обратите внимание на букву «ё» — её часто забывают включать в алфавит, и проверка начинает отклонять корректные значения вроде «Артём». Это одна из самых распространённых ошибок при самостоятельной реализации.

Способ 1. Перебор символов с проверкой через Найти()

Универсальный и самый читаемый способ — пройти по каждому символу строки и проверить, входит ли он в строку допустимых букв. Функция Найти(ПодстрокаПоиска) возвращает позицию символа или 0, если символ не найден.

Функция СтрокаСодержитТолькоБуквы(ПроверяемаяСтрока) Экспорт

Если ПустаяСтрока(ПроверяемаяСтрока) Тогда

Возврат Ложь;

КонецЕсли;

ДопустимыеБуквы = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"

+ "abcdefghijklmnopqrstuvwxyz";

Для Позиция = 1 По СтрДлина(ПроверяемаяСтрока) Цикл

Символ = НРег(Сред(ПроверяемаяСтрока, Позиция, 1));

Если Найти(ДопустимыеБуквы, Символ) = 0 Тогда

Возврат Ложь;

КонецЕсли;

КонецЦикла;

Возврат Истина;

КонецФункции

Приведение символа к нижнему регистру через НРег() позволяет хранить алфавит в одном регистре и не дублировать заглавные буквы. Если нужно разрешить пробел и дефис, просто добавьте их в строку ДопустимыеБуквы: ДопустимыеБуквы = ДопустимыеБуквы + " -";

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

1c
ДопустимыеБуквы = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz -";
Если Найти(ДопустимыеБуквы, НРег(Символ)) = 0 Тогда
	Возврат Ложь;
КонецЕсли;

Способ 2. Проверка через удаление букв

Альтернативный приём: удалить из строки все допустимые буквы с помощью СтрЗаменить и проверить, что осталась пустая строка. Если что-то осталось — в исходной строке были недопустимые символы.

Функция ТолькоБуквыЧерезЗамену(ПроверяемаяСтрока) Экспорт

Если ПустаяСтрока(ПроверяемаяСтрока) Тогда

Возврат Ложь;

КонецЕсли;

Результат = НРег(ПроверяемаяСтрока);

Алфавит = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz";

Для Позиция = 1 По СтрДлина(Алфавит) Цикл

Результат = СтрЗаменить(Результат, Сред(Алфавит, Позиция, 1), "");

КонецЦикла;

Возврат ПустаяСтрока(Результат);

КонецФункции

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

Способ 3. Регулярные выражения через VBScript.RegExp

Для сложных шаблонов (например, «буквы, но не более одного дефиса и не в начале строки») удобны регулярные выражения. В 1С их обычно используют через COM-объект VBScript.RegExp.

Функция ТолькоБуквыRegExp(ПроверяемаяСтрока) Экспорт

Попытка

RegExp = Новый COMОбъект("VBScript.RegExp");

Исключение

Возврат Неопределено; // COM недоступен

КонецПопытки;

RegExp.Pattern = "^[а-яёa-z]+$";

RegExp.IgnoreCase = Истина;

RegExp.Global = Ложь;

Возврат RegExp.Test(ПроверяемаяСтрока);

КонецФункции

Шаблон ^[а-яёa-z]+$ читается так: от начала строки (^) до конца ($) один или более символов (+) из диапазонов русских и латинских букв. Флаг IgnoreCase снимает необходимость перечислять заглавные буквы.

Создание COM-объекта — относительно дорогая операция. При массовой проверке создавайте объект один раз и переиспользуйте его: передавайте в функцию как параметр или кэшируйте в переменной модуля, меняя только проверяемую строку.

Какой способ выбрать

Выбор зависит от среды выполнения и требований к шаблону. Сопоставление вариантов:

КритерийПеребор с Найти()СтрЗаменитьRegExp (COM)
Тонкий/веб-клиентДаДаНет
Сервер LinuxДаДаНет
Производительность на массовой обработкеВысокаяСредняяСредняя (при кэшировании объекта)
Сложные шаблоныСложно реализоватьСложно реализоватьГибко
Простота поддержкиВысокаяВысокаяТребует знания регулярных выражений
Маршрут решения

Как выбрать действие

Проверка выполняется на тонком или веб-клиенте либо сервере под LinuxИспользуйте перебор символов с функцией Найти()
Нужен простой шаблон «только буквы» или «буквы, пробел, дефис»Достаточно перебора символов — он прозрачнее и быстрее
Шаблон сложный: ограничение на число дефисов, позиции символов, группыИспользуйте регулярные выражения через VBScript.RegExp при условии Windows-окружения
Проверяются тысячи строк в циклеВыносите алфавит и COM-объект из тела цикла, создавайте их один раз

Интеграция проверки в прикладной код

Функцию проверки размещают в общем модуле с признаками «Сервер» и «Вызов сервера», если она нужна на клиенте и сервере. Если проверка нужна только на клиенте формы (например, при вводе ФИО), подойдёт общий модуль с признаком «Клиент (обычное приложение)» и «Клиент (управляемое приложение)».

Типовой сценарий — валидация в обработчике ПриИзменении или ПередЗаписью:

&НаКлиенте

Процедура ФамилияПриИзменении(Элемент)

Если Не ОбщегоНазначенияВызовСервера.СтрокаСодержитТолькоБуквы(Объект.Фамилия) Тогда

ОбщегоНазначенияКлиент.СообщитьПользователю(

"Фамилия должна содержать только буквы", , "Объект.Фамилия");

КонецЕсли;

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

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

Порядок внедрения проверки
  1. 1
    Определите допустимый алфавит: кириллица, латиница, «ё», пробел, дефис
  2. 2
    Создайте функцию в общем серверном модуле с перебором символов через Найти()
  3. 3
    Подключите вызов функции в обработчике формы или ПередЗаписью
  4. 4
    Добавьте серверную проверку в ОбработкаПроверкиЗаполнения для критичных данных
  5. 5
    Протестируйте на граничных значениях: пустая строка, «ё», дефис, цифры, спецсимволы

Типичные ошибки и как их избежать

Первая ошибка — забытая буква «ё». Проверка проходит тесты на «Иванов», но отклоняет «Алёна». Вторая — сравнение без приведения регистра: алфавит записан строчными, а проверяемый символ заглавный, и Найти() возвращает 0. Всегда приводите символ к одному регистру через НРег() или ВРег().

Третья ошибка — проверка пустой строки. Цикл по символам пустой строки не выполнится ни разу, и функция вернёт Истина, хотя пустое значение обычно недопустимо. Обрабатывайте этот случай явно через ПустаяСтрока() в начале функции.

Четвёртая — неучтённые неразрывные пробелы и управляющие символы, которые попадают в строку при копировании из Word или Excel. Символ с кодом 160 (неразрывный пробел) визуально неотличим от обычного, но проверку не пройдёт. Перед проверкой полезно выполнить СокрЛП() и, при необходимости, заменить неразрывный пробел на обычный: СтрЗаменить(Строка, Символ(160), " ").

Типичные ошибки
01
Не включена буква «ё» — отклоняются корректные ФИО вроде «Артём»
02
Нет приведения регистра — заглавные буквы не находятся в алфавите строчных
03
Пустая строка проходит проверку как валидная из-за отсутствия итераций цикла
04
Неразрывный пробел (Символ(160)) из скопированного текста ломает проверку
05
COM-объект RegExp создаётся на каждой итерации цикла — резкое падение производительности
06
Проверка только на клиенте — данные можно записать программно в обход валидации

Проверка результата и тестовые данные

После внедрения функции проверьте её на контрольном наборе значений. Корректная реализация должна дать предсказуемый результат на каждом из них.

Контрольные точки

Как проверить результат

Строка «Иванов»
Норма

Функция возвращает Истина

Тревожный признак

Ложь — проверьте алфавит и регистр

Строка «Артём»
Норма

Истина — буква «ё» учтена

Тревожный признак

Ложь — добавьте «ё» в алфавит

Строка «Иванов123»
Норма

Ложь — цифры отклоняются

Тревожный признак

Истина — проверка не работает

Пустая строка
Норма

Ложь согласно явной обработке

Тревожный признак

Истина — нет проверки ПустаяСтрока()

Строка с пробелом «ван дер Ваальс»
Норма

Соответствует требованиям к алфавиту (пробел разрешён или нет)

Тревожный признак

Результат противоречит спецификации

Часто задаваемые вопросы

Как проверить, что строка содержит только буквы и цифры?

Добавьте в строку допустимых символов цифры: «0123456789». Логика функции с перебором через Найти() не меняется — расширяется только алфавит. При использовании RegExp шаблон будет вида ^[а-яёa-z0-9]+$.

Работает ли VBScript.RegExp в веб-клиенте и на Linux?

Нет. Это COM-объект Windows, поэтому он недоступен в веб-клиенте и на сервере под управлением Linux. Для кроссплатформенного решения используйте перебор символов со встроенными функциями языка — он работает везде одинаково.

Как разрешить в ФИО дефис и пробел, но запретить цифры?

Добавьте пробел и дефис в строку допустимых символов: ДопустимыеБуквы = Алфавит + " -". Цифры в алфавит не включайте — они автоматически не пройдут проверку. Дополнительно можно проверить, что дефис не стоит первым или последним символом, отдельным условием через Лев() и Прав().

Что делать с буквами других алфавитов, например казахскими или украинскими?

Перечислите специфические буквы (ә, ғ, қ, ң, ө, ұ, ү, һ, і, ї, є, ґ и другие) в строке допустимых символов явно. Диапазоны в регулярных выражениях вида [а-я] их не захватывают, так как эти символы имеют отдельные коды Unicode.

Где размещать функцию проверки в конфигурации?

В общем модуле с признаками «Сервер» и «Вызов сервера», если функция нужна и на клиенте, и на сервере. Для критичных данных продублируйте проверку в обработчике ОбработкаПроверкиЗаполнения модуля объекта — это защитит от записи невалидных значений программным способом.

Как ускорить проверку при обработке большого объёма строк?

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

Итог

Что важно запомнить

Готовой функции проверки «только буквы» в 1С нет: используйте перебор символов с Найти() как универсальное кроссплатформенное решение, а регулярные выражения через VBScript.RegExp — только в Windows-окружении. Обязательно учтите букву «ё», регистр, пустую строку и неразрывные пробелы, а критичные проверки дублируйте на сервере.