Разработка и Конфигурация · 10 мин
Что такое СТР в 1С и как работать со строковыми функциями
СТР в 1С — это семейство строковых функций встроенного языка: СтрДлина, СтрНайти, СтрШаблон, СтрСоединить. Разбираем синтаксис, примеры и типичные ошибки.
Аббревиатура «СТР» в контексте 1С чаще всего относится к семейству строковых функций встроенного языка платформы — все они начинаются с префикса Стр: СтрДлина, СтрНайти, СтрШаблон, СтрСоединить и другие. Эти функции доступны в любом модуле конфигурации и предназначены для поиска, разбора, склеивания и форматирования текстовых данных.
Строковые операции встречаются практически в каждой доработке: разбор ФИО на части, формирование сообщений пользователю, поиск подстроки в наименовании, обработка данных из файлов обмена. Без понимания того, как устроены функции Стр*, сложно писать даже простые обработки.
Отдельно стоит понимать, что СТР — это не одна функция, а целая группа. Новички часто путают СтрНайти и Найти, СтрШаблон и конкатенацию через символ «+», а также забывают, что часть функций работает только на сервере или только в определённых режимах совместимости.
Что входит в семейство функций Стр
Все строковые функции платформы можно условно разделить на три группы. Первая — классические функции, работающие с позициями символов: СтрДлина, Лев, Прав, Сред, СтрНайти, СтрЗаменить. Они оперируют номерами символов, причём нумерация в 1С начинается с единицы, а не с нуля, как во многих других языках.
Вторая группа — функции формирования строк: СтрШаблон для подстановки значений в шаблон, СтрСоединить для склейки массива строк с разделителем, СтрПолучитьСтроку и СтрЧислоСтрок для работы с многострочным текстом. Третья группа — разбор строк: СтрРазделить превращает строку в массив по разделителю, что удобно при парсинге CSV-подобных данных.
Точный состав доступных функций зависит от версии платформы. Например, СтрНачинаетсяС и СтрЗаканчиваетсяНа появились в относительно поздних версиях, поэтому в старых конфигурациях их заменяли конструкциями с Лев и Прав. Перед использованием функции полезно свериться с синтакс-помощником вашей версии платформы.
Как работают базовые функции: СтрДлина, СтрНайти, СтрЗаменить
Функция СтрДлина(Строка) возвращает количество символов в строке. Поэтому перед сравнением длин строк часто применяют СокрЛП, чтобы убрать краевые пробелы.
Функция СтрНайти(Строка, ПодстрокаПоиска) возвращает позицию вхождения или 0, если ничего не найдено. Типичное применение — проверка, содержит ли наименование определённое слово, или поиск разделителя перед разбором строки. Поиск чувствителен к регистру: «Склад» и «склад» — разные подстроки.
Наименование = "Склад готовой продукции";
Если СтрНайти(НРег(Наименование), "склад") > 0 Тогда
Сообщить("Это складская позиция");
КонецЕсли;
Длина = СтрДлина(СокрЛП(Наименование));Функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены) заменяет все вхождения подстроки. Её удобно использовать для очистки данных, например для удаления лишних символов из телефонного номера перед записью в справочник. Учтите, что функция возвращает новую строку — исходная переменная не изменяется, результат нужно присваивать.
Формирование строк: СтрШаблон и СтрСоединить
СтрШаблон позволяет подставлять значения в текст по местам %1, %2 и так далее. Это заметно читаемее, чем склейка через символ «+» или «&», особенно когда в сообщение подставляется несколько параметров. Кроме того, шаблоны корректно работают с механизмами локализации.
ТекстСообщения = СтрШаблон("Документ №%1 от %2 проведён, сумма: %3", НомерДок, Формат(ДатаДок, "ДЛФ=D"), СуммаДок);
Сообщить(ТекстСообщения);СтрСоединить(МассивСтрок, Разделитель) собирает массив строк в одну строку через указанный разделитель. Обратная операция — СтрРазделить(Строка, Разделитель) — возвращает массив. Эта пара незаменима при обмене данными через текстовые файлы: например, при чтении строки «Иванов;Иван;Иванович» можно разбить её на части и заполнить реквизиты физического лица.
Работа с многострочным текстом
Многострочные строки в 1С — это текст, содержащий символы перевода строки. Для них предусмотрены функции СтрЧислоСтрок и СтрПолучитьСтроку. Первая возвращает количество строк, вторая — содержимое строки по её номеру. В цикле это позволяет построчно обрабатывать, например, текст, вставленный пользователем в многострочное поле.
Типичный сценарий — обработка списка значений, вставленного из Excel через буфер обмена. Пользователь вставляет столбец значений в текстовое поле, а обработка перебирает строки и ищет соответствующие элементы справочника. При этом важно обрезать пробелы через СокрЛП, потому что данные из Excel часто содержат лишние символы.
Для НомерСтроки = 1 По СтрЧислоСтрок(Текст) Цикл
ТекущаяСтрока = СокрЛП(СтрПолучитьСтроку(Текст, НомерСтроки));
Если Не ПустаяСтрока(ТекущаяСтрока) Тогда
ОбработатьЗначение(ТекущаяСтрока);
КонецЕсли;
КонецЦикла;Для сложного построчного разбора с фильтрацией и преобразованиями иногда удобнее использовать объект ТекстовыйДокумент или потоковые объекты чтения, особенно если данных много. Функции СтрПолучитьСтроку в цикле по очень большому тексту работают медленнее, так как каждый вызов заново анализирует строку.
Контекст выполнения: клиент, сервер и ограничения
Большинство строковых функций доступны и на тонком клиенте, и на сервере, и в веб-клиенте, поэтому их можно использовать в общих модулях с любыми флагами. Однако есть нюансы: часть функций работы с файлами и текстовыми документами на клиенте требует асинхронных вызовов, а некоторые возможности зависят от режима совместимости конфигурации.
Ещё одно ограничение — производительность в запросах. Строковые функции встроенного языка не работают внутри запросов: там используется собственный набор операций языка запросов (ПОДОБНО, ВЫРАЗИТЬ, функции ЛЕВ/ПРАВ в новых версиях). Попытка вставить СтрНайти в текст запроса приведёт к ошибке.
При доработке типовых конфигураций избегайте изменения типовых модулей ради строковой обработки — вынесите свои функции в отдельный общий модуль. Это упростит обновление конфигурации и снизит риск конфликтов при объединении.
Типичные ошибки при работе со строковыми функциями
Самая частая ошибка — забыть, что СтрНайти возвращает 0 при отсутствии подстроки, и использовать результат в условии без проверки. Вторая по популярности — регистрозависимость поиска: разработчик ищет «склад», а в данных «Склад». Решение — приводить обе строки к одному регистру через НРег или ВРег.
Отдельный класс проблем — работа с числами и датами как со строками без явного преобразования. Функция Строка() или неявное приведение могут дать неожиданный результат в зависимости от региональных настроек. Для дат и чисел надёжнее использовать Формат с явной строкой формата.
Как проверить результат и отладить строковый код
Самый быстрый способ проверить поведение функции — открыть конфигуратор, поставить точку останова и посмотреть значения в табло. Для строковых выражений удобно вычислять выражения прямо в отладчике: можно проверить СтрНайти на реальных данных до того, как условие сработает неправильно.
Как проверить результат
Позиция больше 0 и соответствует ожидаемому месту подстроки
Возвращается 0 при визуально присутствующей подстроке — проверьте регистр и скрытые символы
Количество элементов совпадает с ожидаемым, нет пустых элементов
Лишние пустые элементы из-за двойных разделителей или пробелов
Все параметры %1, %2 подставлены, нет остаточных плейсхолдеров
В тексте остались %N — значит, передано меньше параметров, чем нужно
Для массовой проверки данных полезно написать небольшую тестовую обработку или воспользоваться консолью кода, если она есть в вашей конфигурации. Запустите функцию на десятке реальных значений из базы — это быстро выявит краевые случаи: пустые строки, значения с неразрывными пробелами, данные с символами табуляции.
FAQ: частые вопросы о функциях Стр в 1С
Чем СтрНайти отличается от Найти?
Обе функции ищут подстроку и возвращают позицию, но Найти — более старый вариант с меньшим числом параметров. СтрНайти поддерживает направление поиска, номер вхождения и начальную позицию, поэтому в новом коде рекомендуется использовать именно её.
Почему СтрНайти не находит подстроку, которая явно есть в тексте?
Чаще всего причина в регистре символов или в скрытых символах: неразрывных пробелах, табуляции, символах переноса. Приведите обе строки к одному регистру через НРег и проверьте строку на служебные символы через СтрЗаменить или отладчик.
Можно ли использовать СтрШаблон в запросах?
Нет. В языке запросов работают только его собственные операторы и функции. Сформируйте нужную строку средствами встроенного языка до выполнения запроса и передайте её как параметр.
Как разбить ФИО на фамилию, имя и отчество?
Используйте СтрРазделить(ФИО, " ") — получите массив частей. Учтите, что двойные фамилии или лишние пробелы могут нарушить разбор, поэтому проверяйте количество элементов массива и очищайте входные данные от повторных пробелов заранее.
Работают ли строковые функции в веб-клиенте?
Базовые функции (СтрДлина, СтрНайти, СтрЗаменить, СтрШаблон) работают во всех клиентах. Ограничения касаются в основном файловых операций и части функций, зависящих от версии платформы и режима совместимости.
Что быстрее: склейка строк в цикле или СтрСоединить?
Для большого числа фрагментов СтрСоединить эффективнее: склейка через оператор «+» в цикле каждый раз создаёт новую строку в памяти. Соберите части в массив и соедините один раз — это и быстрее, и читаемее.
Что важно запомнить
СТР в 1С — это семейство строковых функций встроенного языка. Ключевые из них: СтрДлина, СтрНайти, СтрЗаменить, СтрШаблон, СтрСоединить и СтрРазделить. Помните о нумерации с единицы, чувствительности к регистру, возврате 0 при отсутствии подстроки и о том, что эти функции не работают внутри запросов.