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

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

Как перебрать символы в строке 1С

Как перебрать символы строки в 1С: цикл Для, функции СтрДлина и Сред, примеры кода, типичные ошибки и способы проверки результата.

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

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

Важно помнить: нумерация символов в строках 1С начинается с 1, а не с 0, как во многих других языках. Это частая причина ошибок у разработчиков, переходящих с других платформ.

Базовый перебор символов через цикл Для

Самый универсальный способ — цикл Для с явным счётчиком от 1 до длины строки. Длина определяется функцией СтрДлина(), а символ извлекается функцией Сред() с параметром длины 1.

Строка = "Привет, 1С!";

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

Символ = Сред(Строка, НомерСимвола, 1);

Сообщить("Символ №" + НомерСимвола + ": " + Символ);

КонецЦикла;

Такой код выведет каждый символ с его позицией. Обратите внимание: пробелы, знаки препинания и непечатаемые символы тоже считаются символами и попадут в перебор. Если строка пустая, СтрДлина() вернёт 0, и тело цикла просто не выполнится — отдельная проверка не нужна, но для читаемости её иногда добавляют.

Если нужно идти по строке в обратном порядке, используйте цикл Пока с уменьшением счётчика или измените границы цикла Для — в 1С цикл Для с шагом -1 записывается через конструкцию с убывающим счётчиком в Пока.

Альтернатива: цикл Для Каждого и его ограничения

Конструкция Для Каждого ... Из ... Цикл работает с коллекциями: массивами, таблицами значений, списками. Строка в 1С не является коллекцией символов, поэтому напрямую перебрать её через Для Каждого нельзя — попытка приведёт к ошибке исполнения.

Обходной путь — преобразовать строку в массив символов. Встроенной функции для этого нет, поэтому массив заполняют тем же циклом Для, либо используют СтрРазделить(), если в строке есть разделитель. Для строки без разделителей СтрРазделить не подходит: она вернёт массив из одного элемента — всей строки целиком.

На практике прямой цикл Для с Сред() остаётся самым читаемым и надёжным вариантом. Для Каждого имеет смысл только тогда, когда массив символов нужен для дальнейшей многократной обработки.

Сравнение вариантов

Цикл Для + Сред()

Универсальный способ, работает с любой строкой. Подходит почти всегда.

СтрРазделить + Для Каждого

Подходит, только если символы разделены разделителем (запятая, точка с запятой). Без разделителя не работает.

Заполнение массива вручную

Оправдано, если символы нужны многократно. Требует дополнительной памяти и всё равно использует цикл Для.

Проверка символов: цифры, буквы, служебные знаки

Типичная задача при переборе — определить, к какой категории относится символ. В 1С нет функций вида «ЭтоЦифра», поэтому категорию проверяют через эталонную строку и функцию СтрНайти(): если символ найден в строке-образце, он принадлежит нужной категории.

Функция ТолькоЦифры(Строка)

Цифры = "0123456789";

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

Символ = Сред(Строка, НомерСимвола, 1);

Если СтрНайти(Цифры, Символ) = 0 Тогда

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

КонецЕсли;

КонецЦикла;

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

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

Аналогично проверяют русские и латинские буквы, допустимые символы в логине или запрещённые знаки в имени файла. Учтите, что СтрНайти() по умолчанию регистрозависима: символ «а» и «А» — разные. Если регистр не важен, приведите обе строки к одному регистру через НРег() или ВРег() перед сравнением.

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

1c
Символ = Сред(Строка, НомерСимвола, 1); Если СтрНайти("0123456789", Символ) > 0 Тогда Сообщить("Это цифра"); КонецЕсли;

Практический пример: очистка строки от лишних символов

Частая прикладная задача — оставить в строке только нужные символы, например убрать из телефонного номера скобки, пробелы и дефисы. Решение — собрать новую строку, добавляя в неё только допустимые символы.

Функция ОставитьТолькоЦифры(Строка)

Результат = "";

Цифры = "0123456789";

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

Символ = Сред(Строка, НомерСимвола, 1);

Если СтрНайти(Цифры, Символ) > 0 Тогда

Результат = Результат + Символ;

КонецЕсли;

КонецЦикла;

Возврат Результат;

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

Для коротких строк такая конкатенация работает быстро. Если обрабатываются строки в десятки тысяч символов внутри массовой обработки, стоит учитывать, что строки в 1С неизменяемы: каждое присваивание Результат = Результат + Символ создаёт новую строку. На очень больших объёмах это влияет на производительность, и лучше копить фрагменты в массиве, а потом объединить через СтрСоединить().

