---
title: Представление отборов форматированной строкой
slug: общие-управляемые-формы/представление-отборов-форматированной-строкой
---

```bsl

// Функция - Представление отборов форматированной строкой
//
// Параметры:
//  ТаблицаОтборов			 - ТаблицаЗначений	 - Таблица отборов для формирования представлений. Колонки
//		* Имя - Строка - Имя отбора. Должно отвечать требованиям к идентификаторов 1С
//		* Значение - Произвольный - Значение установленного отбора
//		* Представление - Строка - Представление, которое будет выведено в итоговую строку. Если не заполнено, будет сформировано автоматически
//								   по имени
//
//  ВыводитьНезаполненные	 - Булево - Истина, если нужно выводить отборы, значения которых не заполнены. По умолчанию Ложь
// 
// Возвращаемое значение:
//  ФорматированнаяСтрока - Представление установленных отборов вида "УстановленыОтборы: ИмяОтбора: ЗначениеОтбора; ..."
//
Функция ПредставлениеОтборовФорматированнойСтрокой(ТаблицаОтборов, ВыводитьНезаполненные = Ложь) Экспорт

	ПараметрыОформления = ПараметрыФорматированнойСтрокиПредставленияОтборов();
	
	ОписанияОтборов = Новый Массив;
	
	Для Каждого Строка Из ТаблицаОтборов Цикл
	    
	    ИмяОтбора = Строка.Имя;
	    ЗначениеОтбора = Строка.Значение;
		ПредставлениеОтбора = ?(ЗначениеЗаполнено(Строка.Представление), 
			Строка.Представление,
			НатуральноеПредставлениеСтрокиCamelCase(ИмяОтбора));
			
		Если ВыводитьНезаполненные Тогда
			ДобавитьОписаниеЭлементаОтбораВКоллекцию(ОписанияОтборов, ПредставлениеОтбора, ЗначениеОтбора, ПараметрыОформления);	
		Иначе
			Если ТипЗнч(ЗначениеОтбора) = Тип("Булево") И Не ЗначениеОтбора Тогда
				Продолжить;
			КонецЕсли;
			
			Если ЗначениеЗаполнено(ЗначениеОтбора) Тогда

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

КонецФункции

Процедура ДобавитьОписаниеЭлементаОтбораВКоллекцию(Описания, ПредставлениеЭлемента, ЗначениеЭлемента, ПараметрыОформления)

	ЦветТекстаЗаголовкаПоля = ПараметрыОформления.ЦветТекстаЗаголовкаПоля;
	ШрифтЗаголовкаПоля = ПараметрыОформления.ШрифтЗаголовкаПоля;
	ЦветТекстаЗначения = ПараметрыОформления.ЦветТекстаЗначения;
	ШрифтЗначения = ПараметрыОформления.ШрифтЗначения;
	
	Описания.Добавить(Новый ФорматированнаяСтрока(СтрШаблон("%1: ", ПредставлениеЭлемента), ШрифтЗаголовкаПоля , ЦветТекстаЗаголовкаПоля));
	
	Если ЗначениеЗаполнено(ЗначениеЭлемента) Тогда
		
		Если ТипЗнч(ЗначениеЭлемента) = Тип("Массив") 
			Или ТипЗнч(ЗначениеЭлемента) = Тип("ФиксированныйМассив") Тогда
			
			ПредставленияЭлементов = Новый Массив;
			
			Для Каждого ТекЭлемент Из ЗначениеЭлемента Цикл
				
				Если ЗначениеЗаполнено(ТекЭлемент) Тогда 
					ПредставленияЭлементов.Добавить(Строка(ТекЭлемент));
				Иначе
					ПредставленияЭлементов.Добавить(НСтр("ru = '<Пустое значение>'"));
				КонецЕсли;
			КонецЦикла;
			ТекстЗначения = СтрСоединить(ПредставленияЭлементов, "; ");
			
		ИначеЕсли ТипЗнч(ЗначениеЭлемента) = Тип("Дата") Тогда
			ТекстЗначения = Формат(ЗначениеЭлемента, "ДФ='ММММ гггг ""г.""'");
		Иначе
			ТекстЗначения = Строка(ЗначениеЭлемента);
		КонецЕсли;
	Иначе
		ТекстЗначения = НСтр("ru = '<Пустое значение>'");
	КонецЕсли;
	
	Описания.Добавить(Новый ФорматированнаяСтрока(Строка(ТекстЗначения), ШрифтЗначения , ЦветТекстаЗначения));
	
	Описания.Добавить("; ");
	
КонецПроцедуры

Функция ПараметрыФорматированнойСтрокиПредставленияОтборов()

	ПараметрыПредставления = Новый Структура;
	ПараметрыПредставления.Вставить("ЦветТекстаЗаголовкаДекорации", Новый Цвет(0,150,70));
	ПараметрыПредставления.Вставить("ШрифтЗаголовкаДекорации", Новый Шрифт(, , Истина));
	ПараметрыПредставления.Вставить("ЦветТекстаЗаголовкаПоля", Новый Цвет(110, 110, 110));
	ПараметрыПредставления.Вставить("ШрифтЗаголовкаПоля", Новый Шрифт());
	ПараметрыПредставления.Вставить("ЦветТекстаЗначения", Новый Цвет(80, 40, 0));
	ПараметрыПредставления.Вставить("ШрифтЗначения",  Новый Шрифт(, , Истина));
	ПараметрыПредставления.Вставить("ЗаголовокДекорации", "Установлены отборы");
	ПараметрыПредставления.Вставить("ПредставлениеПустыхОтборов", "Отборы не установлены");
	
	Возврат ПараметрыПредставления;

КонецФункции

// Функция - Преобразует CamelCase в обычный текст.
//
// Параметры:
//  СтрокаCamelCase	- Строка - строка в стиле CamelCase. Например ВДополнительномПодменю, ВводПоСтроке и т.д.
// 
// Возвращаемое значение:
//	Строка	-	преобразованный CamelCase в обычный текст. Например "HTTPСервис" => "HTTP сервис"
//
Функция НатуральноеПредставлениеСтрокиCamelCase(Знач СтрокаCamelCase) Экспорт
	
    СтрокаCamelCase = СтрЗаменить(СтрокаCamelCase, "_", "");
    Результат = "";
    ПредыдущийСимвол = "";
    КоличествоЗаглавныхСимволов = 0;

    Для Сч = 1 По СтрДлина(СтрокаCamelCase) Цикл
        
        Символ = Сред(СтрокаCamelCase, Сч, 1);
        ЭтоЗаглавная = (Символ = ВРег(Символ));
        
		Если НЕ ЭтоЗаглавная И КоличествоЗаглавныхСимволов >= 2 Тогда
			
            Результат = Лев(Результат, СтрДлина(Результат) - 1) + " " + Прав(Результат, 1);
			
        ИначеЕсли ЭтоЗаглавная И КоличествоЗаглавныхСимволов = 0 И ПредыдущийСимвол <> "" Тогда
            Результат = Результат + " ";
        КонецЕсли;
        
        Результат = Результат + Символ;
        
        Если ЭтоЗаглавная Тогда
            КоличествоЗаглавныхСимволов = КоличествоЗаглавныхСимволов + 1;
        Иначе
            КоличествоЗаглавныхСимволов = 0;
        КонецЕсли;
        
        ПредыдущийСимвол = Символ;
        
    КонецЦикла;
    
    Слова = СтрРазделить(Результат, " ");
    
    Для Индекс = 1 По Слова.ВГраница() Цикл
        
        Слово = Слова[Индекс];
        ЭтоАббревиатура = (Слово = ВРег(Слово));
        
        Если СтрДлина(Слово) = 1 Или Не ЭтоАббревиатура Тогда // это точно не аббревиатура
            Слова[Индекс] = НРег(Слово);
		КонецЕсли;
		
    КонецЦикла;
    
    Возврат СокрЛП(СтрСоединить(Слова, " "));
    
КонецФункции


```