Разработка и Конфигурация · 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Получите строку и очистите её: СокрЛП(Строка)
- 2Проверьте, что строка не пустая: НЕ ПустаяСтрока(Строка)
- 3Извлеките первый символ: Лев(Строка, 1)
- 4Сравните символ с ожидаемым значением или диапазоном
- 5Обработайте ветку, когда строка пустая или символ не совпал
Обработка пустых и «опасных» строк
Главный источник ошибок при работе с первым символом — пустая строка или строка из одних пробелов. Функция ПустаяСтрока() считает пустой и строку из пробелов, поэтому её достаточно для базовой защиты:
Если ПустаяСтрока(Строка) Тогда
// первого символа нет — отдельная ветка логики
Иначе
ПервыйСимвол = Лев(СокрЛП(Строка), 1);
КонецЕсли;
Отдельная ситуация — значение Неопределено или NULL вместо строки, что типично при работе с результатами запросов и реквизитами составного типа. Перед вызовом строковых функций убедитесь в типе значения:
Если ТипЗнч(Значение) = Тип("Строка") И НЕ ПустаяСтрока(Значение) Тогда
ПервыйСимвол = Лев(СокрЛП(Значение), 1);
КонецЕсли;
Поиск позиции первого вхождения символа
Смежная задача — не взять первый символ строки, а найти позицию, где конкретный символ встречается впервые. Для этого служит функция СтрНайти(Строка, ПодстрокаПоиска) (в старых версиях платформы — Найти()):
Позиция = СтрНайти("Артикул-001", "-"); // 8
Если Позиция > 0 Тогда
КодДоДефиса = Лев("Артикул-001", Позиция - 1); // "Артикул"
КонецЕсли;
Если искомый символ не найден, функция возвращает 0. Это удобно для проверки наличия разделителя перед разбором строки. Поиск по умолчанию идёт с начала строки; третьим параметром можно указать позицию, с которой начинать поиск.
Практический пример: разбор кода по первому символу
Типовая задача в учётных конфигурациях — маршрутизация обработки в зависимости от первого символа кода. Ниже законченный пример функции:
Функция ТипКода(Код)
ОчищенныйКод = СокрЛП(Код);
Если ПустаяСтрока(ОчищенныйКод) Тогда
Возврат "Пустой";
КонецЕсли;
Символ = Лев(ОчищенныйКод, 1);
Если Символ >= "0" И Символ <= "9" Тогда
Возврат "Числовой";
ИначеЕсли Символ = "У" Тогда
Возврат "Услуга";
ИначеЕсли Символ = "Т" Тогда
Возврат "Товар";
Иначе
Возврат "Прочее";
КонецЕсли;
КонецФункции
Такой подход легко расширяется: новые префиксы добавляются отдельными ветками, а ветка «Иначе» страхует от непредусмотренных значений. Для большого числа префиксов удобнее хранить соответствие префиксов и типов в соответствии или таблице значений.
Сравнение вариантов
Самый короткий и читаемый способ взять первый символ; не подходит для произвольной позиции
Тот же результат, но удобнее в циклах с вычисляемой позицией; чуть длиннее запись
Нужен, когда ищется позиция конкретного символа, а не первый символ строки
ПОДСТРОКА() в языке запросов позволяет отфильтровать данные на стороне СУБД без выборки в код
Первый символ в запросах 1С
Если нужно отобрать записи по первому символу поля прямо в запросе, используйте функцию языка запросов ПОДСТРОКА():
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
ПОДСТРОКА(Номенклатура.Код, 1, 1) = &ПервыйСимвол
Учтите, что отбор по выражению с функцией не использует индекс по полю, поэтому на больших таблицах такой запрос может выполняться заметно дольше, чем отбор по равенству поля. Для регулярных выборок по префиксу лучше хранить префикс в отдельном реквизите и индексировать его.
Что важно запомнить
Первый символ строки в 1С берут функцией Лев(Строка, 1); нумерация начинается с единицы. Перед извлечением проверяйте тип значения и непустоту строки, очищайте пробелы через СокрЛП(), а для сравнений учитывайте регистр. Для поиска позиции символа используйте СтрНайти(), для отбора в запросах — ПОДСТРОКА().
Частые вопросы
Как получить последний символ строки в 1С?
Используйте функцию Прав(Строка, 1) — она возвращает указанное число символов с конца строки. Те же правила: проверяйте непустоту строки и очищайте пробелы через СокрЛП(), иначе последним символом может оказаться пробел.
Что вернёт Лев(Строка, 1), если строка пустая?
Функция вернёт пустую строку без ошибки. Поэтому сравнение результата с ожидаемым символом просто не сработает, и это нужно обрабатывать отдельной веткой через ПустаяСтрока().
Как проверить, что первый символ — русская буква?
Приведите символ к верхнему регистру через ВРег() и проверьте вхождение в строку русского алфавита с помощью СтрНайти(). Альфавит задайте константой, включая букву «Ё», которую часто забывают.
Чем СтрНайти() отличается от Найти()?
Это одна и та же функция поиска подстроки: Найти() — устаревший синоним, сохранённый для совместимости со старым кодом. В новых разработках рекомендуется использовать СтрНайти(), обе функции возвращают позицию первого вхождения или 0, если подстрока не найдена.
Как сравнить первый символ без учёта регистра?
Приведите обе сравниваемые строки к одному регистру: ВРег(Лев(Строка, 1)) = ВРег("а"). Это надёжнее, чем перечислять оба варианта символа в условии.
Можно ли получить первый символ числа, не преобразуя его в строку?
Нет, строковые функции работают только со строками. Сначала преобразуйте число: Лев(Формат(Число, "ЧГ="), 1). Параметр ЧГ= убирает разделители групп, чтобы первым символом не оказался пробел из форматированного представления.