1С 8.3 Аналог функции Шаблон из 1С 7.7
Всем добрый день. На суд общественности выложу аналог функции Шаблон из 1С 7.7. Сам искал, ничего что обладало бы подобным функционалом не нашел, поэтому может кому то пригодиться.
Позволяет из строки вида: "По договору [Договор.Номер] начислено пени [Сумма][Договор.ВалютаВзаиморасчетов]" получить строку "По договору 00-00000001 начислено пени 1 222RUB"
Позволяет из строки вида: "По договору [Договор.Номер] начислено пени [Сумма][Договор.ВалютаВзаиморасчетов]" получить строку "По договору 00-00000001 начислено пени 1 222RUB"
Функция Шаблон(ШаблонСтроки)
Переменные = Новый Массив;
Попытка
ПервыйСимвол = СтрНайти(ШаблонСтроки,"[");
Пока ПервыйСимвол > 0 Цикл
Если Сред(ШаблонСтроки, ПервыйСимвол - 1, 1) <> "%" Тогда
ВторойСимвол = СтрНайти(ШаблонСтроки, "]", , ПервыйСимвол);
Пока Сред(ШаблонСтроки, ВторойСимвол - 1, 1) = "%" Цикл
ВторойСимвол = СтрНайти(ШаблонСтроки, "]", , ВторойСимвол + 1);
КонецЦикла;
Если (ВторойСимвол > 0) Тогда
Переменная = (Сред(ШаблонСтроки, ПервыйСимвол+1, ВторойСимвол-ПервыйСимвол-1));
Переменные.Добавить(Переменная);
КонецЕсли;
КонецЕсли;
ПервыйСимвол = СтрНайти(ШаблонСтроки,"[",,ПервыйСимвол + 1);
КонецЦикла;
Результат = ШаблонСтроки;
Для Каждого Переменная из Переменные Цикл
Значение = "";
Выполнить("Значение = " + Переменная);
Результат = СтрЗаменить(Результат, "[" + Переменная + "]", Значение);
КонецЦикла;
Возврат Результат;
Исключение
Сообщить(ОписаниеОшибки());
Возврат "";
КонецПопытки;
КонецФункции
ПоказатьОтветы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(1)Это решается с помощью СтрЗаменить().
Формируется строка вида "По договору %1 начислено пени %2%3".
Формируется структура значений параметров вида
Ключ = "Параметр1", "Параметр2",......, ПараметрN
Значение = ЗначениеПараметра1, ЗначениеПараметра2,......ЗначениеПараметраN
и все это скармливается в функцию вида ЗаменитьЗначенияПараметров(Строка, СтруктураЗначенийПараметров) имеющую в себе код:
Формируется строка вида "По договору %1 начислено пени %2%3".
Формируется структура значений параметров вида
Ключ = "Параметр1", "Параметр2",......, ПараметрN
Значение = ЗначениеПараметра1, ЗначениеПараметра2,......ЗначениеПараметраN
и все это скармливается в функцию вида ЗаменитьЗначенияПараметров(Строка, СтруктураЗначенийПараметров) имеющую в себе код:
Сч = 1;
Для Каждого Элемент ИЗ СтруктураЗначенийПараметров Цикл
ЗначениеПараметра = Неопределено;
СтруктураЗначенийПараметров.Свойство("Параметр" + Формат(Сч,"ЧГ="), ЗначениеПараметра);
Если ЗначениеПараметра = Неопределено Тогда
Сч = Сч + 1;
Продолжить;
КонецЕсли;
Строка = СтрЗаменить(Строка, "%" + Формат(Сч,"ЧГ="), Строка(ЗначениеПараметра));
Сч = Сч + 1;
КонецЦикла;
Возврат Строка;
Показать
(3) Рассматривал такой вариант, но в моем решении форматная строка может быть отредактирована пользователем и думаю что ему будет комфортнее работать в шаблоне с переменными вида [Договор],а не %1 и к тому же сами значения могут быть не просто переменной, но и реквизитами этой переменной (например Договор.ВалютаВзаиморасчетов)
(9) в СП не затерли, да и в Гугл не заблокировали. Говорите костыль, а попробуйте решить задачу из первого поста с помощью СтрШаблон. Так что бы было удобно пользователю в режиме предприятия редактировать шаблон и что бы у того же договора можно было добавлять в шаблон реквизиты. Буду весьма признателен )
(10)
Посмотрите подсистему ШаблоныСообщений в БСП. Там все это сделано. И визуальное редактирование и отправка SMS и получение данных. Можно и свои поля еще добавить.
Ваш код выглядет там следующим образом
После чего по МассивПараметров формируется СКД и все данные получаются одним запросом только нужные поля, а не для каждого реквизита тянуть весь объект из базы данных.
Буду весьма признателен
Посмотрите подсистему ШаблоныСообщений в БСП. Там все это сделано. И визуальное редактирование и отправка SMS и получение данных. Можно и свои поля еще добавить.
Ваш код выглядет там следующим образом
Текст = ТекстСообщения;
Позиция = СтрНайти(Текст, "[");
Пока Позиция > 0 Цикл
Если Позиция + 1 > ДлинаСообщения Тогда
Прервать;
КонецЕсли;
ПозицияОкончание = СтрНайти(Текст, "]", НаправлениеПоиска.СНачала, Позиция + 1);
Если ПозицияОкончание > 0 Тогда
НайденныйПараметр = Сред(Текст, Позиция + 1, ПозицияОкончание - Позиция - 1);
МассивПараметров.Вставить(НайденныйПараметр, "");
ИначеЕсли ПозицияОкончание = 0 Тогда
ПозицияОкончание = Позиция + 1;
КонецЕсли;
Если ПозицияОкончание > ДлинаСообщения Тогда
Прервать;
КонецЕсли;
Позиция = СтрНайти(Текст, "[", НаправлениеПоиска.СНачала, ПозицияОкончание);
КонецЦикла;
ПоказатьПосле чего по МассивПараметров формируется СКД и все данные получаются одним запросом только нужные поля, а не для каждого реквизита тянуть весь объект из базы данных.
// КонечнаяСтрока=Шаблон("Организация [ОргНаименованиеПолное], в лице [ДолжностьРуководителя] [ФиоРуководителя]", ДанныеЗаполнения);
Функция Шаблон(ИсхСтрока, ДанныеЗаполнения) //ДанныеЗаполнения - структура
Решальщик=Новый ТабличныйДокумент;
ПерваяОбласть=Решальщик.ПолучитьОбласть(1,1,1,1);
ПерваяЯчейка=ПерваяОбласть.Область(1,1,1,1);
ПерваяЯчейка.Текст=ИсхСтрока;
ПерваяЯчейка.Заполнение=ТипЗаполненияОбластиТабличногоДокумента.Шаблон;
ПерваяОбласть.Параметры.Заполнить(ДанныеЗаполнения);
//теперь выведем во второй табличный документ
ВыводнойТД=новый ТабличныйДокумент;
ВыводнойТД.Вывести(ПерваяОбласть);
//и прочитаем из первой ячейки текст с замененными квадратными скобками
Возврат ВыводнойТД.Область(1,1,1,1).Текст;
КонецФункции
Показать
Вакансии
Ведущий разработчик 1С / Team lead отдела разработки 1С
Москва
зарплата от 300 000 руб. до 300 000 руб.
Полный день
Москва
зарплата от 300 000 руб. до 300 000 руб.
Полный день