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