1С СтрЗаменить – замена строки или символа

Функция 1С СтрЗаменить(ГдеЗаменять, ЧтоЗаменять, НаЧто) заменяет все вхождения ЧтоЗаменять в строке ГдеЗаменять.


Например:

  • Выполняем 1С СтрЗаменить(«Здесь; одни; точки;», «;», «.»)
  • 1С возвращает » Здесь. одни. точки.»
  • Выполняем 1С СтрЗаменить(«Ежик любит посмеяться, Ежик любит попрыгать, Ежиковидный смех», «Ежик», «Кролик»)
  • 1С возвращает «Кролик любит посмеяться, Кролик любит попрыгать, Кроликовидный смех»
  • Выполняем 1С СтрЗаменить(«Опера оправа курага», «ра», «да»)
  • 1С возвращает «Опеда опдава кудага»

На примере нашего анализатора текста сделаем с помощью 1С СтрЗаменить – создание сообщения пользователю на основе шаблона с переменными.

Допустим:

  • Текст, который мы считали из файла – шаблон сообщения пользователю
  • В тексте шаблона могут быть указаны переменные с помощью # перед началом слова, например #Документ.Организация.
    После # первым словом до точки идет указание – откуда брать переменную – из документа, константы, результат функции.
    Мы должны считать переменную из текста, определить ее значение, заменить имя переменной на значение.
  • В качестве параметра функции нам передается ссылка на документ, на основе которого мы выводим пользователю сообщение.

[VIP_CONTENT]

