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