Разработка и Конфигурация · 11 мин
Как проверить строку на наличие символов в 1С
Проверка строки на наличие символов в 1С: функции СтрНайти, СтрЧислоВхождений, регулярные выражения, проверка на пустоту и недопустимые символы. Примеры кода.
Проверка строки на наличие определённых символов — одна из самых частых задач при разработке на платформе 1С:Предприятие. Она встречается при валидации введённых пользователем данных (наименований, ИНН, номеров документов), при парсинге файлов обмена, при очистке строк от недопустимых символов перед записью в базу или выгрузкой в XML.
Во встроенном языке 1С нет единственной «правильной» функции для этой задачи — есть несколько инструментов с разным поведением: СтрНайти, СтрЧислоВхождений, СтрДлина в сочетании с СокрЛП, а также перебор символов в цикле для сложных проверок. Выбор зависит от того, что именно нужно узнать: факт присутствия символа, его позицию, количество вхождений или соответствие строки целому шаблону.
Материал ориентирован на платформу 8.3, где доступны функции семейства СтрНайти (в старых версиях использовалась функция Найти, которая до сих пор работает ради совместимости). Все примеры приведены на встроенном языке и могут быть выполнены как на сервере, так и на клиенте, если не указано иное.
Базовая проверка через СтрНайти
Функция СтрНайти(Строка, ПодстрокаПоиска) возвращает позицию первого вхождения подстроки (нумерация начинается с 1) или 0, если подстрока не найдена. Это основной инструмент для ответа на вопрос «есть ли в строке нужный символ».
СтрокаПроверки = "Документ №123/АБ";
Если СтрНайти(СтрокаПроверки, "/") > 0 Тогда
Сообщить("Символ / найден в строке");
Иначе
Сообщить("Символ / отсутствует");
КонецЕсли;
Важно помнить о регистре: по умолчанию поиск чувствителен к регистру, то есть СтрНайти("АБВ", "а") вернёт 0. Если регистр не важен, приведите обе строки к одному регистру функциями ВРег или НРег перед сравнением.
У функции есть необязательные параметры: направление поиска (с начала или с конца), позиция, с которой начинать поиск, и номер вхождения. Это удобно, когда нужно найти не первое, а, например, второе вхождение разделителя в строке формата «Фамилия Имя Отчество».
Если СтрНайти(ВРег(СтрокаПроверки), ВРег(ИскомыйСимвол)) > 0 Тогда
// символ найден независимо от регистра
КонецЕсли;Подсчёт вхождений через СтрЧислоВхождений
Когда недостаточно знать факт наличия символа, а нужно понять, сколько раз он встречается, используйте СтрЧислоВхождений(Строка, ПодстрокаПоиска). Типичный сценарий — проверка корректности дробного числа, введённого строкой: точка или запятая должна встречаться не более одного раза.
ВведенноеЧисло = "12,5,7";
Если СтрЧислоВхождений(ВведенноеЧисло, ",") > 1 Тогда
Сообщить("Ошибка: разделитель встречается более одного раза");
КонецЕсли;
Ещё один практический пример — контроль структуры строки с разделителями. Если ожидается строка вида «Код|Наименование|Цена», то число символов «|» должно быть ровно два. Отклонение от этого значения — признак битых данных при импорте.
Проверка строки на пустоту и пробельные символы
Отдельный частый случай — проверка, содержит ли строка что-либо кроме пробелов, табуляций и неразрывных пробелов. Для этого в 1С есть специальная функция ПустаяСтрока, которая возвращает Истина, если строка пустая или состоит только из незначащих символов.
Если ПустаяСтрока(ПолеВвода) Тогда
Сообщить("Поле не заполнено");
КонецЕсли;
Функция учитывает пробелы, символы табуляции, переноса строки и неразрывные пробелы (Символ(160)), что делает её надёжнее ручного сравнения с пустой строкой. Если нужно не проверить, а очистить строку, используйте СокрЛП (удаляет незначащие символы слева и справа), СокрЛ или СокрП.
Проверка каждого символа строки в цикле
Когда нужно проверить строку на соответствие набору допустимых символов — например, убедиться, что ИНН состоит только из цифр, — удобнее всего перебрать строку посимвольно. Для этого используются СтрДлина и Сред.
Функция ТолькоЦифры(ПроверяемаяСтрока)
Цифры = "0123456789";
Для Позиция = 1 По СтрДлина(ПроверяемаяСтрока) Цикл
ТекущийСимвол = Сред(ПроверяемаяСтрока, Позиция, 1);
Если СтрНайти(Цифры, ТекущийСимвол) = 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Такой подход легко адаптируется: строку допустимых символов можно сформировать из цифр, букв обоих алфавитов и служебных знаков. Для проверки «только буквы русского алфавита» сравнивайте символ с диапазоном через КодСимвола либо перечислите алфавит явно, включая букву «ё» — она стоит отдельно в таблице кодов и часто теряется.
Альтернатива перебору — удаление всех допустимых символов через СтрЗаменить в цикле и проверка результата на пустоту. Это короче по коду, но медленнее на длинных строках и менее наглядно при отладке.
- 1Определите набор допустимых символов и сохраните его в строковую константу
- 2Пройдите по строке циклом от 1 до СтрДлина(Строка)
- 3Для каждого символа вызовите СтрНайти по строке допустимых символов
- 4Если СтрНайти вернула 0 — зафиксируйте позицию и сам недопустимый символ
- 5Верните результат: булево для простой проверки или список ошибок для диагностики
Регулярные выражения для сложных шаблонов
Встроенного механизма регулярных выражений во встроенном языке 1С нет. Для сложных шаблонов (например, «строка начинается с буквы, далее 5 цифр») на Windows-клиенте и сервере под Windows традиционно используют COM-объект VBScript.RegExp.
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "^[А-Яа-яЁё]+$";
Если RegExp.Test(ПроверяемаяСтрока) Тогда
Сообщить("Строка состоит только из русских букв");
КонецЕсли;
У этого подхода есть ограничения: он не работает на Linux-сервере и в веб-клиенте, а создание COM-объекта — относительно дорогая операция, поэтому в массовых обработках объект создают один раз и переиспользуют. В кроссплатформенных решениях сложные шаблоны реализуют собственными функциями на встроенном языке или выносят во внешние компоненты.
Проверка недопустимых символов при выгрузке в XML и именах файлов
Особый класс задач — проверка строк перед выгрузкой в XML. Спецификация XML запрещает ряд управляющих символов (коды 0–8, 11, 12, 14–31), которые могут попасть в данные при копировании из внешних систем. Платформа при записи XML выдаст ошибку, если такой символ встретится в значении.
Функция ЕстьНедопустимыеXMLСимволы(Строка)
Для Позиция = 1 По СтрДлина(Строка) Цикл
Код = КодСимвола(Строка, Позиция);
Если Код < 32 И Код <> 9 И Код <> 10 И Код <> 13 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Аналогично проверяются имена файлов: в Windows запрещены символы \ / : * ? " < > |. Перед формированием имени файла из пользовательских данных (например, из наименования контрагента) такие символы следует искать через СтрНайти и заменять на безопасные, иначе попытка записи файла завершится ошибкой.
Сравнение методов и выбор подхода
Кратко сведём критерии выбора. Для простого ответа «есть / нет» достаточно СтрНайти сравнить с нулём. Для количественной оценки — СтрЧислоВхождений. Для проверки на пустоту — только ПустаяСтрока. Для проверки состава строки по набору допустимых символов — посимвольный перебор. Для шаблонов произвольной сложности на Windows — регулярные выражения.
Сравнение вариантов
Быстрый ответ «найдено/не найдено» и позиция вхождения. Не считает количество
Нужно число вхождений подстроки. Для поиска позиции не подходит
Проверка на пустоту с учётом пробелов и неразрывных пробелов. Не ищет конкретные символы
Проверка каждого символа по набору допустимых. Требует больше кода, медленнее на длинных строках
Сложные шаблоны. Только Windows, не работает в веб-клиенте
По производительности различия между СтрНайти и СтрЧислоВхождений на коротких строках несущественны. Заметная разница появляется при обработке больших текстов (сотни килобайт) в цикле — там стоит минимизировать число проходов по строке и избегать конкатенации строк внутри цикла, заменяя её массивом с последующим СтрСоединить.
Как проверить результат
Число от 1 до СтрДлина строки — позиция найденного символа
0 — символ не найден; отрицательные значения функция не возвращает
ПустаяСтрока(СокрЛП(Строка)) даёт ожидаемый результат для строки из пробелов
Сравнение с "" пропускает строки из пробелов и неразрывных пробелов
Функция находит первый недопустимый символ и сообщает его позицию
Проверка не находит 'ё', неразрывный пробел или кириллицу другого регистра
Частые вопросы
Чем отличается СтрНайти от старой функции Найти?
По сути — только именем: поведение идентично, обе возвращают позицию вхождения или 0. Функция Найти сохранена для совместимости с кодом, написанным под платформу 8.2, но в новых разработках рекомендуется СтрНайти, так как префикс «Стр» явно указывает на работу со строками.
Как проверить, что строка содержит хотя бы одну цифру?
Пройдите по строке циклом и для каждого символа проверьте вхождение в строку "0123456789" через СтрНайти. Как только вхождение найдено — верните Истина. Либо на Windows используйте регулярное выражение с шаблоном "\d".
Почему СтрНайти не находит пробел, который виден на экране?
Скорее всего, это неразрывный пробел с кодом 160, а не обычный пробел с кодом 32. Ищите его через СтрНайти(Строка, Символ(160)) или предварительно замените все неразрывные пробелы на обычные функцией СтрЗаменить.
Как проверить строку на наличие нескольких разных символов сразу?
Сформируйте строку из всех искомых символов, например Запрещенные = "\/:*?"", и переберите проверяемую строку посимвольно, проверяя каждый символ через СтрНайти(Запрещенные, Символ). Альтернатива — цикл по массиву искомых подстрок с вызовом СтрНайти для каждой.
Можно ли использовать регулярные выражения на Linux-сервере 1С?
Штатного механизма регулярных выражений во встроенном языке нет, а VBScript.RegExp доступен только под Windows. На Linux остаются посимвольный разбор на встроенном языке, внешние компоненты по технологии Native API или вынос проверки во внешний сервис.
Как проверить строку на наличие кириллицы?
Переберите символы и сравните код каждого через КодСимвола: основной диапазон кириллицы в Unicode — с 1040 по 1103, плюс буквы Ё (код 1025) и ё (код 1105). Проще сформировать строку со всеми буквами обоих регистров, включая Ёё, и проверять вхождение через СтрНайти.
Что важно запомнить
Для поиска символа используйте СтрНайти и сравнивайте результат с нулём, для подсчёта — СтрЧислоВхождений, для проверки на пустоту — ПустаяСтрока. Состав строки по набору допустимых символов проверяйте посимвольным перебором, а регулярные выражения через VBScript.RegExp оставляйте для Windows-окружений. Не забывайте про регистр букв и неразрывные пробелы — это самые частые причины «неработающих» проверок.