1С 8.3 Аналог функции Шаблон из 1С 7.7

1. lowuser 20.05.20 15:34 Сейчас в теме
Всем добрый день. На суд общественности выложу аналог функции Шаблон из 1С 7.7. Сам искал, ничего что обладало бы подобным функционалом не нашел, поэтому может кому то пригодиться.
Позволяет из строки вида: "По договору [Договор.Номер] начислено пени [Сумма][Договор.ВалютаВзаиморасчетов]" получить строку "По договору 00-00000001 начислено пени 1 222RUB"
Функция Шаблон(ШаблонСтроки)
	Переменные = Новый Массив;
	Попытка
		ПервыйСимвол = СтрНайти(ШаблонСтроки,"[");
		Пока ПервыйСимвол > 0 Цикл
			Если Сред(ШаблонСтроки, ПервыйСимвол - 1, 1) <> "%" Тогда
				ВторойСимвол = СтрНайти(ШаблонСтроки, "]", , ПервыйСимвол);
				Пока Сред(ШаблонСтроки, ВторойСимвол - 1, 1) = "%" Цикл
					ВторойСимвол = СтрНайти(ШаблонСтроки, "]", , ВторойСимвол + 1);
				КонецЦикла;
				Если  (ВторойСимвол > 0) Тогда
					Переменная = (Сред(ШаблонСтроки, ПервыйСимвол+1, ВторойСимвол-ПервыйСимвол-1));
					Переменные.Добавить(Переменная);
				КонецЕсли;
			КонецЕсли;
			ПервыйСимвол = СтрНайти(ШаблонСтроки,"[",,ПервыйСимвол + 1);
		КонецЦикла;
		Результат = ШаблонСтроки;
		Для Каждого Переменная из Переменные Цикл
			Значение = "";
			Выполнить("Значение = " + Переменная);
			Результат = СтрЗаменить(Результат, "[" + Переменная + "]", Значение);
		КонецЦикла;
		Возврат Результат;		
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат "";
	КонецПопытки;
КонецФункции
Показать
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
3. nomad_irk 71 20.05.20 15:47 Сейчас в теме
(1)Это решается с помощью СтрЗаменить().

Формируется строка вида "По договору %1 начислено пени %2%3".
Формируется структура значений параметров вида
Ключ = "Параметр1", "Параметр2",......, ПараметрN
Значение = ЗначениеПараметра1, ЗначениеПараметра2,......ЗначениеПараметраN

и все это скармливается в функцию вида ЗаменитьЗначенияПараметров(Строка, СтруктураЗначенийПараметров) имеющую в себе код:

Сч = 1;
Для Каждого Элемент ИЗ СтруктураЗначенийПараметров Цикл
         ЗначениеПараметра = Неопределено;
         СтруктураЗначенийПараметров.Свойство("Параметр" + Формат(Сч,"ЧГ="), ЗначениеПараметра);
         Если ЗначениеПараметра = Неопределено Тогда
              Сч = Сч + 1;
              Продолжить;              
         КонецЕсли;
         Строка = СтрЗаменить(Строка, "%" + Формат(Сч,"ЧГ="), Строка(ЗначениеПараметра));
         Сч = Сч + 1;
КонецЦикла;

Возврат Строка;
Показать
5. lowuser 20.05.20 16:05 Сейчас в теме
(3) Рассматривал такой вариант, но в моем решении форматная строка может быть отредактирована пользователем и думаю что ему будет комфортнее работать в шаблоне с переменными вида [Договор],а не %1 и к тому же сами значения могут быть не просто переменной, но и реквизитами этой переменной (например Договор.ВалютаВзаиморасчетов)
6. nomad_irk 71 20.05.20 16:09 Сейчас в теме
(5)Выполнять разыменование через точку - очень не хорошо, особенно в массовом случае.
7. lowuser 20.05.20 16:11 Сейчас в теме
(6) а поподробнее - чем не хорошо?
8. nomad_irk 71 20.05.20 16:11 Сейчас в теме
(7)тем, что каждое разыменование = запрос к БД.
2. alex-l19041 8 20.05.20 15:45 Сейчас в теме
для чего используете?
4. lowuser 20.05.20 16:01 Сейчас в теме
(2) Использую для шаблонов смс уведомлений. В пользовательском режиме формируется шаблон сообщения, а потом согласно данных формируется само сообщение.
9. VmvLer 20.05.20 16:49 Сейчас в теме
номинация на костыль года как минимум

СтрШаблон() В СП затерли?
10. lowuser 20.05.20 20:14 Сейчас в теме
(9) в СП не затерли, да и в Гугл не заблокировали. Говорите костыль, а попробуйте решить задачу из первого поста с помощью СтрШаблон. Так что бы было удобно пользователю в режиме предприятия редактировать шаблон и что бы у того же договора можно было добавлять в шаблон реквизиты. Буду весьма признателен )
11. VmvLer 21.05.20 09:18 Сейчас в теме
(10) чтобы делать для костыля еще и футляры необходима особая форма сознания, мне лень двигать фазу.
12. FlyVodolaz 22.05.20 11:10 Сейчас в теме
(10)
Буду весьма признателен

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

После чего по МассивПараметров формируется СКД и все данные получаются одним запросом только нужные поля, а не для каждого реквизита тянуть весь объект из базы данных.
13. lowuser 22.05.20 17:05 Сейчас в теме
(12) А вот БСП то я и не посмотрел. Спасибо огромное за верное направление )
14. vtas 14.10.20 09:55 Сейчас в теме
Вычислить("""" + СтрЗаменить(СтрЗаменить(Шаблон, "[", """+"), "]", "+""") + """")
15. bach-saldo 24.03.21 19:34 Сейчас в теме
// КонечнаяСтрока=Шаблон("Организация [ОргНаименованиеПолное], в лице [ДолжностьРуководителя] [ФиоРуководителя]", ДанныеЗаполнения);
Функция Шаблон(ИсхСтрока, ДанныеЗаполнения) //ДанныеЗаполнения - структура
	Решальщик=Новый ТабличныйДокумент;
	ПерваяОбласть=Решальщик.ПолучитьОбласть(1,1,1,1);
	ПерваяЯчейка=ПерваяОбласть.Область(1,1,1,1);
	ПерваяЯчейка.Текст=ИсхСтрока;
	ПерваяЯчейка.Заполнение=ТипЗаполненияОбластиТабличногоДокумента.Шаблон;
	ПерваяОбласть.Параметры.Заполнить(ДанныеЗаполнения);
	//теперь выведем во второй табличный документ
	ВыводнойТД=новый ТабличныйДокумент;
	ВыводнойТД.Вывести(ПерваяОбласть);
	//и прочитаем из первой ячейки текст с замененными квадратными скобками
	Возврат ВыводнойТД.Область(1,1,1,1).Текст;
	
КонецФункции

Показать
16. Робин 14 12.08.21 14:31 Сейчас в теме
Прочитал все ответы. Ну не знаю, не знаю. Все равно молодец!
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)