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

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

Что такое СТР в 1С и как работать со строковыми функциями

СТР в 1С — это семейство строковых функций встроенного языка: СтрДлина, СтрНайти, СтрШаблон, СтрСоединить. Разбираем синтаксис, примеры и типичные ошибки.

Аббревиатура «СТР» в контексте 1С чаще всего относится к семейству строковых функций встроенного языка платформы — все они начинаются с префикса Стр: СтрДлина, СтрНайти, СтрШаблон, СтрСоединить и другие. Эти функции доступны в любом модуле конфигурации и предназначены для поиска, разбора, склеивания и форматирования текстовых данных.

Строковые операции встречаются практически в каждой доработке: разбор ФИО на части, формирование сообщений пользователю, поиск подстроки в наименовании, обработка данных из файлов обмена. Без понимания того, как устроены функции Стр*, сложно писать даже простые обработки.

Отдельно стоит понимать, что СТР — это не одна функция, а целая группа. Новички часто путают СтрНайти и Найти, СтрШаблон и конкатенацию через символ «+», а также забывают, что часть функций работает только на сервере или только в определённых режимах совместимости.

Что входит в семейство функций Стр

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

Вторая группа — функции формирования строк: СтрШаблон для подстановки значений в шаблон, СтрСоединить для склейки массива строк с разделителем, СтрПолучитьСтроку и СтрЧислоСтрок для работы с многострочным текстом. Третья группа — разбор строк: СтрРазделить превращает строку в массив по разделителю, что удобно при парсинге CSV-подобных данных.

Точный состав доступных функций зависит от версии платформы. Например, СтрНачинаетсяС и СтрЗаканчиваетсяНа появились в относительно поздних версиях, поэтому в старых конфигурациях их заменяли конструкциями с Лев и Прав. Перед использованием функции полезно свериться с синтакс-помощником вашей версии платформы.

Как работают базовые функции: СтрДлина, СтрНайти, СтрЗаменить

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

Функция СтрНайти(Строка, ПодстрокаПоиска) возвращает позицию вхождения или 0, если ничего не найдено. Типичное применение — проверка, содержит ли наименование определённое слово, или поиск разделителя перед разбором строки. Поиск чувствителен к регистру: «Склад» и «склад» — разные подстроки.

bsl
Наименование = "Склад готовой продукции";
Если СтрНайти(НРег(Наименование), "склад") > 0 Тогда
  Сообщить("Это складская позиция");
КонецЕсли;
Длина = СтрДлина(СокрЛП(Наименование));

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

Формирование строк: СтрШаблон и СтрСоединить

СтрШаблон позволяет подставлять значения в текст по местам %1, %2 и так далее. Это заметно читаемее, чем склейка через символ «+» или «&», особенно когда в сообщение подставляется несколько параметров. Кроме того, шаблоны корректно работают с механизмами локализации.

bsl
ТекстСообщения = СтрШаблон("Документ №%1 от %2 проведён, сумма: %3", НомерДок, Формат(ДатаДок, "ДЛФ=D"), СуммаДок);
Сообщить(ТекстСообщения);

СтрСоединить(МассивСтрок, Разделитель) собирает массив строк в одну строку через указанный разделитель. Обратная операция — СтрРазделить(Строка, Разделитель) — возвращает массив. Эта пара незаменима при обмене данными через текстовые файлы: например, при чтении строки «Иванов;Иван;Иванович» можно разбить её на части и заполнить реквизиты физического лица.

Работа с многострочным текстом

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

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

bsl
Для НомерСтроки = 1 По СтрЧислоСтрок(Текст) Цикл
  ТекущаяСтрока = СокрЛП(СтрПолучитьСтроку(Текст, НомерСтроки));
  Если Не ПустаяСтрока(ТекущаяСтрока) Тогда
    ОбработатьЗначение(ТекущаяСтрока);
  КонецЕсли;
КонецЦикла;

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

