Разработка и Конфигурация · 11 мин
Проверка строки на наличие только букв в 1С
Способы проверить, что строка состоит только из букв, в 1С 8.3: перебор символов, регулярные выражения, СтрРазделить. Готовые функции на встроенном языке.
Проверка, что строка содержит только буквы, — типовая задача при разработке в 1С: валидация ФИО сотрудника, наименования контрагента, кода справочника или данных, загружаемых из файла. Во встроенном языке 1С нет готовой функции «СтрокаСодержитТолькоБуквы», поэтому разработчику приходится реализовывать проверку самостоятельно — перебором символов, через функцию Найти или через регулярные выражения.
Выбор способа зависит от контекста: где выполняется код (клиент или сервер), какие символы считаются допустимыми (только кириллица, кириллица и латиница, нужен ли пробел или дефис), насколько критична производительность при массовой обработке данных. Ниже разобраны рабочие варианты с готовым кодом и их ограничения.
Почему в 1С нет готовой функции и что считать буквой
Платформа 1С:Предприятие 8.3 предоставляет базовые строковые функции: СтрДлина, Сред, Лев, Прав, Найти, СтрЗаменить, ВРег, НРег. Специализированной функции проверки «только буквы» среди них нет, потому что понятие «буква» зависит от прикладной задачи. Для ФИО допустимы кириллица, пробел и дефис; для логина — латиница и цифры; для артикула — смешанный набор.
Поэтому первый шаг — точно определить допустимый алфавит. Типичные варианты:
- только русские буквы: «абвгдеёжзийклмнопрстуфхцчшщъыьэюя» в обоих регистрах;
- русские и латинские буквы;
- буквы плюс пробел, дефис, апостроф (фамилии вроде «Салтыков-Щедрин», «Д'Артаньян»);
- буквы Unicode других алфавитов (казахский, украинский и другие).
Обратите внимание на букву «ё» — её часто забывают включать в алфавит, и проверка начинает отклонять корректные значения вроде «Артём». Это одна из самых распространённых ошибок при самостоятельной реализации.
Способ 1. Перебор символов с проверкой через Найти()
Универсальный и самый читаемый способ — пройти по каждому символу строки и проверить, входит ли он в строку допустимых букв. Функция Найти(ПодстрокаПоиска) возвращает позицию символа или 0, если символ не найден.
Функция СтрокаСодержитТолькоБуквы(ПроверяемаяСтрока) Экспорт
Если ПустаяСтрока(ПроверяемаяСтрока) Тогда
Возврат Ложь;
КонецЕсли;
ДопустимыеБуквы = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
+ "abcdefghijklmnopqrstuvwxyz";
Для Позиция = 1 По СтрДлина(ПроверяемаяСтрока) Цикл
Символ = НРег(Сред(ПроверяемаяСтрока, Позиция, 1));
Если Найти(ДопустимыеБуквы, Символ) = 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Приведение символа к нижнему регистру через НРег() позволяет хранить алфавит в одном регистре и не дублировать заглавные буквы. Если нужно разрешить пробел и дефис, просто добавьте их в строку ДопустимыеБуквы: ДопустимыеБуквы = ДопустимыеБуквы + " -";
Способ работает на толстом, тонком и веб-клиенте, на сервере, не требует внешних компонент и легко модифицируется под любой алфавит. Для большинства прикладных задач это рекомендуемый вариант.
ДопустимыеБуквы = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя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 | Да | Да | Нет |
| Производительность на массовой обработке | Высокая | Средняя | Средняя (при кэшировании объекта) |
| Сложные шаблоны | Сложно реализовать | Сложно реализовать | Гибко |
| Простота поддержки | Высокая | Высокая | Требует знания регулярных выражений |
Как выбрать действие
Интеграция проверки в прикладной код
Функцию проверки размещают в общем модуле с признаками «Сервер» и «Вызов сервера», если она нужна на клиенте и сервере. Если проверка нужна только на клиенте формы (например, при вводе ФИО), подойдёт общий модуль с признаком «Клиент (обычное приложение)» и «Клиент (управляемое приложение)».
Типовой сценарий — валидация в обработчике ПриИзменении или ПередЗаписью:
&НаКлиенте
Процедура ФамилияПриИзменении(Элемент)
Если Не ОбщегоНазначенияВызовСервера.СтрокаСодержитТолькоБуквы(Объект.Фамилия) Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(
"Фамилия должна содержать только буквы", , "Объект.Фамилия");
КонецЕсли;
КонецПроцедуры
Для данных, критичных к целостности (например, коды, участвующие в обмене), дублируйте проверку на сервере в модуле объекта в обработчике ОбработкаПроверкиЗаполнения — клиентскую валидацию можно обойти программно, серверную нельзя.
- 1Определите допустимый алфавит: кириллица, латиница, «ё», пробел, дефис
- 2Создайте функцию в общем серверном модуле с перебором символов через Найти()
- 3Подключите вызов функции в обработчике формы или ПередЗаписью
- 4Добавьте серверную проверку в ОбработкаПроверкиЗаполнения для критичных данных
- 5Протестируйте на граничных значениях: пустая строка, «ё», дефис, цифры, спецсимволы
Типичные ошибки и как их избежать
Первая ошибка — забытая буква «ё». Проверка проходит тесты на «Иванов», но отклоняет «Алёна». Вторая — сравнение без приведения регистра: алфавит записан строчными, а проверяемый символ заглавный, и Найти() возвращает 0. Всегда приводите символ к одному регистру через НРег() или ВРег().
Третья ошибка — проверка пустой строки. Цикл по символам пустой строки не выполнится ни разу, и функция вернёт Истина, хотя пустое значение обычно недопустимо. Обрабатывайте этот случай явно через ПустаяСтрока() в начале функции.
Четвёртая — неучтённые неразрывные пробелы и управляющие символы, которые попадают в строку при копировании из Word или Excel. Символ с кодом 160 (неразрывный пробел) визуально неотличим от обычного, но проверку не пройдёт. Перед проверкой полезно выполнить СокрЛП() и, при необходимости, заменить неразрывный пробел на обычный: СтрЗаменить(Строка, Символ(160), " ").
Проверка результата и тестовые данные
После внедрения функции проверьте её на контрольном наборе значений. Корректная реализация должна дать предсказуемый результат на каждом из них.
Как проверить результат
Функция возвращает Истина
Ложь — проверьте алфавит и регистр
Истина — буква «ё» учтена
Ложь — добавьте «ё» в алфавит
Ложь — цифры отклоняются
Истина — проверка не работает
Ложь согласно явной обработке
Истина — нет проверки ПустаяСтрока()
Соответствует требованиям к алфавиту (пробел разрешён или нет)
Результат противоречит спецификации
Часто задаваемые вопросы
Как проверить, что строка содержит только буквы и цифры?
Добавьте в строку допустимых символов цифры: «0123456789». Логика функции с перебором через Найти() не меняется — расширяется только алфавит. При использовании RegExp шаблон будет вида ^[а-яёa-z0-9]+$.
Работает ли VBScript.RegExp в веб-клиенте и на Linux?
Нет. Это COM-объект Windows, поэтому он недоступен в веб-клиенте и на сервере под управлением Linux. Для кроссплатформенного решения используйте перебор символов со встроенными функциями языка — он работает везде одинаково.
Как разрешить в ФИО дефис и пробел, но запретить цифры?
Добавьте пробел и дефис в строку допустимых символов: ДопустимыеБуквы = Алфавит + " -". Цифры в алфавит не включайте — они автоматически не пройдут проверку. Дополнительно можно проверить, что дефис не стоит первым или последним символом, отдельным условием через Лев() и Прав().
Что делать с буквами других алфавитов, например казахскими или украинскими?
Перечислите специфические буквы (ә, ғ, қ, ң, ө, ұ, ү, һ, і, ї, є, ґ и другие) в строке допустимых символов явно. Диапазоны в регулярных выражениях вида [а-я] их не захватывают, так как эти символы имеют отдельные коды Unicode.
Где размещать функцию проверки в конфигурации?
В общем модуле с признаками «Сервер» и «Вызов сервера», если функция нужна и на клиенте, и на сервере. Для критичных данных продублируйте проверку в обработчике ОбработкаПроверкиЗаполнения модуля объекта — это защитит от записи невалидных значений программным способом.
Как ускорить проверку при обработке большого объёма строк?
Вынесите формирование строки алфавита из тела функции в константу модуля или параметр, не создавайте COM-объект RegExp на каждой итерации, а для перебора символов завершайте цикл сразу при нахождении первого недопустимого символа через Возврат Ложь.
Что важно запомнить
Готовой функции проверки «только буквы» в 1С нет: используйте перебор символов с Найти() как универсальное кроссплатформенное решение, а регулярные выражения через VBScript.RegExp — только в Windows-окружении. Обязательно учтите букву «ё», регистр, пустую строку и неразрывные пробелы, а критичные проверки дублируйте на сервере.