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

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

Как обратиться к строке по индексу в 1С

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

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

Вторая важная особенность — нумерация символов начинается с единицы, а не с нуля. Первый символ строки имеет позицию 1, второй — позицию 2 и так далее. Это частый источник ошибок у разработчиков, пришедших из C-подобных языков, где отсчёт идёт с нуля.

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

Как получить символ по позиции через функцию Сред

Функция Сред принимает три параметра: исходную строку, начальную позицию и количество символов. Чтобы получить ровно один символ по индексу, третий параметр устанавливают равным 1.

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

Символ = Сред(Строка, 2, 1); // "р" — второй символ

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

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

bsl
Строка = "Артикул-001";
Первый = Лев(Строка, 1);            // "А"
Последний = Прав(Строка, 1);        // "1"
Третий = Сред(Строка, 3, 1);        // "т"

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

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

Строка = "12345";

ТолькоЦифры = Истина;

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

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

Если Найти("0123456789", Символ) = 0 Тогда

ТолькоЦифры = Ложь;

Прервать;

КонецЕсли;

КонецЦикла;

Обратите внимание на приём с функцией Найти: вместо длинной цепочки сравнений проверяется вхождение символа в строку-алфавит. Это стандартная практика для валидации ввода, разбора кодов и масок.

Порядок действий при переборе строки
  1. 1
    Получите длину строки через СтрДлина
  2. 2
    Организуйте цикл Для от 1 до длины строки
  3. 3
    Извлеките символ через Сред(Строка, Позиция, 1)
  4. 4
    Выполните проверку или обработку символа
  5. 5
    При найденном результате используйте Прервать, чтобы не гонять цикл дальше

Как заменить символ в заданной позиции

Из-за неизменяемости строк прямое присваивание невозможно. Замена символа выполняется склейкой: левая часть до позиции, новый символ, правая часть после позиции.

Строка = "АБВГД";

Позиция = 3;

НовыйСимвол = "Х";

Строка = Лев(Строка, Позиция - 1) + НовыйСимвол + Сред(Строка, Позиция + 1);

// Результат: "АБХГД"

Здесь важны два момента. Первый: Сред с двумя параметрами возвращает всё от указанной позиции до конца строки, поэтому третий параметр можно опустить. Второй: если позиция равна 1, Лев(Строка, 0) корректно вернёт пустую строку, и выражение всё равно сработает.

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

Альтернативные способы разбора строки

Не всегда задача требует обращения по индексу. Часто строку удобнее разбить по разделителю через СтрРазделить — она возвращает массив подстрок, к которым уже можно обращаться по индексу квадратными скобками, но с нумерацией с нуля, как у любого массива.

Части = СтрРазделить("Иванов;Иван;Иванович", ";");

Фамилия = Части[0]; // массив — индексация с 0!

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

Сравнение подходов

Сред(Строка, Позиция, 1)

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

Лев / Прав

Первый или последний символ. Читаемее, но только для краёв строки

СтрРазделить

Разбор по разделителю. Подходит для CSV-подобных данных, не для посимвольной обработки

Найти + Сред

Поиск подстроки и извлечение фрагмента. Оптимально для парсинга форматированных строк

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

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

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

Типичные ошибки
01
Обращение к позиции 0 — нумерация в 1С начинается с 1
02
Отсутствие проверки длины перед Сред — тихий возврат пустой строки вместо ошибки
03
Попытка присвоить значение символу напрямую — строки в 1С неизменяемы
04
Путаница индексации: у строк позиции с 1, у массивов индексы с 0
05
Посимвольная склейка длинных строк в цикле — падение производительности

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

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

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

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

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

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

Позиция символа
Норма

Позиция от 1 до СтрДлина(Строка)

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

Позиция 0 или больше длины строки

Результат Сред
Норма

Возвращён ожидаемый символ

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

Пустая строка — индекс вне границ

Тип переменной
Норма

ТипЗнч вернул Строка

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

Неопределено или другой тип — будет исключение

FAQ

Можно ли обратиться к строке через квадратные скобки, как в других языках?

Нет. Синтаксис Строка[0] вызовет ошибку, поскольку строка в 1С не является коллекцией. Квадратные скобки работают только с массивами, структурами и другими коллекциями. Для строк используйте Сред, Лев и Прав.

С какого числа начинается нумерация символов в строке 1С?

С единицы. Первый символ имеет позицию 1. Это отличается от массивов, где индексация идёт с нуля, — не смешивайте эти два подхода в одном алгоритме.

Что вернёт Сред, если позиция больше длины строки?

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

Как получить код символа или символ по коду?

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

Как эффективно изменить много символов в длинной строке?

Преобразуйте строку в массив символов (циклом с Сред), измените нужные элементы массива и соберите результат через СтрСоединить. Это быстрее многократной склейки подстрок.

Итог

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

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