gifts2017

Сохранение ширины колонок в отчете СКД

Опубликовал Михаил Ефименко (942644) в раздел Программирование - Практика программирования

При формировании отчета СКД бывает так, что отчет не умещается на экране, и приходится изменять ширину колонок. К сожалению, при формировании отчета ширина колонок не сохраняется и поправлять ширину колонок нужно после каждого формирования отчета. Можно настроить условное оформление, как обсуждается тут: http://forum.infostart.ru/forum26/topic112590/. Этот вариант не устроил, реализована возможность сохранять ширины колонок в настройках вариантов отчетов

Использовали данный функционал в универсальном отчете СКД (УниверсальныйОтчетСхемСКД)

В модуле формы добавлены две функции:

УложитьНастройкиВСоответствие(Форма)

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

ИзменитьКолонкиТППоНастройкам(Форма, СтруктураНастроек)

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

В процедуре Сохранения настройки добавили код:

СоответствиеНастроек = УложитьНастройкиВСоответствие(ЭтаФорма); 
НастройкиКолонок = Новый ХранилищеЗначения(СоответствиеНастроек, Новый СжатиеДанных(9)); 
СтруктураНастройки.Вставить("ДополнительныеПараметры", НастройкиКолонок);

Добавили код в процедуре Восстановления настроек:

Если мТекущаяНастройка.Свойство("ДополнительныеПараметры") И ТипЗнч(мТекущаяНастройка.ДополнительныеПараметры) = Тип("ХранилищеЗначения") Тогда
			ИзменитьКолонкиТППоНастройкам(ЭтаФорма, мТекущаяНастройка.ДополнительныеПараметры.Получить());
КонецЕсли;

В процедуре ПриОткрытии():

ИзменитьКолонкиТППоНастройкам(ЭтаФорма, мТекущаяНастройка.ДополнительныеПараметры.Получить());

Соответственно, настройка колонок после формирования отчета (отделено комментарием):

Процедура СформироватьОтчет(Кнопка)
	ЭтотОбъект.СкомпоноватьРезультат(ЭлементыФормы.Результат,ДанныеРасшифровки);
	СгенерироватьКнопкиУправленияГруппировкой();
	// 160915
	Если мТекущаяНастройка <> Неопределено Тогда
		Если мТекущаяНастройка.Свойство("ДополнительныеПараметры") И ТипЗнч(мТекущаяНастройка.ДополнительныеПараметры) = Тип("ХранилищеЗначения") Тогда
			ИзменитьКолонкиТППоНастройкам(ЭтаФорма, мТекущаяНастройка.ДополнительныеПараметры.Получить());
		КонецЕсли;		
	КонецЕсли;
	//! 160915
КонецПроцедуры

 

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Александр Крынецкий (echo77) 17.09.15 19:11
Я использую условное оформление без условия чтобы зафиксировать ширину колонок
942644; rozer; chmv; dj_serega; u_n_k_n_o_w_n; Светлый ум; +6 Ответить
2. sanek sanek_gk (sanek_gk) 22.09.15 10:00
Полезность данной публикации «крайне мала»(стремится к 0). Для нормального форматирования ширины колонок и прочего в 1с предлагается использовать компоновку данных, в которой настраивается ширина любого поля, на любом уровне, как пожелаешь, при том не имеет значения будут ли после поля изменены (добавлены-убраны новые, изменена группировка вывода и прочее ). Условное оформление сохранится так, как настроено в варианте, и если пользователю нужно это менять — просто дать ему возможность изменять условное оформление в пользовательских полях. Настройки автоматом сохранятся для пользователя.
3. Михаил Ефименко (942644) 22.09.15 11:42
Добрый день !
Спасибо за Ваш комментрий. Для нас польза есть в том, что пользователю не нужно заходить в настройки СКД, а он может настроить ширину колонок мышью, визуально сразу оценивая результат своей настройки.
4. Иван Коротеев (kiv1c) 23.09.15 10:30
За названия переменных Щ, ыы, ы - начинаешь понимать почему нас, одинэсников, так не любят(
5. Максим *** (premier) 26.09.15 07:53
(4) kiv1c, полностью согласен. Не раз уже ставил "-" за оформление кода в публикациях. Автору я бы посоветовал почитать рекомендации компании "1С" по оформлению кода (есть на на дисках ИТС).
Не стоит, как мне кажется, экономить время на написание переменных со смысловым значением, ведь приведённый выше код сам автор, возможно, будет не без труда читать через некоторое время.
Что уж и говорить о тех, кто этот код дорабатывать будет... После нас - хоть потоп?
6. Михаил Ефименко (942644) 28.09.15 13:39
(5) premier,
Добрый день, уважаемые коллеги !
Спасибо за Ваши комментарии.
Интересно, как Вы обзываете переменные цикла. Воспользовался Вашим советом, пересмотрел Стандарты разработки
Здесь не запрещается делать переменные цикла из одной буквы
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа