Работа со строками: от простого к сложному

14.01.19

Разработка - Механизмы платформы 1С

Простые примеры работы со строками, в конце более читаемый разбор сложных текстов.

Соединение строк (конкатенация)

СтавкаНДС = "18%";
Результат = "Ставка НДС: " + СтавкаНДС; // "Ставка НДС: 18%"

Кавычки в строке (иногда нужно использовать в " в строке в этом случае используются двойные кавычки ""

Результат = "Infostart ""Event"""; // Infostart "Event"

Вычисление длины строки (СтрДлина)

ДлинаСтроки = СтрДлина("Infostart"); // 9

Вставка специальных символов, символы по коду (Символы, Символ, КодСимвола)

Для получения особых символов переноса строки, табуляции и др. есть перечисление Символы

Результат = "Первая строка" + Символы.ПС + "Вторая строка"; 
// В результате:
// "Первая строка
// Вторая строка"

Получение символа по коду (Символ)

Результат = Символ(1103); // "Я"

Получение кода символа (КодСимвола)

Результат = КодСимвола("Я"); // 1103

Удаление незначащих символов (СокрЛП, СокрЛ, СокрП)

Результат = СокрЛП("  Infostart  "); // "Infostart"
Результат = СокрЛ("  Infostart  "); // "Infostart  "
Результат = СокрП("  Infostart  "); // "  Infostart"

Проверка пустая строка (т.е. строка не содержит значимых символов пробел, табуляция, перенос строки не учитываются)

Если Не ЗначениеЗаполнено(Пример) Тогда
  Сообщить("Строка пустая");
КонецЕсли;

или

Если ПустаяСтрока(Пример) Тогда
  Сообщить("Строка пустая");
КонецЕсли;

Получение части строки (Лев, Прав, Сред)

Результат = Лев("Infostart", 4); // "Info"
Результат = Прав("Infostart", 5); // "start"
Результат = Сред("Infostart", 5, 3); // "sta"
Результат = Сред("Infostart", 5); // "start"

Изменение регистра (ВРег - преобразует в верхний регистр, НРег - нижний, ТРег - титульный)

Результат = ВРег("Infostart"); // "INFOSTART"
Результат = НРег("Infostart", 5); // "infostart"
Результат = ТРег("infostart event"); // "Infostart Event"

Работа с многострочными строками (СтрПолучитьСтроку, СтрЧислоСтрок)

Получение количество строк в строке

Строка = "Первая строка
|Вторая строка
|Третья строка";

Результат = СтрЧислоСтрок (Строка); //3

Получение строки по номеру

Строка = "Первая строка
|Вторая строка";

Результат = СтрПолучитьСтроку(Строка, 2); // "Вторая строка"

Еще иногда требуется функция проверки многострочная строка или нет

// Проверяет строка многострочная?
//
// Параметры:
//   Строка - Строка - Проверяемая строка
//
// Возвращаемое значение:
//   Булево - Истина, если строка многострочная
//
Функция МногострочнаяСтрока(Строка) Экспорт
	
  Возврат Булево(СтрНайти(Строка, Символы.ПС));
	
КонецФункции

Поиск и замена вхождений строки (СтрНайти, СтрЗаменить, СтрЧислоВхождений)

Проверка осуществляется с учетом регистра. Поддерживается с платформы 8.3.6.Проверка вхождения строки

ПроверяемаяСтрока = "Infostart Event";
Если СтрНайти(ПроверяемаяСтрока, "Event") Тогда
  Сообщить("Слово Event входит в строку");
КонецЕсли;

СтрНайти полезная и часто используемая функция предоставляет возможности

  • Поиск в разных направлениях (с начала, с конца);
  • Поиск с указанной позиции;
  • Поиск вхождения с указанным номером (второе, третье и т.д.).
// Поиск позиции вхождения строки
Результат = СтрНайти("Infostart Event 2018", " "); // 10

// Поиск с конца
Результат = СтрНайти("Infostart Event 2018", " ", НаправлениеПоиска.СКонца); // 16

// Поиск с начальной позиции
Результат = СтрНайти("Infostart Event 2018", " ", , 12); // 16 

Замена строк

// Замена подстроки
Результат = СтрЗаменить("Infostart Event 2018", "2018", "2019"); //"Infostart Event 2019"

// Удаление пробелов
Результат = СтрЗаменить("Infostart Event 2018", " ", ""); //"InfostartEvent2018"

Вычисление числа вхождений

Результат = СтрЧислоВхождений("Infostart Event 2018", " "); // 2
Сообщить("Пробел встречается " + Результат + " р.");

Проверки строка начинается, заканчивается (СтрНачинаетсяС, СтрЗаканчиваетсяНа)

Поддерживается с платформы 8.3.6.

// Проверяет что строка начинается со слова "Infostart"
Результат = СтрНачинаетсяС("Infostart Event 2018", "Infostart"); // Истина

// Проверяет что строка заканчивается слова "Event"
Результат = СтрЗаканчиваетсяНа("Infostart Event 2018", "Event"); // Ложь

Сравнение строк СтрСравнить

Строки сравниваются посимвольно по коду символа, для ясности несколько примеров "Строка12" < "Строка2", "8.3.9.2000" > "8.3.8", "8.3.9.2000" > "8.3.10"

С учетом регистра можно сравнить строки через знаки сравнения как в примерах

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

Возвращает:

  • -1 - первая строка меньше второй
  • 1 - первая строка больше второй. 
  • 0 - первая строка равна второй
Результат = СтрСравнить("Infostart Event 2018", "Infostart Event 2019"); // -1

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

Преобразование в строку (Строка, Формат)

В языке 1С есть автоматическое преобразование типа когда все части выражения приводятся к типу первого выражения 

Число = 1000;
Результат = "Число: " + Число; // "Число: 1 000"

Преобразование функцией Строка

Число = 1000.25;
Результат = "Число: " + Строка(Число); // "Число: 1 000,25"

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

"Правильнее" будет преобразовывать функцией формат, которая приводит к строке простые типы и можно воспользоватся конструктором

Число = 1000.25;
Результат = "Число: " + Формат(Число, "ЧГ="); // "Число: 1000,25"

Строка на разных языках НСтр

Результат = НСтр("ru = 'Привет!'; en = 'Hello!'"); // Результат зависит от языка

Форматирование строки по шаблону СтрШаблон.  Поддерживается с платформы 8.3.6.

Очень полезная функция которая позволяет избежать соединения строк и сделать текст более читабельным

Число = 1000.25;
Результат = СтрШаблон("Число: %1, Дата: %2", Число, Дата(1983,4,4)); // "Число: 1 000,25, Дата: 04.04.1983 00:00:00" 

Функции СтрСоединить, СтрРазделить.  Поддерживается с платформы 8.3.6.

Очень полезные функции улучшают читаемость кода.

СтрРазделить удобна когда необходимо разобрать строку с разделителями, например CSV файл, разбор текста на слова, строки

Результат = СтрРазделить("Infostart Event 2018", " "); // Массив с элементами [0] = "Infostart", [1] = "Event ", [2] = "2018"

Аналогично, только наоборот работает функция СтрСоединить, преобразуя массив к строке.

 
 Другие функции работы со строками, которые могут быть полезны

СтрСократить (Текст, Количество, Многострочная = Ложь) - сокращает текст до заданной длины заменяя окончание на ...

Результат = СтрСократить("Infostart Event 2018", 10); //  "Infosta..."

ЭтоКорректныйИдентификатор (Строка) - Проверяет является ли строка корректным идентификатором, строка вида СуммаКонтрагента, _Идентификатор

Результат = ЭтоКорректныйИдентификатор("СуммаДокумента"); // Истина
Результат = ЭтоКорректныйИдентификатор("Сумма документа"); // Ложь

Когда в 1с встает вопрос разбора большого текста это уже зоопарк из СтрДлина, Сред, СтрНайти для повышения читаемости программ для подобных задач использую свои функции: РазборПрочитатьЦелоеЧисло, РазборПрочитатьШестнадцатеричноеЧисло, РазборПрочитатьНезначимые, РазборПрочитатьИдентификатор,

РазборПропуститьНаборСимволов, РазборПрочитатьСимвол, РазборПрочитатьДоСимвола, РазборНайтиТекст

Строка = "КоличествоДокументов = 1000";
Индекс = 1;
Идентификатор = РазборПрочитатьИдентификатор(Строка, Индекс); // "КоличествоДокументов"
РазборПрочитатьНезначимые(Строка, Индекс);
РазборПропуститьНаборСимволов(Строка, "=");
РазборПрочитатьНезначимые(Строка, Индекс);
Значение = РазборПрочитатьЦелоеЧисло(Строка, Индекс); //1000 (Число)
 Код модуля

Дополнительные ссылки:

Зазеркалье. Новые функции работы со строками (в платформе 8.3.6)

Строка Работа со строками Строковые функции

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4481    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5282    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6401    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18466    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12082    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8804    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6273    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15974    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. lunjio 66 14.01.19 12:40 Сейчас в теме
Упомянули уж тогда, что про сравнение строк в запросе, что когда сравнение идет через оператор = в запросе не важен регистр и пробелы справа отсекаются, когда через подобно тогда важно полное соответствие строк, без учета регистра, другие моменты, по памяти не скажу какие. Так выглядит как напоминалка начинающего программиста.
NicholasUzunov; serverstar; triviumfan; Irwin; jif; CyberCerber; +6 Ответить
3. Evg-Lylyk 4559 14.01.19 14:12 Сейчас в теме
(1) Поправил описание
(2) А в чем разница "Не ЗначениеЗаполнено" и "ПустаяСтрока" для строки попробовал... одно и тоже

Спасибо за отзыв
5. CyberCerber 852 14.01.19 14:24 Сейчас в теме
(3) Да, прошу прощения, на последней версии платформы сейчас проверил, работают одинаково. Раньше была небольшая разница. Можно даже справку почитать, разработчики, видать, ее еще не исправили.
2. CyberCerber 852 14.01.19 12:44 Сейчас в теме
Ожидал увидеть что-то про рег выражения и прочее, а 90% статьи - это пересказ СП.
Самое интересное начинается в конце, когда предлагаются свои функции, но про это все как-то скомкано и не понятно описано.
Еще, кстати, "Не ЗначениеЗаполнено" и "ПустаяСтрока" - это разные функции. Хорошо было бы пояснить, когда будет разница
MezhduProchim; +1 Ответить
7. starik-2005 3033 14.01.19 15:29 Сейчас в теме
(2) да, статья без регулярок, конечно, неполна. А в 1С без ограничения ОС регулярки работают крайне ограниченно - только тест шаблона.
4. SlavaKron 14.01.19 14:19 Сейчас в теме
Наборы символов - строковые константы. Получать их через функцию, да еще и в цикле - дичь.
6. Evg-Lylyk 4559 14.01.19 14:34 Сейчас в теме
(4) В функции более читабельно, как еще это делать в 1С. Пользуюсь этими функциями на небольших текстах проблем со скоростью нет.
8. galich 162 14.01.19 17:03 Сейчас в теме
Еще надо упомянуть, что функцию конкатенации строк с 8.3.6 лучше делать через СтрСоединить("Строка 1", Символы.ПС, "Строка 2"). На таком объеме данных выигрыш незначительный, но при больших строках производительность оператора "+" падает катастрофически.
А в целом, функционал появившийся в 8.3.6 не освещен. Там в платформе появилось много полезных функций (СтрШаблон, СтрРазделить и т.д.), подробнее есть статья в Зазеркалье 1С
UPD: То ли уже добавил, то ли я невнимательно читаю ))) Информация уже есть в статье.
Mizhgan42; KAV2; independ; +3 Ответить
10. independ 1518 14.01.19 20:47 Сейчас в теме
(8) Не знал, проверил на 15000 строк, результат почти в 9 раз быстрее, быстрее только ЗначениеВСтрокуВнутр(ТЗ)-3 сек;
Выполняется 9 сек
Для каждого стр из ТЗ Цикл
		МассивСтрок=Новый Массив;
		МассивСтрок.Добавить(стр.Код);
		МассивСтрок.Добавить(стр.Артикул);
		МассивСтрок.Добавить(СтрЗаменить(стр.Наименование,";",""));
		МассивСтрок.Добавить(Формат(стр.Цена,"ЧГ="));
		МассивСтрок.Добавить(стр.Штрихкод);
		МассивСтрок.Добавить(Формат(стр.SKU,"ЧГ="));
		МассивСтрок.Добавить(стр.КодАлко);
		МассивСтрок.Добавить(Символы.ПС);
		ФайлТекст=ФайлТекст+СтрСоединить(МассивСтрок,";");
