1. lowuser 20.05.20 15:34 Сейчас в теме

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

Всем добрый день. На суд общественности выложу аналог функции Шаблон из 1С 7.7. Сам искал, ничего что обладало бы подобным функционалом не нашел, поэтому может кому то пригодиться.
Позволяет из строки вида: "По договору [Договор.Номер] начислено пени [Сумма][Договор.ВалютаВзаиморасчетов]" получить строку "По договору 00-00000001 начислено пени 1 222RUB"
Функция Шаблон(ШаблонСтроки)
	Переменные = Новый Массив;
	Попытка
		ПервыйСимвол = СтрНайти(ШаблонСтроки,"[");
		Пока ПервыйСимвол > 0 Цикл
			Если Сред(ШаблонСтроки, ПервыйСимвол - 1, 1) <> "%" Тогда
				ВторойСимвол = СтрНайти(ШаблонСтроки, "]", , ПервыйСимвол);
				Пока Сред(ШаблонСтроки, ВторойСимвол - 1, 1) = "%" Цикл
					ВторойСимвол = СтрНайти(ШаблонСтроки, "]", , ВторойСимвол + 1);
				КонецЦикла;
				Если  (ВторойСимвол > 0) Тогда
					Переменная = (Сред(ШаблонСтроки, ПервыйСимвол+1, ВторойСимвол-ПервыйСимвол-1));
					Переменные.Добавить(Переменная);
				КонецЕсли;
			КонецЕсли;
			ПервыйСимвол = СтрНайти(ШаблонСтроки,"[",,ПервыйСимвол + 1);
		КонецЦикла;
		Результат = ШаблонСтроки;
		Для Каждого Переменная из Переменные Цикл
			Значение = "";
			Выполнить("Значение = " + Переменная);
			Результат = СтрЗаменить(Результат, "[" + Переменная + "]", Значение);
		КонецЦикла;
		Возврат Результат;		
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат "";
	КонецПопытки;
КонецФункции
Показать
Ответы
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
3. nomad_irk 49 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 49 20.05.20 16:09 Сейчас в теме
(5)Выполнять разыменование через точку - очень не хорошо, особенно в массовом случае.
7. lowuser 20.05.20 16:11 Сейчас в теме
(6) а поподробнее - чем не хорошо?
8. nomad_irk 49 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) А вот БСП то я и не посмотрел. Спасибо огромное за верное направление )
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

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

Ведущий программист 1С
Санкт-Петербург
зарплата от 130 000 руб.
Полный день

Специалист 1 категории (Программист 1С ФЗД)
Фрязино
зарплата от 110 000 руб.
Полный день

Специалист 1 категории (Программист 1С)
Фрязино
зарплата от 110 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству