Разработка и Конфигурация · 11 мин
Как получить подстроку в 1С: функции и примеры
Как получить подстроку в 1С: функции Лев, Прав, Сред, СтрНайти и СтрШаблон. Примеры кода, обработка ошибок, разбор строк по разделителю и типичные ошибки.
Получение подстроки — одна из самых частых задач при работе со строками во встроенном языке 1С. Она возникает при разборе артикулов, извлечении номера из наименования документа, обработке ФИО, парсинге выгрузок из других систем и формировании представлений данных. Платформа предоставляет для этого набор встроенных функций: Лев, Прав, Сред, СтрНайти, СтрДлина и СтрШаблон.
Ключевой момент, который нужно понять сразу: нумерация символов в строках 1С начинается с единицы, а не с нуля, как во многих других языках программирования. Ошибка «на единицу» (off-by-one) — самая распространённая причина неправильного результата при вырезании подстрок. Второй важный момент — функции не проверяют корректность входных данных за вас: если строка короче ожидаемой или разделитель не найден, результат может оказаться пустым или неожиданным.
Ниже разобраны все основные способы получения подстроки: от простого отрезания фиксированного количества символов до поиска фрагмента между двумя разделителями. Каждый способ сопровождается примером кода, условиями применения и типичными ошибками.
Функция Лев: подстрока с начала строки
Функция Лев(Строка, ЧислоСимволов) возвращает указанное количество символов с начала строки. Это самый простой способ получить подстроку, когда нужный фрагмент всегда находится в начале: префикс артикула, код подразделения, первые буквы наименования.
Артикул = "ЭЛТ-10452-РФ";
Префикс = Лев(Артикул, 3); // "ЭЛТ"
Наименование = "Конфигурация";
Сокращение = Лев(Наименование, 4); // "Конф"Если запрошенное количество символов больше длины строки, функция просто вернёт всю строку целиком — исключения не возникнет. Это удобно, но может маскировать ошибку: если вы ожидали строку фиксированной длины, а пришла короче, проверку нужно делать самостоятельно через СтрДлина.
Типичный сценарий — формирование инициалов или краткого представления. Например, Лев(Фамилия, 1) + "." даст первую букву фамилии с точкой. Учтите, что пробелы в начале строки тоже считаются символами, поэтому перед вырезанием имеет смысл применить СокрЛ или СокрЛП.
Функция Прав: подстрока с конца строки
Функция Прав(Строка, ЧислоСимволов) зеркальна функции Лев — она возвращает символы с конца строки. Применяется для извлечения суффиксов: расширения файла, последних цифр номера, кода региона в конце строки.
ИмяФайла = "Отчет_продажи.xlsx";
Расширение = Прав(ИмяФайла, 4); // "xlsx"
НомерДокумента = "0000-001234";
КороткийНомер = Прав(НомерДокумента, 6); // "001234"Как и Лев, функция Прав при запросе большего количества символов, чем есть в строке, вернёт строку целиком. Перед извлечением расширения файла убедитесь, что точка в имени вообще есть — иначе вы отрежете часть самого имени. Надёжнее сначала найти позицию последней точки через СтрНайти с направлением поиска «СКонца».
Функция Сред: подстрока из произвольной позиции
Функция Сред(Строка, НачальнаяПозиция, ЧислоСимволов) — самый гибкий инструмент: она вырезает фрагмент из любого места строки. Первый параметр — исходная строка, второй — позиция первого символа подстроки (нумерация с единицы), третий — сколько символов взять.
Артикул = "ЭЛТ-10452-РФ";
КодТовара = Сред(Артикул, 5, 5); // "10452"
// Третий параметр можно опустить - тогда берётся всё до конца строки
Хвост = Сред(Артикул, 5); // "10452-РФ"Если третий параметр опущен, возвращаются все символы от начальной позиции до конца строки — это удобно, когда нужно отбросить известный префикс. Например, Сред(Строка, 4) отбросит первые три символа.
Обратите внимание на поведение при выходе за границы: если начальная позиция больше длины строки, функция вернёт пустую строку, а не ошибку. Если начальная позиция меньше 1, поведение зависит от версии платформы и режима совместимости, поэтому полагаться на это не стоит — всегда проверяйте позицию перед вызовом.
СтрНайти: поиск позиции подстроки
Когда позиция нужного фрагмента заранее неизвестна, её сначала находят функцией СтрНайти(Строка, ПодстрокаПоиска). Функция возвращает номер позиции первого символа найденного фрагмента или 0, если ничего не найдено. Ноль — это сигнал, который обязательно нужно обработать.
Строка = "Заказ покупателя № 1547 от 12.05";
Позиция = СтрНайти(Строка, "№");
Если Позиция > 0 Тогда
Номер = СокрЛП(Сред(Строка, Позиция + 2, 4)); // "1547"
Иначе
Номер = "";
КонецЕсли;У функции есть необязательные параметры: направление поиска (с начала или с конца строки), позиция, с которой начинать поиск, и номер вхождения. Поиск с конца полезен для извлечения расширения файла, когда в имени может быть несколько точек:
ИмяФайла = "архив.отчет.2026.csv";
ПозицияТочки = СтрНайти(ИмяФайла, ".", НаправлениеПоиска.СКонца);
Если ПозицияТочки > 0 Тогда
Расширение = Сред(ИмяФайла, ПозицияТочки + 1); // "csv"
КонецЕсли;Поиск регистрозависим: СтрНайти("Артикул", "арт") вернёт 0. Если регистр не должен иметь значения, приведите обе строки к одному регистру через НРег или ВРег перед поиском — но помните, что найденная позиция останется корректной для исходной строки, так как длина при смене регистра не меняется.
Разбор строки по разделителю
Частая задача — разбить строку вида «Фамилия;Имя;Отчество» или «Код/Наименование/Цена» на части. Современный способ — функция СтрРазделить(Строка, Разделитель), которая возвращает массив подстрок. Это предпочтительнее ручного цикла с СтрНайти, так как код короче и меньше подвержен ошибкам.
СтрокаДанных = "Иванов;Иван;Иванович";
Части = СтрРазделить(СтрокаДанных, ";");
Фамилия = Части[0]; // "Иванов"
Имя = Части[1]; // "Иван"Функция СтрРазделить доступна в платформе начиная с версии 8.3.6. Если конфигурация работает в режиме совместимости с более ранними версиями, придётся использовать классический цикл: искать позицию разделителя через СтрНайти, вырезать фрагмент через Лев, отбрасывать обработанную часть через Сред и повторять до тех пор, пока разделители не закончатся.
Обратная задача — сборка строки из частей — решается функцией СтрСоединить(Массив, Разделитель). Эта пара функций покрывает большинство сценариев обмена данными в текстовых форматах.
Как выбрать действие
СтрШаблон и составные сценарии
Функция СтрШаблон не вырезает подстроку, а собирает новую строку по шаблону, но в задачах обработки подстрок она незаменима: после извлечения фрагментов их почти всегда нужно объединить в читаемое представление.
ФИО = "Петрова Анна Сергеевна";
Части = СтрРазделить(ФИО, " ");
Кратко = СтрШаблон("%1 %2.%3.",
Части[0],
Лев(Части[1], 1),
Лев(Части[2], 1));
// Результат: "Петрова А.С."Для сложных шаблонов поиска — например, «подстрока между квадратными скобками» или «все цифры из строки» — встроенных средств регулярных выражений в чистом виде в языке 1С нет. Задачу решают комбинацией СтрНайти для открывающего и закрывающего разделителя либо посимвольным перебором с проверкой через СтрНайти("0123456789", Символ).
// Подстрока между двумя разделителями
Строка = "Товар [АРТ-551] в наличии";
Начало = СтрНайти(Строка, "[");
Конец = СтрНайти(Строка, "]");
Если Начало > 0 И Конец > Начало Тогда
Код = Сред(Строка, Начало + 1, Конец - Начало - 1); // "АРТ-551"
КонецЕсли;Проверка результата и типичные ошибки
Главный принцип безопасной работы с подстроками: никогда не доверяйте формату входной строки. Данные приходят из файлов, от пользователей и из обменов, и любое предположение о фиксированной длине или наличии разделителя рано или поздно нарушится. Проверяйте СтрДлина перед вырезанием фиксированных фрагментов и результат СтрНайти перед использованием позиции.
Как проверить результат
СтрДлина не меньше требуемой позиции и длины фрагмента
Строка короче ожидаемой — подстрока будет усечена или пустой
Возвращено значение больше 0
Возвращён 0 — разделитель отсутствует, вырезать нельзя
Не пустая, без лишних пробелов и символов разделителя по краям
Пустая строка или захвачен разделитель — ошибка в расчёте позиции или длины
Что важно запомнить
Лев, Прав и Сред вырезают подстроку по известным позициям, СтрНайти находит позицию по содержимому, СтрРазделить разбивает строку по разделителю. Нумерация символов — с единицы. Всегда проверяйте длину строки и результат поиска перед вырезанием.
Частые вопросы
Чем отличается Сред от Лев и Прав?
Лев и Прав работают только с краями строки — началом и концом. Сред позволяет указать произвольную начальную позицию, поэтому покрывает оба случая: Лев(С, N) эквивалентно Сред(С, 1, N). На практике Лев и Прав используют ради читаемости кода, когда фрагмент действительно находится с краю.
Что вернёт СтрНайти, если подстрока не найдена?
Функция вернёт число 0. Это значение нельзя напрямую передавать в Сред как позицию — сначала выполните проверку вида «Если Позиция > 0 Тогда». Пропуск этой проверки — самая частая причина ошибок при разборе строк.
Как получить последнее слово в строке?
Найдите позицию последнего пробела через СтрНайти с параметром НаправлениеПоиска.СКонца, затем возьмите Сред от следующей позиции до конца строки. Если строка гарантированно состоит из слов через одиночный пробел, можно также использовать СтрРазделить и взять последний элемент массива.
Есть ли в 1С регулярные выражения для поиска подстрок?
Во встроенном языке нет полноценной поддержки регулярных выражений. Сложные шаблоны реализуют комбинацией СтрНайти, посимвольным перебором строки или выносят обработку во внешние компоненты. Для большинства прикладных задач связки СтрНайти и Сред достаточно.
Как убрать из строки определённый фрагмент?
Используйте функцию СтрЗаменить(Строка, Фрагмент, "") — она заменит все вхождения фрагмента на пустую строку. Если нужно удалить только одно вхождение в известной позиции, склейте Лев и Сред, пропустив удаляемый участок.
Почему Сред вернула пустую строку?
Наиболее вероятные причины: начальная позиция больше длины строки, позиция получена из СтрНайти, который вернул 0, или исходная строка пуста. Проверьте СтрДлина исходной строки и значение позиции непосредственно перед вызовом — это локализует причину.