КонецЦикла;
Показать

Выполняется 80 сек
Для каждого стр из ТЗ Цикл
		//ФайлТекст=ФайлТекст+стр.Код+";"+стр.Артикул+";"+
		//СтрЗаменить(стр.Наименование,";","")+";"+
		//Формат(стр.Цена,"ЧГ=")+";"+стр.Штрихкод+";"+
		//Формат(стр.SKU,"ЧГ=")+";"+стр.КодАлко+Символы.ПС;
КонецЦикла;	
Mizhgan42; ixijixi; RustIG; KAV2; galich; +5 Ответить
11. galich 162 15.01.19 09:42 Сейчас в теме
(10) Это еще не самое большое замедление (хотя и показательное). Как-то пришлось конкатенировать пару сотен тысяч мелких строк, там разница была в десятки минут.
12. independ 1518 15.01.19 11:24 Сейчас в теме
(11) вышеуказанный пример я делал на 8.3.10.2667 64Бит - MSSQL 2014.
А к примеру на файловой базе 8.2.19.130 при формировании текстового файла для фронтола - записей примерно 18000, при этом не используется СтрСоединить(), т.к. ее нет, скорость адекватная 8-9 сек,
13. caponid 15.01.19 14:50 Сейчас в теме
(10) Для толстых текстовых данных неплохо подходит ЗаписьXML.ЗаписатьБезОбработки
Работает очень быстро.
14. starik-2005 3033 15.01.19 14:58 Сейчас в теме
(10) (13)
... на 15000 строк, результат почти в 9 раз быстрее ...
А запись текста не?
Для каждого стр из ТЗ Цикл
  ЗаписьТ.ЗаписатьСтроку(стр.Код,";");
  ЗаписьТ.ЗаписатьСтроку(стр.Артикул,";");
  ЗаписьТ.ЗаписатьСтроку(СтрЗаменить(стр.Наименование,";",""),";");
  ЗаписьТ.ЗаписатьСтроку(Формат(стр.Цена,"ЧГ="),";");
  ЗаписьТ.ЗаписатьСтроку(стр.Штрихкод,";");
  ЗаписьТ.ЗаписатьСтроку(Формат(стр.SKU,"ЧГ="),";");
  ЗаписьТ.ЗаписатьСтроку(стр.КодАлко);
