[Alimir_BootModal_Login]

Внутренний язык программирования 1С 8.3 для начинающих программистов: работа со строками в 1С

Автор уроков и преподаватель школы: Владимир Милькин

Друзья, сегодня будет интереснейший урок. Мы научимся выполнять операции со строками (мы проходили их здесь).

Наверное, не найдётся ни одного языка программирования, который не давал бы возможностей для обработки строк. Настолько это фундаментальный и необходимый тип данных.

И 1с в этом смысле не исключение. Я, как обычно, прошу вас повторять и проверять у себя весь код, который мы будем писать в этом уроке.

Откуда в программе появляются строки

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

ИмяПеременной = "Привет, Мир!";

... и далее использовать его по своему усмотрению:

// Выводим значение строки пользователю в отдельном диалоге.
ОткрытьЗначение(ИмяПеременной);

Бывает и так, что значение строки должен ввести сам пользователь. Это делается при помощи команды ВвестиСтроку:

// Определим переменную с пустым значением строки.
ИмяПеременной = "";
 
// Попросим пользователя ввести новое значение строки.
ВвестиСтроку(ИмяПеременной);
 
// Сообщим пользователю его же строку.
ОткрытьЗначение(ИмяПеременной);

Из чего состоит строка

Любая строка состоит из символов.

К примеру, строка "привет" состоит из символов 'п', 'р', 'и', 'в', 'е', 'т'.

К этим символам можно обращаться по их порядковому номеру. При этом нумерация символов в строке (в отличие от коллекций) начинается не с 0, а с 1.

Узнать общее количество символов в строке можно при помощи функции СтрДлина.  Она принимает на вход строку и возвращает нам число символов в этой строке.

Таким образом, цикл обхода строки будет таким:

ИмяПеременной = "привет";
 
Для НомерСимвола = 1 По СтрДлина(ИмяПеременной) Цикл
    Сообщить(НомерСимвола);
КонецЦикла;

Если мы запустим эту программу на компьютере, то увидим такой результат:

1
2
3
4
5
6

Мы научились получать номера символов в строке, но как получать сами символы?

За получение нужного символа (или даже группы символов) из строки отвечает функция Сред (сокращение от слов "средина", "средний").

Она принимает три параметра:

  • Саму строку.
  • Номер символа в строке, который нужно получить.
  • Количество символов, которое нужно получить.

В нашем случае мы будем получать по одному символу, поэтому третий параметр у нас всегда будет равен 1.

Итак, перепишем наш код вот так:

ИмяПеременной = "привет";
 
Для НомерСимвола = 1 По СтрДлина(ИмяПеременной) Цикл
    Сообщить(Сред(ИмяПеременной, НомерСимвола, 1));
КонецЦикла;

Теперь вывод будет совсем другим:

п
р
и
в
е
т

Что представляет из себя символ

Мне иногда кажется, что всё в этом мире есть числа ... :) И символы строки, кстати, не исключение.

И это на самом деле так, ведь каждому значению символа соответствует определенное число, его код.

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

За перевод символа в числовой код отвечает функция КодСимвола. Она принимает строку и порядковый номер символа в ней, а возвращает числовой код этого символа.

Давайте выведем числовой код каждого символа нашей строки:

ИмяПеременной = "привет";
 
Для НомерСимвола = 1 По СтрДлина(ИмяПеременной) Цикл
    Сообщить(КодСимвола(ИмяПеременной, НомерСимвола));
КонецЦикла;

Запустим эту программу, вывод будет таким:

1087
1088
1080
1074
1077
1090

Получается, что, к примеру, символу 'п' соответствует числовой код 1087? Да, это действительно так. Проверим это.

Для этого я сообщу вам способ для обратного перевода: из числового кода в символ. За такой перевод отвечает функция Символ. Она принимает на вход числовой код, а возвращает символ.

Сообщить(Символ(1087)); // выведет п

Объединение строк

Давайте представим, что у нас есть две вот такие строки ...

Строка1 = "Привет";
Строка2 = "Вова";

... и мы хотим сложить (ещё говорят "склеить", "объединить") эти строки вместе, чтобы за значением первой строки сразу следовало значение второй.

Это делается при помощи оператора плюс (+), вот так:

Строка1 = "Привет";
Строка2 = "Вова"; // используйте ваше имя, Вова - моё имя ;)
Строка3 = Строка1 + Строка2;

Выведем эту строку пользователю:

Сообщить(Строка3); // ПриветВова

Выглядит не очень, правда?

Давайте усложним задачу - требуется объединить эти строки, но между ними вставить пробел, а в конце добавить восклицательный знак.

Строка1 = "Привет";
Строка2 = "Вова";
Строка3 = Строка1 + " " + Строка2 + "!";
Сообщить(Строка3); // Привет Вова!

Вот так гораздо лучше! :)

Поиск в строке

Давайте рассмотрим такую интересную задачу. Попросим пользователя ввести любой текст, но чтобы в нём встречалось (или нет) слово "счастье".

