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

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

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

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

Во встроенном языке 1С нет отдельной функции «первый символ», но задача решается штатными функциями работы со строками. Чаще всего применяют Лев(Строка, 1) — она возвращает указанное количество символов с начала строки. Альтернатива — Сред(Строка, 1, 1), которая извлекает подстроку с заданной позиции. Обе функции доступны и на клиенте, и на сервере, в тонком и толстом клиенте, в обычных и управляемых формах.

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

Ниже разобраны оба способа, безопасные варианты с проверками, сравнение по читаемости и типичные ошибки, которые встречаются при разборе кодов, артикулов и наименований.

Способ 1: функция Лев()

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

Наименование = "Артикул-104";

ПервыйСимвол = Лев(Наименование, 1);

// Результат: "А"

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

Типичный сценарий — определить тип кода по первой букве или сгруппировать контрагентов по первой букве наименования. В таких случаях полезно сразу привести символ к нужному регистру: ВРег(Лев(Наименование, 1)), чтобы «а» и «А» обрабатывались одинаково.

Способ 2: функция Сред()

Функция Сред() извлекает подстроку с указанной позиции. Нумерация символов в 1С начинается с единицы, а не с нуля — это важное отличие от многих других языков:

Код = "Б-7781";

ПервыйСимвол = Сред(Код, 1, 1);

// Результат: "Б"

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

По сути Лев(Строка, 1) и Сред(Строка, 1, 1) дают одинаковый результат. Разница только в читаемости: Лев() короче и сразу сообщает намерение «взять начало строки», а Сред() удобнее, когда позиция вычисляется динамически.

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

Лев(Строка, 1)

Короче и нагляднее для первого символа; не подходит, если позиция вычисляется

Сред(Строка, 1, 1)

Универсальнее: легко заменить позицию переменной; чуть длиннее запись

Строковые функции в запросе (ПОДСТРОКА)

Когда обработку нужно выполнить на уровне запроса, а не в коде

Безопасный вариант с проверками

В реальных данных строка может быть пустой, содержать только пробелы или вообще отсутствовать. Вызов строковой функции от значения Неопределено или Null приведёт к ошибке выполнения, поэтому тип значения стоит проверить заранее.

Порядок действий
  1. 1
    Убедитесь, что значение имеет тип Строка: ТипЗнч(Значение) = Тип("Строка")
  2. 2
    Уберите краевые пробелы функцией СокрЛП(), если они не несут смысла
  3. 3
    Проверьте, что строка не пустая: НЕ ПустаяСтрока(Строка)
  4. 4
    Получите символ: ПервыйСимвол = Лев(Строка, 1)
  5. 5
    При необходимости приведите регистр: ВРег() или НРег()

Готовый фрагмент с защитой от пустых данных:

Функция ПервыйСимволСтроки(Знач ИсходнаяСтрока)

Если ТипЗнч(ИсходнаяСтрока) <> Тип("Строка") Тогда

Возврат "";

КонецЕсли;

СтрокаБезПробелов = СокрЛП(ИсходнаяСтрока);

Если ПустаяСтрока(СтрокаБезПробелов) Тогда

Возврат "";

КонецЕсли;

Возврат Лев(СтрокаБезПробелов, 1);

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

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

Получение первого символа в запросе

Если первый символ нужен для группировки или фильтрации большого объёма данных, эффективнее сделать это в запросе, а не обходом результата в цикле. В языке запросов 1С есть функция ПОДСТРОКА:

ВЫБРАТЬ

ПОДСТРОКА(Контрагенты.Наименование, 1, 1) КАК ПерваяБуква,

КОЛИЧЕСТВО(*) КАК Количество

ИЗ

Справочник.Контрагенты КАК Контрагенты

СГРУППИРОВАТЬ ПО

ПОДСТРОКА(Контрагенты.Наименование, 1, 1)

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

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

Проверка и использование результата

Чаще всего первый символ нужен не сам по себе, а для ветвления логики: определить префикс документа, тип артикула, начальную букву для фильтра. Здесь важны две проверки — на пустоту и на соответствие ожидаемому набору символов.

ПервыйСимвол = ВРег(Лев(СокрЛП(Артикул), 1));

Если ПустаяСтрока(ПервыйСимвол) Тогда

Сообщить("Артикул не заполнен");

ИначеЕсли ПервыйСимвол = "Б" Тогда

// обработка импортного артикула

Иначе

// стандартная обработка

КонецЕсли;

Для проверки «является ли символ цифрой» удобно искать его в строке допустимых значений: СтрНайти("0123456789", ПервыйСимвол) > 0. Это надёжнее, чем сравнение кодов символов.

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

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

Длина результата
Норма

СтрДлина(Результат) = 1

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

Длина 0 — исходная строка была пустой или из пробелов

Регистр символа
Норма

Символ приведён к нужному регистру через ВРег()/НРег()

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

Сравнение "а" = "А" даёт Ложь и ломает логику

Тип исходного значения
Норма

ТипЗнч() возвращает Строка

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

Неопределено или Null — вызов функции упадёт с ошибкой

Типичные ошибки

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

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

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

FAQ

Чем отличается Лев() от Сред() при получении первого символа?

По результату — ничем: Лев(Строка, 1) и Сред(Строка, 1, 1) возвращают одинаковое значение. Лев() короче и читается как «взять начало», Сред() удобнее, если позиция символа вычисляется переменной и может меняться.

Что вернёт Лев() от пустой строки?

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

Как получить первый символ без учёта пробелов в начале?

Сначала примените СокрЛ(Строка) или СокрЛП(Строка), чтобы убрать ведущие пробелы, затем возьмите Лев(Результат, 1). Иначе первым символом окажется пробел.

Можно ли получить первый символ прямо в запросе?

Да, функцией ПОДСТРОКА(Поле, 1, 1). Это предпочтительный вариант при группировке или фильтрации больших выборок, так как обработка выполняется на стороне СУБД.

Как проверить, что первый символ — цифра?

Извлеките символ через Лев(Строка, 1) и проверьте вхождение: СтрНайти("0123456789", Символ) > 0. Если результат больше нуля — символ является цифрой.

Почему сравнение первого символа с буквой не срабатывает?

Чаще всего из-за регистра или ведущих пробелов. Сравнение строк в 1С чувствительно к регистру, поэтому приведите обе стороны к одному регистру через ВРег() и предварительно уберите пробелы функцией СокрЛП().

Итог

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

Первый символ строки в 1С получают через Лев(Строка, 1) или Сред(Строка, 1, 1); нумерация символов начинается с единицы. Перед вызовом проверяйте тип значения и непустоту строки, убирайте пробелы функцией СокрЛП() и приводите регистр при сравнениях. Для массовой обработки используйте ПОДСТРОКА() в запросе.