КонецЦикла;
Показать
А можно поток в памяти для скорости еще к записи текста привязать. Думаю будет быстрее.
29. mikl79 118 21.07.22 15:29 Сейчас в теме
(10), действительно, написал такой код
//1-й вариант
Нач = ТекущаяДата();
Для Каждого ТекСтр из Массив Цикл
Текст = Текст+Символы.ПС+ТекСтр;
КонецЦикла;
Кон = ТекущаяДата();
Время = Кон - Нач;
Сообщить(Текст);
Сообщить("Время выполнения теста № 1: "+Время);

//2-й вариант
Нач = ТекущаяДата();
Текст = СтрСоединить(Массив,Символы.ПС);
Кон = ТекущаяДата();
Время = Кон - Нач;
Сообщить(Текст);
Сообщить("Время выполнения теста № 2: "+Время);

на массиве из 10 000 строк была разница:
1-й вариант - 2 сек
2-й вариант - 0 сек
9. caponid 14.01.19 18:29 Сейчас в теме
Функция ЭтоКорректныйИдентификатор(Строка) Экспорт
    Попытка
        Структура = Новый Структура(Строка);
        Возврат Структура.Свойство(Строка);
    Исключение
        Возврат Ложь;
    КонецПопытки
КонецФункции
15. kembrik 10 17.01.19 16:16 Сейчас в теме
Ковычки заменить на Кавычки и совсем хорошо будет
16. Evg-Lylyk 4559 17.01.19 16:49 Сейчас в теме
17. German_Tagil 42 18.01.19 14:25 Сейчас в теме
хорошо как раз сегодня искал
задача примерно такая
есть строки "АЕШ 8888-4007 Разработка"
"АЕШ 8888-4007 Разработка проекта"
как правильно определить вхождение 2 пробела
и поделить строки на левую и правую
18. ivangrant 10 09.11.20 13:55 Сейчас в теме
В функции РазборПрочитатьЦелоеЧисло в цикле нужен оператор не Прервать, а Продолжить.
19. ivangrant 10 09.11.20 15:17 Сейчас в теме
(18) UPD: прошу прощения. Ошибся.
20. bambucho 20.11.20 12:11 Сейчас в теме
А удаление строки в многострочной строке? - мысль,копирование нужных строк...
21. Evg-Lylyk 4559 20.11.20 12:13 Сейчас в теме
(20) функции СтрУдалитьСтроку нету
Решение в лоб, добавить нужные строки в массив и вызвать СтрСоединить(Строки, Символы.ПС)
22. Gendelf 01.02.21 12:25 Сейчас в теме
А есть готовые функции для добавления пробелов в формат строки: "РазрешитьПроведениеПлатежаБезЗаявки" и выразить её строкой "Разрешить Проведение Платежа Без Заявки" ? Для поиска по наименованию иногда нужно.
23. Evg-Lylyk 4559 02.02.21 08:56 Сейчас в теме
24. Evg-Lylyk 4559 04.02.21 18:15 Сейчас в теме
25. It-developer 24 03.06.21 13:01 Сейчас в теме
Кому это интересно? Создайте готовый рабочий модуль РаботаСоСтроками с адекватными названиями процедур и функций и адекватным кодом - может быть полезно
26. fixin 4252 22.02.22 18:02 Сейчас в теме
Спасибо, только сейчас, после этой статьи, перестал считать число строк через текстовый документ и открыл для себя СтрЧислоСтрок
27. Evg-Lylyk 4559 22.02.22 18:24 Сейчас в теме
(26) сам тоже долго не знал про СтрКоличествоСтрок и СтрПолучитьСтрокк
28. mikl79 118 21.07.22 15:11 Сейчас в теме
спасибо, всегда можно открыть что-то новое
очень понравилась и пригодилась
Массив = СтрРазделить(Текст,Символы.ПС);
Evg-Lylyk; +1 Ответить
Оставьте свое сообщение