Контекст выполнения: клиент, сервер и ограничения

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

Ещё одно ограничение — производительность в запросах. Строковые функции встроенного языка не работают внутри запросов: там используется собственный набор операций языка запросов (ПОДОБНО, ВЫРАЗИТЬ, функции ЛЕВ/ПРАВ в новых версиях). Попытка вставить СтрНайти в текст запроса приведёт к ошибке.

При доработке типовых конфигураций избегайте изменения типовых модулей ради строковой обработки — вынесите свои функции в отдельный общий модуль. Это упростит обновление конфигурации и снизит риск конфликтов при объединении.

Типичные ошибки при работе со строковыми функциями

Самая частая ошибка — забыть, что СтрНайти возвращает 0 при отсутствии подстроки, и использовать результат в условии без проверки. Вторая по популярности — регистрозависимость поиска: разработчик ищет «склад», а в данных «Склад». Решение — приводить обе строки к одному регистру через НРег или ВРег.

Типичные ошибки
01
Использование результата СтрЗаменить без присваивания — исходная строка не меняется, замена теряется
02
Поиск без приведения регистра — подстрока не находится из-за разницы регистра символов
03
Обращение к СтрПолучитьСтроку с номером больше СтрЧислоСтрок — ошибка выполнения
04
Склейка длинных строк в цикле через «+» вместо СтрСоединить — лишний расход памяти и времени
05
Попытка использовать функции встроенного языка в тексте запроса — синтаксическая ошибка

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

Как проверить результат и отладить строковый код

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

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

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

Результат СтрНайти
Норма

Позиция больше 0 и соответствует ожидаемому месту подстроки

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

Возвращается 0 при визуально присутствующей подстроке — проверьте регистр и скрытые символы

Массив после СтрРазделить
Норма

Количество элементов совпадает с ожидаемым, нет пустых элементов

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

Лишние пустые элементы из-за двойных разделителей или пробелов

Итоговая строка после СтрШаблон
Норма

Все параметры %1, %2 подставлены, нет остаточных плейсхолдеров

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

В тексте остались %N — значит, передано меньше параметров, чем нужно

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

FAQ: частые вопросы о функциях Стр в 1С

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

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

Почему СтрНайти не находит подстроку, которая явно есть в тексте?

Чаще всего причина в регистре символов или в скрытых символах: неразрывных пробелах, табуляции, символах переноса. Приведите обе строки к одному регистру через НРег и проверьте строку на служебные символы через СтрЗаменить или отладчик.

Можно ли использовать СтрШаблон в запросах?

Нет. В языке запросов работают только его собственные операторы и функции. Сформируйте нужную строку средствами встроенного языка до выполнения запроса и передайте её как параметр.

Как разбить ФИО на фамилию, имя и отчество?

Используйте СтрРазделить(ФИО, " ") — получите массив частей. Учтите, что двойные фамилии или лишние пробелы могут нарушить разбор, поэтому проверяйте количество элементов массива и очищайте входные данные от повторных пробелов заранее.

Работают ли строковые функции в веб-клиенте?

Базовые функции (СтрДлина, СтрНайти, СтрЗаменить, СтрШаблон) работают во всех клиентах. Ограничения касаются в основном файловых операций и части функций, зависящих от версии платформы и режима совместимости.

Что быстрее: склейка строк в цикле или СтрСоединить?

Для большого числа фрагментов СтрСоединить эффективнее: склейка через оператор «+» в цикле каждый раз создаёт новую строку в памяти. Соберите части в массив и соедините один раз — это и быстрее, и читаемее.

Итог

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

СТР в 1С — это семейство строковых функций встроенного языка. Ключевые из них: СтрДлина, СтрНайти, СтрЗаменить, СтрШаблон, СтрСоединить и СтрРазделить. Помните о нумерации с единицы, чувствительности к регистру, возврате 0 при отсутствии подстроки и о том, что эти функции не работают внутри запросов.