Каталог решений - Строка по шаблону с помощью СКД

Строка по шаблону с помощью СКД

Строка по шаблону с помощью СКД

В наличии

Иногда необходимо получить строку по шаблону с различными условиями или с возможностью изменения формата вывода. Например, заполнение поля «Назначение платежа» в платежном поручении. Для формирования такой строки может быть использована система компоновки данных, что и демонстрирует данная статья.

Категория:

Описание

В статье описывается создание строки по шаблону с использованием СКД. Основная идея — использование пользовательского поля, в котором можно применять различные функции.

Создаем новый макет с набором данных объект, в котором полями являются параметры для подстановки в шаблон.

 

Добавляем пользовательское поле с типом выражение (СтрокаПоШаблону). Текст выражения будет установлен позже.

 

 

Создаем форму с необходимыми реквизитами:

 

 

Код модуля формы

Сначала добавляем значения параметров шаблона:

&НаСервере
Процедура СтрокаПоШаблонуНаСервере()
	ДанныеЗаполнения = СоздатьДанныеЗаполнения();
	Результат = ПолучитьСтрокуПоШаблону(ТекстШаблона, ДанныеЗаполнения);
КонецПроцедуры

&НаСервере
Функция СоздатьДанныеЗаполнения()
	// Создаем таблицу параметров шаблона
	ДанныеЗаполнения = Новый ТаблицаЗначений;
	ДанныеЗаполнения.Колонки.Добавить("Фамилия", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(100,ДопустимаяДлина.Переменная)));
	ДанныеЗаполнения.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(100,ДопустимаяДлина.Переменная)));
	ДанныеЗаполнения.Колонки.Добавить("Отчество", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(100,ДопустимаяДлина.Переменная)));
	ДанныеЗаполнения.Колонки.Добавить("ДатаРождения", Новый ОписаниеТипов("Дата",,,,,Новый КвалификаторыДаты(ЧастиДаты.Дата)));
	
	// Добавляем значения параметров
	СтрокаДанныхЗаполнения = ДанныеЗаполнения.Добавить();
	СтрокаДанныхЗаполнения.Фамилия = Фамилия;
	СтрокаДанныхЗаполнения.Имя = Имя;
	СтрокаДанныхЗаполнения.Отчество = Отчество;
	СтрокаДанныхЗаполнения.ДатаРождения = ДатаРождения;
	
	Возврат ДанныеЗаполнения;
КонецФункции // СоздатьДанныеЗаполнения()

И сама функция получения результата:

Функция ПолучитьСтрокуПоШаблону(ТекстШаблона, ДанныеЗаполнения)
	СтрокаПоШаблону = "";
	
	ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
	
	СхемаСКД = ОбработкаОбъект.ПолучитьМакет("ПараметрыШаблона");
	
	// Настройки
	КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
	КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаСКД));
	КомпоновщикНастроек.ЗагрузитьНастройки(СхемаСКД.НастройкиПоУмолчанию);
	
	Настройка = КомпоновщикНастроек.Настройки;
	
	// Устанавливаем строку шаблона
	ПолеСтрокаПоШаблону = Настройка.ПользовательскиеПоля.Элементы[0];
	
	Попытка
		ПолеСтрокаПоШаблону.УстановитьВыражения(ТекстШаблона, ТекстШаблона);
	Исключение
		Инфо = ИнформацияОбОшибке();
		Сообщить(КраткоеПредставлениеОшибки(Инфо), "ТекстШаблона");
		Возврат Результат;
	КонецПопытки;
		
	РезультатПодстановкиДанныхВШаблон = Новый ТаблицаЗначений;
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
		
	ПроцессорВывода.УстановитьОбъект(РезультатПодстановкиДанныхВШаблон);
				
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, Настройка,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, Новый Структура("ПараметрыШаблона", ДанныеЗаполнения));
	
	Попытка
		ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	Исключение
		Инфо = ИнформацияОбОшибке();
		Сообщить(КраткоеПредставлениеОшибки(Инфо), "ТекстШаблона");
		Возврат Результат;
	КонецПопытки;
	
	Если РезультатПодстановкиДанныхВШаблон.Количество() > 0 Тогда
		СтрокаПоШаблону = РезультатПодстановкиДанныхВШаблон[0]["ПользовательскиеПоляПоле1"];
	КонецЕсли; 
	
	Возврат СтрокаПоШаблону;
КонецФункции // ПолучитьСтрокуПоШаблону()

Для проверки работы использовался следующий текст шаблона:

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

Результаты работы показаны на скриншоте.

Обработка была протестирована на платформе 8.3.16.1296, но может работать и на платформе 8.2.

has been added to your cart:
Оформление заказа