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