//ТекстШаблон - текст, содержащий переменные вида #Константа.ИмяКонстанты или #Документ.ИмяРеквизитаДокумента или #Функция.ИмяФункции
//ДокументСсылка - документ, из которого будут браться значения реквизитов
Функция АнализТекста(ТекстШаблон, ДокументСсылка)
     
     Сообщить("Было: " + ТекстШаблон);
     ТекстРезультат = ТекстШаблон; //скопируем текст шаблона, так как собираемся изменять его
     НезначимыеСимволы = " '"",.;" + Символы.Таб + Символы.ВК + Символы.ПС + Символы.НПП; //определим символы, по которым будем определять окончание переменной
     
     Поз = Найти(ТекстРезультат, "#"); //цикл по тексту будет длиться столько раз, сколько переменных в нем будет найдено
     Пока Поз > 0 Цикл
          
          //Поз указывает первую букву переменной (символ #)
          //По букве дойдем до конца переменной
          Сч = 0; //счетчик букв в имени переменной
          ИмяПеременной = ""; //сюда будем копировать из текста шаблона имя переменной, прибавляя по букве
          Пока Поз + Сч <= СтрДлина(ТекстРезультат) Цикл //проверяем - не дошли ли мы случайно до конца текста шаблона                Буква = Сред(ТекстРезультат, Поз + Сч, 1); //берем одну следующую букву по позиции счетчика                Если Найти(НезначимыеСимволы, Буква) Тогда //если эта буква обозначает "конец переменной", то прекращаем работу цикла                     Прервать;                КонецЕсли;                                ИмяПеременной = ИмяПеременной + Буква; //копируем найденную букву                Сч = Сч + 1; //переходим к следюущей букве           КонецЦикла;                      //в теории пустое имя переменной не может быть, но на всякий случай проверим           Если ПустаяСтрока(ИмяПеременной) или ИмяПеременной = "#" Тогда                Сообщить("Ошибка: на позиции " + Строка(Поз) + " найден знак #, но имя переменной определить не удалось");                Возврат "";           КонецЕсли;                      //найдем точку, чтобы выделить из имени переменной левую и правую части           ПозТочка = Найти(ИмяПеременной, ".");           Если ПозТочка = 0 Тогда                Сообщить("Ошибка: в переменной " + ИмяПеременной + " не найден символ точки");                Возврат "";           КонецЕсли;                      ВидПеременной = Сред(ИмяПеременной, 2, ПозТочка - 2); //левая часть - до точки (не включая символ #)           ЗначениеПеременной = Прав(ИмяПеременной, СтрДлина(ИмяПеременной) - ПозТочка); //правая часть - после точки до конца                      //у нас ровно три варианта видов переменной - Документ, Константа, Функция           ВычисленноеЗначение = "";           Если ВидПеременной = "Документ" Тогда                Попытка                     //пытаемся получить значение реквизита "ДокументСсылка[ИмяРеквизита]", т.к. к реквизитам можно обращаться не только через точку, но и через скобочки[]                     ВычисленноеЗначение = ДокументСсылка[ЗначениеПеременной];                Исключение                     Сообщить("Ошибка: в переменной " + ИмяПеременной + " указан реквизит документа, который не найден в документе");                     Возврат "";                КонецПопытки;                           ИначеЕсли ВидПеременной = "Константа" Тогда                Попытка                     //пытаемся получить значение константы "Константы[ИмяКонстанты].Получить(), т.к. к константам (и прочим метаданным) можно обращаться не только через точку, но и через скобочки[]"                     ВычисленноеЗначение = Константы[ЗначениеПеременной].Получить();                Исключение                     Сообщить("Ошибка: в переменной " + ИмяПеременной + " указана константа, которая не найдена");                     Возврат "";                КонецПопытки;                           ИначеЕсли ВидПеременной = "Функция" Тогда                Попытка                     //чтобы выполнить любую функцию из этого модуля, нужно написать "Выполнить("ИмяФункции()");"                     //чтобы получить результат выполнения, нужно определить переменную (перед "если" мы создали переменную ВычисленноеЗначение), и в Выполнить() написать не "ИмяФункции()", а "ИмяРеальнойПеременной = ИмяФункции()"                     Выполнить("ВычисленноеЗначение = " + ЗначениеПеременной + "();");                Исключение                     Сообщить("Ошибка: в переменной " + ИмяПеременной + " указана функция, которая не найдена или не может быть исполнена (" + ОписаниеОшибки() + ")");                     Возврат "";                КонецПопытки;                           Иначе //сюда мы попадем, если указан вид переменной какой-то другой                Сообщить("Ошибка: в переменной " + ИмяПеременной + " указан вид переменной, который не поддерживается");                Возврат "";           КонецЕсли;                      //в переменной ВычисленноеЗначение у нас "в теории" теперь содержится значение           //заменим текст переменной в шаблоне на значение           ТекстРезультат = СтрЗаменить(ТекстРезультат, ИмяПеременной, ВычисленноеЗначение);                      //теперь переменная заменена, ищем следующую           Поз = Найти(ТекстРезультат, "#");      КонецЦикла;            Сообщить("Стало: " + ТекстРезультат);      Возврат ТекстРезультат;       КонецФункции

[/VIP_CONTENT]

Пример использования созданных нами функций:
//Функция для вызова из шаблона из переменной #Функция.ФиоПодписанта
Функция ФиоПодписанта()
     
     Возврат "Васюкин С.М.";
     
КонецФункции

//Выберем один ПОСЛЕДНИЙ документ из списка
//"ПЕРВЫЕ 1" в сумме "УПОРЯДОЧИТЬ ПО Дата УБЫВ" дают один последний документ
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Документ.Конференция УПОРЯДОЧИТЬ ПО Дата УБЫВ");
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ДокументСсылка = Выборка.Ссылка;

//Вот такое значение мы устанавливаем в константу
Константы.ТекстПриветствия.Установить("Доброго дня, вечера, ночи!");

//Это наш шаблон
Шаблон = "#Константа.ТекстПриветствия
| Рады видеть Вас на нашей конференции от организации '#Документ.Организация'
|           Старший менеджер, #Функция.ФиоПодписанта";

АнализТекста(Шаблон, ДокументСсылка);

Сообщения от 1С в результате выполнения этого кода:
Было: #Константа.ТекстПриветствия
Рады видеть Вас на нашей конференции от организации '#Документ.Организация'
           Старший менеджер, #Функция.ФиоПодписанта

Стало: Доброго дня, вечера, ночи!
Рады видеть Вас на нашей конференции от организации 'ООО "Белые ночи"'
           Старший менеджер, Васюкин С.М.