Строка — это один из примитивных типов данных существующих 1С и работать с ним приходится практически постоянно. Следовательно необходимо иметь представление о том, какие функции для работы со строками существуют, как и когда они используются, а также, что получается в результате. Этим и займемся.
- Функции для работы со строками в 1С 8.2 и 8.3
- Строка
- СтрДлина
- СокрЛП, СокрЛ, СокрП
- Лев, Прав, Сред
- ВРег, НРег, ТРег
- Найти
- СтрЧислоВхождений
- СтрЗаменить
- ПустаяСтрока
- СтрЧислоСтрок
- СтрПолучитьСтроку
- Символ, КодСимвола
- Символы
- ЗначениеВСтрокуВнутр, ЗначениеИзСтрокиВнутр
- ВвестиСтроку
- Функции для работы со строками начиная с версии 8.3.6.1977
- СтрШаблон
- СтрСравнить
- СтрНайти
- СтрНачинаетсяС, СтрЗаканчиваетсяНа
- СтрРазделить, СтрСоединить
- Типовые задачи при работе со строками в 1С 8.2 и 8.3
- Сложение строк
- Преобразования строка-число, число-строка
- Кавычки в строке
- Символ переноса строки
- Сравнение строк
- Разделение строки по разделителю
Функции для работы со строками в 1С 8.2 и 8.3
Строка
Функция Строка(x) возвращает текстовое представление переданного ей значения “x”.
1 2 3 4 5 6 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(Строка(35)); //35 Сообщить(Строка(Истина)); //Да Сообщить(Строка('20170425151515')); //25.04.2017 15:15:15 КонецПроцедуры |
СтрДлина
Функция СтрДлина(x) вычисляет количество символов в строке “x”, учитывая пробелы и ничего не значащие символы.
1 2 3 4 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(СтрДлина("тестовая строка")); //15 КонецПроцедуры |
СокрЛП, СокрЛ, СокрП
Функции СокрЛП(x), СокрЛ(x) и СокрП(x) убирают пробелы и ничего не значащие символы у переданной строки “x” с обеих сторон, слева и справа соответственно.
1 2 3 4 5 6 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(СокрЛ(" тест ")); //"тест " Сообщить(СокрП(" тест ")); //" тест" Сообщить(СокрЛП(" тест ")); //"тест" КонецПроцедуры |
Лев, Прав, Сред
Функции Лев(x, y) и Прав(x, y) возвращают количество символов “y” с левого или правого края переданной им строки “x”. А функция Сред(x, y, z) возвращает количество символов “z” из указанного места “y” переданной строки “x”.
1 2 3 4 5 6 7 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(Лев("тестовая строка", 5)); //"тесто" Сообщить(Прав("тестовая строка", 5)); //"трока" Сообщить(Сред("тестовая строка", 5)); //"овая строка" Сообщить(Сред("тестовая строка", 5, 5)); //"овая" КонецПроцедуры |
ВРег, НРег, ТРег
Функция ВРег(x) преобразует все символы переданной строки “x” в верхний регистр, НРег(x) — в нижний регистр, ТРег(x) — первую букву каждого слова преобразует в верхний регистр, а все остальные нижний.
1 2 3 4 5 6 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(ВРег("Верхний регистр")); //ВЕРХНИЙ РЕГИСТР Сообщить(НРег("Нижний регистр")); //нижний регистр Сообщить(ТРег("Каждое слово с заглавной буквы")); //Каждое Слово С Заглавное Буквы КонецПроцедуры |
Найти
Функция Найти(x, y) возвращает номер первого символа первого вхождения подстроки “y” в строку “x”, если, конечно, такое вхождение найдено (при этом нумерация начинается с 1). Если же вхождений не найдено, то функция возвращает 0.
1 2 3 4 5 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(Найти("тестовая строка", "с")); //3 Сообщить(Найти("тестовая строка", "м")); //0 КонецПроцедуры |
СтрЧислоВхождений
Функция СтрЧислоВхождений(x, y) возвращает количество вхождений подстроки “y” в строку “x”.
1 2 3 4 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(СтрЧислоВхождений("тестовая строка", "т")); //3 КонецПроцедуры |
СтрЗаменить
Функция СтрЗаменить(x, y, z) позволяет в указанной строке “x” заменить все вхождения одной подстроки “y” на другую “z”, результатом выполнения функции будет строка с проведенными заменами.
1 2 3 4 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(СтрЗаменить("тест1,тест2,тест3,тест4", ",", " ")); //тест1 тест2 тест3 тест4 КонецПроцедуры |
ПустаяСтрока
Функция ПустаяСтрока(x) сравнивает переданную ей строку “x” с пустой и возвращает результат этого сравнения — Истина или Ложь, при этом строка состоящая из пробелов и/или ничего не значащих символов приравнивается к пустой.
1 2 3 4 5 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(ПустаяСтрока(" ")); //Да Сообщить(ПустаяСтрока("тестовая строка")); //Нет КонецПроцедуры |
СтрЧислоСтрок
Функция СтрЧислоСтрок(x) возвращает количество строк в многострочном тексте “x”.
1 2 3 4 5 | &НаКлиенте Процедура ТестСтрока(Команда) МногострочныйТекст = СтрЗаменить("тест1,тест2,тест3,тест4", ",", Символы.ПС); //тест1 тест2 тест3 тест4 Сообщить(СтрЧислоСтрок(МногострочныйТекст)); //4 КонецПроцедуры |
СтрПолучитьСтроку
Функция СтрПолучитьСтроку(x, y) возвращает строку с номером “y” из многострочного текста “x”.
1 2 3 4 5 | &НаКлиенте Процедура ТестСтрока(Команда) МногострочныйТекст = СтрЗаменить("тест1,тест2,тест3,тест4", ",", Символы.ПС); //тест1 тест2 тест3 тест4 Сообщить(СтрПолучитьСтроку(МногострочныйТекст, 2)); //тест2 КонецПроцедуры |
Символ, КодСимвола
Функция Символ(x) получает код символа “x” и возвращает строку содержащую соответствующий символ (в кодировке Unicode). Функция КодСимвола(x) делает обратное действие — получает символ “x” и возвращает его код в кодировке Unicode. Таблицу символов Unicode можно найти, например, тут.
1 2 3 4 5 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(Символ(1046)); //Ж Сообщить(КодСимвола("Ж")); //1046 КонецПроцедуры |
Символы
Это не функция, а набор наиболее часто используемых специальных символов, состоит из:
- ВК (CR) — возврат каретки;
- ВТаб (VTab) — вертикальная табуляция;
- НПП (NBSp) — неразрывный пробел;
- ПС (LF) — перевод строки;
- ПФ (FF) — перевод формы;
- Таб (Tab) — символ горизонтальной табуляции.
ЗначениеВСтрокуВнутр, ЗначениеИзСтрокиВнутр
Функция ЗначениеВСтрокуВнутр(x) возвращает системное строковое представление значения “x”. Функция ЗначениеИзСтрокиВнутр(x) проделывает обратную операцию и возвращает значение, полученное из строкового системного представления “x”. Обе эти функции используются для сохранения функциональной совместимости с версией 7.7. Использование для каких-либо других целей не рекомендуется. В новых версиях платформы данные функции не работают (хотя их описание присутствует в справке).
ВвестиСтроку
Функция ВвестиСтроку(x, y, z, w) вызывает диалог для ввода строки, введенная строка записывается в переменную “x”, кроме этого можно указать подсказку “y”, длину вводимой строки “z”, отметку многострочности вводимого текста “w”. Функция возвращает Истина — если ввод был произведен, Ложь — если пользователь отказался от ввода. Выглядит это окно примерно так:
1 2 3 4 5 | &НаКлиенте Процедура ТестСтрока(Команда) НовСтр = ""; ВвестиСтроку(НовСтр, "Введите имя", 50, Ложь); КонецПроцедуры |
Функции для работы со строками начиная с версии 8.3.6.1977
В обновлении 8.3.6.1977 набор функций для работы со строками был серьезно расширен.
СтрШаблон
Функция СтрШаблон(x, y1-y10) является аналогом функции printf из языка C++ и многих других. В исходной строке “x” можно использовать маркеры подстановки “%1, %2..%10” (не более 10), которые впоследствии заменяются на соответствующие “y1, y2..y10”. Функция возвращает результат этой замены. Если количество маркеров замены не соответствует количеству параметров “y1, y2..y10”, то генерируется ошибка.
1 2 3 4 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(СтрШаблон("%1,%2,%3,%4,%5,%6,%7,%8,%9,%10", 101, 102, 103, 104, 105, 106, 107, 108, 109, 110)); //101,102,103,104,105,106,107,108,109,110 КонецПроцедуры |
СтрСравнить
Функция СтрСравнить(x, y) выполняет лексикографическое сравнение переданных ей строк “x” и “y” и возвращает одно из трех значений:
- 0 — строки равны;
- 1 — строка “x” больше строки “y”;
- -1 — строка “x” меньше строки “y”.
1 2 3 4 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(СтрСравнить("ааа", "ааб")); //-1 КонецПроцедуры |
СтрНайти
Функция СтрНайти(x, y, z, w, v) призвана полность заменить функцию Найти(), так как она ее полность повторяет (строка “x” и подстрока поиска “y”), а также позволяет указать необязательные дополнительные параметры поиска: направление поиска “z”, начальную позицию “w” и номер вхождения “v”.
1 2 3 4 5 6 7 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(СтрНайти("тестовая строка", "т", НаправлениеПоиска.СНачала)); //1 Сообщить(СтрНайти("тестовая строка", "т", НаправлениеПоиска.СНачала, 2)); //4 Сообщить(СтрНайти("тестовая строка", "т", НаправлениеПоиска.СНачала,, 3)); //11 Сообщить(СтрНайти("тестовая строка", "т", НаправлениеПоиска.СКонца)); //11 КонецПроцедуры |
СтрНачинаетсяС, СтрЗаканчиваетсяНа
Функции СтрНачинаетсяС(x, y) и СтрЗаканчиваетсяНа(x, y) проверяют начинается/заканчиватся ли строка “x” с/на подстроку “y” и возвращают результат — Истина или Ложь.
1 2 3 4 5 6 7 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(СтрНачинаетсяС("тестовая строка", "т")); //Да Сообщить(СтрНачинаетсяС("тестовая строка", "п")); //Нет Сообщить(СтрЗаканчиваетсяНа("тестовая строка", "а")); //Да Сообщить(СтрЗаканчиваетсяНа("тестовая строка", "б")); //Нет КонецПроцедуры |
СтрРазделить, СтрСоединить
Функция СтрРазделить(x, y, z) разделяет строку “x” по разделителю “y” и возвращает получившийся массив строк, параметр “z” позволяет указать, нужно ли включать в этот массив пустые строки. Функция СтрСоединить(x, y) выполняет обратную задачу — склеивает массив строк “x” в одну строку через разделитель “y” (если этот разделитель указан).
1 2 3 4 5 6 7 | &НаКлиенте Процедура ТестСтрока(Команда) МассивСтрок = СтрРазделить("тест1,тест2,тест3,тест4", ",", Ложь); Сообщить(МассивСтрок[0]); //тест1 Сообщить(СтрСоединить(МассивСтрок, "+")); //тест1+тест2+тест3+тест4 КонецПроцедуры |
Типовые задачи при работе со строками в 1С 8.2 и 8.3
Сложение строк
В языке 1С работает сложение как непосредственно строк, так и сложение переменных:
1 2 3 4 5 6 7 8 9 10 | &НаКлиенте Процедура ТестСтрока(Команда) Мама = "Мама "; Мыла = "мыла "; Раму = "раму"; Сообщить("Мама "+"мыла "+"раму"); //Мама мыла раму Сообщить(Мама+Мыла+Раму); //Мама мыла раму Сообщить("Мама "+Мыла+"раму"); //Мама мыла раму КонецПроцедуры |
Преобразования строка-число, число-строка
Помимо специальных функций:
- Строка(x) — подробно описана выше;
- Число(x) — подробно описана в статье о числах в 1С.
Кроме этого прекрасно работает приведение типов «на лету», тут все завит от того, что с чем складывает (какой тип данных идет первым), в случае если приведение типов невозможно, будет вызвана исключительная ситуация и показана соответствующая ошибка:
1 2 3 4 5 6 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить(6+"6"); //12 - Число Сообщить("6"+6); //66 - Строка Сообщить(""+6+"6"); //66 - Строка КонецПроцедуры |
Кавычки в строке
Одинарные кавычки не нуждаются в каком-либо экранировании, а для использования внутри строки двойных кавычек каждую двойную кавычку нужно продублировать:
1 2 3 4 5 | &НаКлиенте Процедура ТестСтрока(Команда) Сообщить("'Мама' ""мыла"" 'раму'"); //'Мама' "мыла" 'раму' Сообщить(""""); //" КонецПроцедуры |
Символ переноса строки
Символ переноса строки (и все остальные специальные символы) ведут себя точно также как и простые строки, т.е. могут складываться с другими строками. При сложении символа переноса строк с другими строками получается много строчный текст, для работы с которым существуют специальные функции описанные выше:
1 2 3 4 | &НаКлиенте Процедура ТестСтрока(Команда) МногострочныйТекст = "тест1"+Символы.ПС+"тест2"+Символы.ПС+"тест3"+Символы.ПС+"тест4"; КонецПроцедуры |
Сравнение строк
При сравнении строк будет разумно (в зависимости от задачи, конечно) обрезать все не значащие символы и привести строки к одному регистру:
1 2 3 4 5 6 7 8 9 | &НаКлиенте Процедура ТестСтрока(Команда) Строка1 = " тЕсТ "; Строка2 = " ТЕсТ "; Если НРег(СокрЛП(Строка1)) = НРег(СокрЛП(Строка2)) Тогда Сообщить("Строки равны"); КонецЕсли; КонецПроцедуры |
Разделение строки по разделителю
Для того чтобы разбить строку по разделителю в языке 1С существует два способа, старый:
1 2 3 4 5 6 7 8 9 | &НаКлиенте Процедура ТестСтрока(Команда) СтрокаСРазделителями = "тест1,тест2,тест3,тест4"; МногострочныйТекст = СтрЗаменить(СтрокаСРазделителями, ",", Символы.ПС); Для Счетчик = 1 По СтрЧислоСтрок(МногострочныйТекст) Цикл Сообщить(СтрПолучитьСтроку(МногострочныйТекст,Счетчик)); КонецЦикла; КонецПроцедуры |
Начиная с версии 8.3.6.1977 в языке 1С существует специальная функция позволяющая разложить строку по разделителю в массив строк:
1 2 3 4 5 6 7 | &НаКлиенте Процедура ТестСтрока(Команда) МассивСтрок = СтрРазделить(СтрокаСРазделителями, ","); Для Каждого ТекСтрока Из МассивСтрок Цикл Сообщить(ТекСтрока); КонецЦикла; КонецПроцедуры |
Спасибо, можно потихоньку отказываться от БСП общего модуля работы со строками.
Функции для управления регистром строки. ВРег преобразует строку в верхний регистр. НРег в нижний. ТРег у каждого нового слова первая буква преобразуется в верхний регистр, остальные в нижний.
ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр прекрасно работают на всех релизах, не дезинформируйте людей