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

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

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

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

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

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

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

Базовый способ: функция Лев()

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

Строка = "Артикул-001";

ПервыйСимвол = Лев(Строка, 1); // "А"

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

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

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

Альтернатива: функция Сред()

Функция Сред(Строка, НачальнаяПозиция, ЧислоСимволов) извлекает подстроку с произвольной позиции. Для первого символа вызов выглядит так:

ПервыйСимвол = Сред(Строка, 1, 1); // аналог Лев(Строка, 1)

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

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

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

// обработка символа

КонецЦикла;

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

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

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

Проверка на цифру

Простой способ — сравнение с диапазоном символов, так как строковые сравнения в 1С работают по кодам символов:

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

Если Символ >= "0" И Символ <= "9" Тогда

// первый символ — цифра

КонецЕсли;

Проверка на букву

Для букв надёжнее перечислить алфавиты явно и использовать СтрНайти():

Буквы = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ";

Символ = ВРег(Лев(Строка, 1));

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

// первый символ — буква

КонецЕсли;

Приведение к верхнему регистру через ВРег() избавляет от необходимости перечислять строчные буквы отдельно.

Порядок действий
  1. 1
    Получите строку и очистите её: СокрЛП(Строка)
  2. 2
    Проверьте, что строка не пустая: НЕ ПустаяСтрока(Строка)
  3. 3
    Извлеките первый символ: Лев(Строка, 1)
  4. 4
    Сравните символ с ожидаемым значением или диапазоном
  5. 5
    Обработайте ветку, когда строка пустая или символ не совпал

Обработка пустых и «опасных» строк

Главный источник ошибок при работе с первым символом — пустая строка или строка из одних пробелов. Функция ПустаяСтрока() считает пустой и строку из пробелов, поэтому её достаточно для базовой защиты:

Если ПустаяСтрока(Строка) Тогда

// первого символа нет — отдельная ветка логики

Иначе

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

КонецЕсли;

Отдельная ситуация — значение Неопределено или NULL вместо строки, что типично при работе с результатами запросов и реквизитами составного типа. Перед вызовом строковых функций убедитесь в типе значения:

Если ТипЗнч(Значение) = Тип("Строка") И НЕ ПустаяСтрока(Значение) Тогда

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

КонецЕсли;

Поиск позиции первого вхождения символа

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

Позиция = СтрНайти("Артикул-001", "-"); // 8

Если Позиция > 0 Тогда

КодДоДефиса = Лев("Артикул-001", Позиция - 1); // "Артикул"

КонецЕсли;

Если искомый символ не найден, функция возвращает 0. Это удобно для проверки наличия разделителя перед разбором строки. Поиск по умолчанию идёт с начала строки; третьим параметром можно указать позицию, с которой начинать поиск.

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

Практический пример: разбор кода по первому символу

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

Функция ТипКода(Код)

ОчищенныйКод = СокрЛП(Код);

Если ПустаяСтрока(ОчищенныйКод) Тогда

Возврат "Пустой";

КонецЕсли;

Символ = Лев(ОчищенныйКод, 1);

Если Символ >= "0" И Символ <= "9" Тогда

Возврат "Числовой";

ИначеЕсли Символ = "У" Тогда

Возврат "Услуга";

ИначеЕсли Символ = "Т" Тогда

Возврат "Товар";

Иначе

Возврат "Прочее";

КонецЕсли;

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

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

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

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

Самый короткий и читаемый способ взять первый символ; не подходит для произвольной позиции

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

Тот же результат, но удобнее в циклах с вычисляемой позицией; чуть длиннее запись

СтрНайти()

Нужен, когда ищется позиция конкретного символа, а не первый символ строки

Строковые функции в запросе

ПОДСТРОКА() в языке запросов позволяет отфильтровать данные на стороне СУБД без выборки в код

Первый символ в запросах 1С

Если нужно отобрать записи по первому символу поля прямо в запросе, используйте функцию языка запросов ПОДСТРОКА():

ВЫБРАТЬ

Номенклатура.Ссылка

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

ПОДСТРОКА(Номенклатура.Код, 1, 1) = &ПервыйСимвол

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

Итог

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

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

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

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

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

Что вернёт Лев(Строка, 1), если строка пустая?

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

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

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

Чем СтрНайти() отличается от Найти()?

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

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

Приведите обе сравниваемые строки к одному регистру: ВРег(Лев(Строка, 1)) = ВРег("а"). Это надёжнее, чем перечислять оба варианта символа в условии.

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

Нет, строковые функции работают только со строками. Сначала преобразуйте число: Лев(Формат(Число, "ЧГ="), 1). Параметр ЧГ= убирает разделители групп, чтобы первым символом не оказался пробел из форматированного представления.