А в ответ мы будем говорить пользователю в какой позиции в строке находится это слово.

К примеру, если пользователь введёт строку "высыпаться по утрам - счастье", то программа должна ему сказать, что слово "счастье" есть в строке и оно находится в позиции 23.

Будем писать программу по частям.

Сначала напишем ввод строки от пользователя:

Текст = "";
ВвестиСтроку(Текст);

За поиск в строке отвечает функция СтрНайти.

На вход она принимает 2 параметра (на самом деле параметров больше, но мы рассмотрим только первые два):

  • Строку, в которой надо искать.
  • Часть строки (её ещё называют "подстрока"), которую надо найти.

Функция возвращает 0, если вхождение не найдено и позицию в строке, если вхождение найдено. Функция ищет только первое вхождение подстроки в строку.

С учётом этого продолжим написание программы вот так:

ПозицияВхождения = СтрНайти(Текст, "счастье");
Если ПозицияВхождения = 0 Тогда
    ОткрытьЗначение("Слово счастье в строке не найдено!");
Иначе
    ОткрытьЗначение("Слово счастье находится в " + ПозицияВхождения + " позиции!");
КонецЕсли;

Замена в строке

А давайте подшутим над пользователем? :)

Пусть он введёт строку со словом "счастье", а мы выведем его же строку, в которой заменим слово "счастье", например, на "удовольствие".

За замену одной части строки на другую отвечает функция СтрЗаменить.

На вход она принимает 3 параметра:

  • Строку, в которой нужно сделать замену.
  • Подстроку, которую надо найти и заменить.
  • Подстроку, на которую нужно заменить.

Функция возвращает строку, полученную в результате замены. При этом функция заменяет все вхождения.

Итак, поехали:

Текст = "";
ВвестиСтроку(Текст);
НовыйТекст = СтрЗаменить(Текст, "счастье", "удовольствие");
ОткрытьЗначение(НовыйТекст);

Верхний и нижний регистры

А вы заметили, что один и тот же символ может иметь два варианта, например: 'п' и 'П'. Первый вариант называется "нижний регистр", а второй - "верхний регистр".

И для компьютера это разные буквы. Мы можем легко в этом убедиться, если выведем числовые коды этих букв:

Сообщить(КодСимвола("п", 1)); // 1087
Сообщить(КодСимвола("П", 1)); // 1055

Именно поэтому для компьютера, к примеру, строка "привет" будет не равна строке "Привет":

// Кстати, сравнение строк на равенство делается
// при помощи знака равно (точно также как с числами).
Сообщить("привет" = "Привет"); // нет

Компьютер при сравнении строк сравнивает числовой код каждого символа одной строки с соответствующим ему (по порядку) числовым кодом символа другой строки. И если есть хотя бы одно неравенство - строки считаются различными.

Но у нас есть замечательная возможность менять регистр строк: из верхнего в нижний и наоборот. За это отвечают функции НРег (сокращение от "нижний регистр") и ВРег (сокращение от "верхний регистр").

Текст = "оТпУсК";
Сообщить(НРег(Текст)); // отпуск
Сообщить(ВРег(Текст)); // ОТПУСК

Когда это может быть полезно? Вспомните задачу, когда мы заменяли слово "счастье" на "удовольствие".

Функция СтрЗаменить (как и Найти) ищет подстроку с учётом регистра. То есть если пользователь введет вместо "счастье", например, "Счастье", то программа не найдёт этого вхождения.

И чтобы поиск и замена не зависели от того в каком регистре ввёл строку пользователь, мы напишем вот так:

Текст = "";
ВвестиСтроку(Текст);
НовыйТекст = СтрЗаменить(НРег(Текст), "счастье", "удовольствие");
ОткрытьЗначение(НовыйТекст);

Теперь, даже если пользователь введёт "Любимая работа - это СЧАСТЬЕ!" программа сможет найти слово "счастье" и вывести пользователю "любимая работа - это удовольствие!".

Подведём итоги

Мы рассмотрели основные операции над строками, но на самом деле их больше.

Некоторые из них вы можете изучить вместе с примерами в справочнике по языку 1с.

Но наиболее полный перечень представлен в синтакс-помощнике:

Пройдите тест

Начать тест

Домашнее задание

Введите от пользователя строку. Посчитайте сколько раз в этой строке встречается пробел и скажите об этом пользователю.

Эталонное решение. Сначала пишем код сами, проверяем на компьютере (как и все примеры программ из уроков), только потом сверяемся

Для учеников

Уровень сложности уроков идёт снизу вверх. Поэтому старайтесь заниматься последовательно, ничего не пропуская и не откладывая на потом.

Обязательно выполняйте все тесты и домашние задания, старайтесь улучшить свои результаты. Сверяйтесь с эталонными решениями только после самостоятельного выполнения задач.

На вопросы учеников — отвечаю по почте,  но прежде загляните в ЧАВО (ссылка) .

С уважением, Владимир Милькин