Разработка и Конфигурация · 9 мин
1С: как получить символ из строки
Как в 1С получить символ из строки по позиции: функции Сред, Лев, Прав, КодСимвола и Символ. Примеры кода, перебор строки в цикле и типичные ошибки.
Задача извлечь отдельный символ из строки встречается в 1С постоянно: при разборе артикулов, проверке первого символа наименования, валидации ИНН, обработке файлов обмена. Встроенный язык платформы предоставляет для этого несколько функций, и выбор зависит от того, что именно нужно — сам символ, его код или сразу несколько символов подряд.
Основной инструмент — функция Сред(). В отличие от многих языков программирования, где строка индексируется с нуля, в 1С нумерация символов начинается с единицы. Это первое, что нужно запомнить, чтобы не получать смещённые результаты и не ловить ошибки на границах строки.
Ниже разобраны основные способы получения символа, перебор строки в цикле, работа с кодами символов и типичные ошибки, которые приводят к неверному результату или падению кода.
Получение символа по позиции через Сред()
Функция Сред(Строка, НачальнаяПозиция, Длина) возвращает подстроку заданной длины, начиная с указанной позиции. Чтобы получить ровно один символ, третий параметр устанавливается равным 1:
Строка = "Привет";
ПервыйСимвол = Сред(Строка, 1, 1); // "П"
ТретийСимвол = Сред(Строка, 3, 1); // "и"
Первый параметр — исходная строка, второй — позиция нужного символа (отсчёт с 1), третий — количество извлекаемых символов. Если длину не указывать, функция вернёт всё от заданной позиции до конца строки, что для получения одного символа не подходит.
Перед обращением к конкретной позиции полезно проверить длину строки функцией СтрДлина(). Если позиция превышает длину строки, Сред() вернёт пустую строку без ошибки — и это может незаметно исказить логику, например при сравнении символа с эталоном.
Получение первого и последнего символа
Для крайних позиций удобнее специализированные функции. Первый символ проще всего получить через Лев(), последний — через Прав():
Строка = "Артикул-001";
Первый = Лев(Строка, 1); // "А"
Последний = Прав(Строка, 1); // "1"
Обе функции принимают строку и количество символов с соответствующего края. Для одного символа второй параметр всегда равен 1. Такой код читается легче, чем Сред(Строка, 1, 1), особенно когда извлекается последний символ: вариант со Сред() потребовал бы предварительного вычисления длины строки.
Частый сценарий — проверка, начинается ли строка с определённого знака. Здесь достаточно сравнения: Если Лев(Код, 1) = "0" Тогда ... КонецЕсли;. Для многосимвольных префиксов аналогично используется Лев() с нужной длиной или функция СтрНачинаетсяС(), доступная в современных версиях платформы.
Перебор всех символов строки в цикле
Когда нужно обработать каждый символ — например, отфильтровать из строки только цифры или проверить допустимость всех знаков, — используется цикл с индексом от 1 до длины строки:
Строка = "А12Б3";
ТолькоЦифры = "";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Позиция, 1);
Если Символ >= "0" И Символ <= "9" Тогда
ТолькоЦифры = ТолькоЦифры + Символ;
КонецЕсли;
КонецЦикла;
// ТолькоЦифры = "123"
Обратите внимание: сравнение символов операторами >= и <= работает, потому что строки сравниваются посимвольно по кодам. Однако для надёжной проверки на цифру лучше использовать более явные способы — например, проверку вхождения через СтрНайти("0123456789", Символ), которая не зависит от тонкостей сортировки.
- 1Получите длину строки через СтрДлина() и сохраните её в переменную до цикла
- 2Организуйте цикл Для Позиция = 1 По ДлинаСтроки
- 3Извлекайте символ через Сред(Строка, Позиция, 1)
- 4Выполните нужную проверку или преобразование символа
- 5Проверьте результат на пустой строке — цикл просто не выполнится
Для длинных строк выносите вызов СтрДлина() за пределы цикла. Хотя платформа оптимизирует такие вычисления, явное сохранение длины в переменной делает код понятнее и исключает лишние вызовы на каждой итерации.
Получение кода символа и символа по коду
Иногда нужен не сам символ, а его числовой код — например, для генерации случайных букв, проверки диапазонов или работы со служебными символами. Для этого служит пара функций КодСимвола() и Символ():
Код = КодСимвола("А"); // 1040 (кириллица, Unicode)
СимволПоКоду = Символ(1040); // "А"
СимволТабуляции = Символ(9); // табуляция
Функция КодСимвола() возвращает код Unicode переданного символа. Если ей передать строку длиннее одного символа, будет возвращён код первого символа. Обратная функция Символ() строит строку из одного символа по его коду.
Практический пример — символы, которые неудобно или невозможно ввести литералом: табуляция (код 9), перевод строки (10), возврат каретки (13). Для переводов строк в 1С есть и готовая конструкция Символы.ПС, а также Символы.ВК и Символы.Таб — предпочитайте их прямым кодам, так код читается лучше.
Сравнение способов получения символа
Универсальный вариант для любой позиции. Требует контроля длины строки.
Удобно для первого и последнего символа, код короче и понятнее.
Для работы с кодами Unicode и служебными символами, а не с позициями.
Когда позиция символа неизвестна и её нужно сначала найти.
Поиск позиции символа перед извлечением
На практике позиция нужного символа часто заранее неизвестна — её сначала находят. Функция СтрНайти(Строка, ПодстрокаПоиска) возвращает позицию первого вхождения подстроки или 0, если совпадений нет:
Строка = "Иванов:Иван";
Позиция = СтрНайти(Строка, ":");
Если Позиция > 0 Тогда
СледующийСимвол = Сред(Строка, Позиция + 1, 1); // "И"
КонецЕсли;
Обязательно проверяйте результат СтрНайти() на ноль. Если разделитель не найден, а код продолжит работу с позицией 0, Сред() вернёт пустую строку — и дальнейшая логика молча развалится. Такие ошибки трудно отлавливать, потому что платформа не выдаёт исключение.
Для поиска с конца строки используется СтрНайти() с параметром направления поиска (НаправлениеПоиска.СКонца) — это полезно, например, при извлечении расширения файла после последней точки.
Типичные ошибки и особенности платформы
Первая и самая частая ошибка — предположение, что индексация начинается с нуля. Разработчики, пришедшие из других языков, пишут Сред(Строка, 0, 1) и получают пустую строку. Платформа не сообщает об ошибке, поэтому дефект всплывает только в логике сравнения.
Вторая группа ошибок связана со строковыми конкатенациями в цикле. Склеивание результата через Результат = Результат + Символ на очень длинных строках работает медленно из-за пересоздания строки. Для массовой обработки эффективнее собирать части в массив и затем объединять через СтрСоединить().
Третий нюанс — регистр. Сравнение Сред(Строка, 1, 1) = "а" не сработает для заглавной «А». Если регистр не важен, приводите обе стороны к одному регистру через НРег() или ВРег(). Для поиска без учёта регистра у СтрНайти() нет прямого параметра, поэтому строку предварительно переводят в один регистр целиком.
Как проверить результат
Совпадает с ожидаемым знаком на указанной позиции
Пустая строка — позиция вне диапазона или нумерация с нуля
Значение больше 0
Возвращён 0 — подстрока не найдена, дальнейшее извлечение бессмысленно
Цикл не выполняется, функции возвращают пустую строку без ошибки
Код обращается к позиции 1 без проверки и ломает последующую логику
FAQ
Как получить первый символ строки в 1С?
Используйте Лев(Строка, 1) или Сред(Строка, 1, 1). Оба варианта вернут первый символ; Лев() читается нагляднее. Перед вызовом убедитесь, что строка не пустая, иначе результатом будет пустая строка.
Почему Сред(Строка, 0, 1) возвращает пустую строку?
Потому что в 1С нумерация символов начинается с 1. Позиция 0 находится вне допустимого диапазона, и функция возвращает пустую строку без сообщения об ошибке. Используйте позицию 1 для первого символа.
Как проверить, является ли символ цифрой?
Надёжный способ — проверка вхождения: Если СтрНайти("0123456789", Символ) > 0 Тогда. Сравнение Символ >= "0" И Символ <= "9" тоже работает, но зависит от порядка сортировки и менее очевидно при чтении кода.
Как получить последний символ строки?
Проще всего — Прав(Строка, 1). Альтернатива через Сред() требует вычисления длины: Сред(Строка, СтрДлина(Строка), 1). Для пустой строки оба варианта вернут пустую строку.
Чем отличается КодСимвола() от Символ()?
КодСимвола() преобразует символ в его числовой код Unicode, а Символ() выполняет обратное преобразование — строит символ по коду. Первая функция нужна для анализа, вторая — для генерации символов, например служебных.
Что вернёт Сред(), если позиция больше длины строки?
Пустую строку, без исключения и предупреждения. Поэтому при работе с данными из внешних источников всегда проверяйте длину через СтрДлина() до обращения к конкретной позиции.
Что важно запомнить
Символ из строки в 1С получают через Сред(Строка, Позиция, 1), нумерация идёт с 1. Для крайних позиций удобнее Лев() и Прав(), для поиска позиции — СтрНайти() с обязательной проверкой на 0, для кодов — КодСимвола() и Символ(). Всегда проверяйте длину строки перед обращением к фиксированной позиции.