Вывод условного оформления дерева значений или табличной части в эксель

09.02.24

Разработка - Работа с интерфейсом

Имеем табличную часть с условным оформлением или дерево значений. Каким способ сохранить в эксель без костылей?

Всем дня. Столкнулся в работе с просьбой клиента разрешить сохранять дерево значений в эксель.

Плевое дело, ведь так? Так и подумал:)   

 

Содержание статьи:

1. Введение

2. Типовые методы решения и их проблемы

3. Итоговый вариант решения

 

 Введение

 

Внешний отчет имеет условное оформление (цвета фонов, цвета текста и выделение в некоторых местах другим шрифтом). Необходимо сохранить текущую таблицу в эксель, при этом сохранив все форматирование.

 

 

 Типовые методы решения и их проблемы

 

Первым делом решил открыть доступ к типовой команде табличных частей "Вывести список". Сказано - сделано. 

 

 

Можно выбрать колонки, можно вывести выделенный фрагмент, спрятать подчиненные. Шикарно, пока не увидишь, что при таком выводе условное оформление пропадает :(

В грустных эмоциях начал копать интернет и ничего толкового не нашел. В статьях предлагали костыли по типу "сохранять в эксель" или "формировать сразу в эксель файл".

И если вариант "формировать сразу в эксель" точно не подходит, ибо человеку надо видеть данные (и из 20 раз сохранять всего один), то с "сохранять в эксель после" еще можно подумать. В реализации относительно ничего сложного, но нужно будет читать каждую ячейку и ее свойства и сохранять тоже самое в эксель, используя свойства экселя.

Минусы данного подхода:

- Нужен установленный эксель на компе, где формируют (опять таки, извечная проблема, не всегда в наличии)

- Сугубо мое мнение - костыль

- Если вдруг добавится новое условное оформление нужно дописывать выгрузку

- Надо сопоставить свойство 1С и экселя (натянуто, но все же) 

ps. Сопоставить свойства можно с помощью записи макросов. 

 

 Итоговый вариант решения

 

Немного погуляв вспомнил, что при сохранении отчета из СКД с установленным условным оформлением табличный документ сохраняет свое оформление. Проверил - действительно!

Итак, приступаем к реализации.

1. Формируем дерево значений в обработке

2. На основании дерева создаем схему СКД

3. Формируем отчет СКД

4. Выводим типовыми средствами

Дерево значений с установленным условным оформлением у нас есть. Выводим на форму команду для вывода дерева значений в форму. В функции формируем табличный документ и выкидываем в типовую форму (из нее можно будет сохранить, напечатать, скопировать фрагмент, при этом оформление останется).

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

 

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

	ПорядокКолонокМассивВыводим = СтрРазделить(ПорядокКолонокВыводим, ",", Ложь);
	
	Для каждого СтрокаМассива Из ПорядокКолонокМассивВыводим Цикл
		
		НоваяСтрока = НастройкиВидимостиКолонок.Добавить();
		НоваяСтрока.Имя 		= СтрокаМассива;
		
		//ЗАГОЛОВОК ПОЛУЧАЮ ИЗ ДЕРЕВА НА ФОРМЕ 
		ДеревоНаФормеКолонки 	= Элементы.ДеревоЗначенийДерево.ПодчиненныеЭлементы;
		ТекущаяКолонка 			= ДеревоНаФормеКолонки.Найти("ДеревоЗначенийДерево" + СтрокаМассива);
		НоваяСтрока.Заголовок 	= ?(ТекущаяКолонка = Неопределено, СтрокаМассива, ТекущаяКолонка.Заголовок);
	КонецЦикла;
	
	ИсточникиДанных = Новый Структура("ДанныеДерева", ДанныеДерева);
	СхемаКомпоновки = ПолучитьСхемуКомпоновкиПоДереву(ДанныеДерева, НастройкиВидимостиКолонок);
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, СхемаКомпоновки.НастройкиПоУмолчанию);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;	
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ИсточникиДанных);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ТабДокумент);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
	Возврат ТабДокумент;
	
КонецФункции

Т.к. в дереве есть служебные колонки с данными, которые скрыты в исходном отчете, также скрываю в выводимом отчете.

Дополнительно устанавливаю сортировку в нужном порядке (если обращаюсь Элементы.ИмяДерева) колонки в порядке А-Я. Возможно, просто затупил (если есть другой вариант, напишите, буду благодарен).

И сама функция создания схемы компоновки:

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

		КонецЦикла;
		
		//ВЫБРАННЫЕ ПОЛЯ 
		Для каждого ОформляемоеПоле Из ЭлементУсловногоОформления.Поля.Элементы Цикл
			
			НовоеПолеОформления = НовоеУсловноеОформление.Поля.Элементы.Добавить();
			
			НовоеПолеОформления.Использование 	= Истина;
			НовоеПолеОформления.Поле 			= Новый ПолеКомпоновкиДанных(СтрЗаменить(ОформляемоеПоле.Поле, "ДеревоЗначенийДерево", ""));
			
		КонецЦикла;
		
	КонецЦикла;

	Возврат СхемаКомпоновки; 
	
КонецФункции

На основании дерева значений создаем схему компоновки, передаем дерево значений во внешний набор данных, устанавливаем условное оформление (не учитывал, что могут быть группы условий в отборе).

ВАЖНО. Для вывода именно дерева значений необходимо сделать два служебных реквизита (ключ связи и ключ связи родителя - тип число). В данные поля записываем значение ПолучитьИндентификатор() + 1). 

Данный реквизит используется для связи строк по уровням (через наборы данных) в компоновке данных.  

Вроде все интуитивно просто :) А главное - клиент доволен.

 

См. также

Управление дашбордами

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    17192    23    4    

37

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    11679    776    elcoan    47    

108

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    10213    157    acces969    31    

120

Модель состояния для MVC

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    4209    kalyaka    4    

31

Условное оформление элементов форм в пользовательском режиме 1С (управление видимостью и доступностью элементов форм)

Работа с интерфейсом Платформа 1С v8.3 Платные (руб)

Подсистема условного оформления элементов форм (далее подсистема) предназначена для настройки оформления элементов форм (видимость, доступность, цвет фона, цвет текста и прочее) в пользовательском режиме 1С. Также подсистему возможно использовать для ограничения доступа к реквизитам формы для определенных пользователей (или групп пользователей).

6000 руб.

18.01.2022    9109    1    2    

6

Программный интерфейс для доработки форм

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Реализовал простой способ программного создания новых элементов, команд и реквизитов на форме.

25.11.2021    10016    AtamanovYS    19    

141
Оставьте свое сообщение