Альтернатива без цикла — последовательные вызовы СтрЗаменить() для каждого удаляемого символа. Это проще, если список удаляемых знаков короткий и заранее известен: СтрЗаменить(СтрЗаменить(Номер, "(", ""), ")", ""). Но при большом количестве вариантов перебор с белым списком допустимых символов надёжнее.

Порядок действий для очистки строки
  1. 1
    Определите строку допустимых символов (белый список)
  2. 2
    Создайте пустую строку-результат
  3. 3
    Пройдите циклом Для от 1 до СтрДлина(Строка)
  4. 4
    Извлеките символ через Сред(Строка, НомерСимвола, 1)
  5. 5
    Если СтрНайти(БелыйСписок, Символ) > 0 — добавьте символ к результату
  6. 6
    Проверьте результат на тестовых строках: пустая, только недопустимые символы, смешанная

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

Первая и самая частая ошибка — начало цикла с 0. В 1С позиции символов начинаются с 1, поэтому Сред(Строка, 0, 1) не даст первый символ. Правильный диапазон: от 1 до СтрДлина(Строка) включительно.

Вторая ошибка — выход за границы строки. Если верхняя граница цикла вычислена неверно (например, длина строки изменялась внутри цикла), Сред() с позицией больше длины вернёт пустую строку. Ошибки исполнения не будет, но логика молча сломается. Если вы изменяете строку внутри цикла, пересчитывайте длину или перебирайте копию исходной строки.

Третья группа ошибок связана с регистром и невидимыми символами. Символы неразрывного пробела, табуляции и переноса строки визуально не отличимы от обычного пробела или пустоты, но при переборе ведут себя как отдельные знаки. Для диагностики полезно выводить код символа через КодСимвола(Символ) — это покажет, что именно находится в строке.

Типичные ошибки
01
Начало цикла с 0 — первый символ пропускается, а Сред(Строка, 0, 1) не даёт ожидаемого результата
02
Изменение строки внутри цикла без пересчёта длины — перебор выходит за границы или пропускает символы
03
Сравнение без учёта регистра — символы «а» и «А» не совпадают при проверке через СтрНайти
04
Игнорирование непечатаемых символов — неразрывный пробел и табуляция ломают сравнение строк

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

Простейший способ отладки — вывод каждого символа с его позицией и кодом через Сообщить() в толстом клиенте или в консоль кода. Для серверного кода удобнее собирать диагностику в строку и смотреть её в отладчике.

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

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

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

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

Пустая входная строка
Норма

Функция возвращает пустую строку без ошибки

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

Ошибка исполнения или непустой результат

Строка только из недопустимых символов
Норма

Результат пустой или равен ожидаемому шаблону

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

В результат попали лишние символы

Первый и последний символы
Норма

Оба обработаны, ничего не пропущено

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

Первый символ пропущен — признак цикла с 0

Частые вопросы

Как узнать код символа в 1С?

Используйте функцию КодСимвола(Символ) — она вернёт числовой код Unicode. Обратная функция Символ(Код) создаёт символ по коду. Это удобно для работы со спецсимволами вроде неразрывного пробела (код 160) или табуляции (код 9).

Можно ли перебрать строку через Для Каждого?

Нет, строка не является коллекцией в понимании 1С. Сначала преобразуйте её в массив символов обычным циклом Для, либо используйте СтрРазделить(), если в строке есть разделитель.

Как перебрать строку в обратном порядке?

Используйте цикл Пока: начните с НомерСимвола = СтрДлина(Строка) и уменьшайте счётчик на 1 в каждой итерации, пока он больше или равен 1. Символ извлекайте той же функцией Сред().

Что быстрее: перебор символов или СтрЗаменить?

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

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

Сформируйте эталонную строку со всеми буквами русского алфавита в обоих регистрах, включая «ё» и «Ё», и проверяйте каждый символ через СтрНайти(). Альтернатива — привести символ к одному регистру и сравнить с одним набором букв.

Почему Сред() иногда возвращает пустую строку без ошибки?

Если начальная позиция больше длины строки, Сред() возвращает пустую строку, не вызывая исключения. Это не ошибка платформы, а штатное поведение — проверяйте границы цикла, если результат неожиданно пуст.

Итог

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

Перебор символов строки в 1С делается циклом Для от 1 до СтрДлина(Строка) с извлечением символа через Сред(Строка, НомерСимвола, 1). Нумерация начинается с 1, пустая строка просто не запускает цикл, а для проверки категорий символов удобны эталонные строки и СтрНайти(). Проверяйте граничные случаи и не изменяйте строку внутри цикла без пересчёта длины.