gifts2017

Сохранение настроек колонок, добавленных на форму программно

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

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

При доработке конфигураций часто необходимо добавлять в формы колонки. Как в формы списка, так и в формы элементов табличные части документов и справочников.

При добавлении в конфигураторе такие колонки ничем не отличаются от типовых. 

Проблемы возникают, если конфигурацию планируют обновлять в будущем и нежелательно вмешиваться в формы конфигурации. В этом случае колонки обычно добавлятся программно кодом в моду формы вида

ЭлементыФормы.Список.Колонки.Вставить(1,"НоваяКолонка")

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

Колонка всегда появляется в указанном программистом месте, с указанной программистом видимостью и шириной. Для типовых колонок все настройки сохраняются, для новых - нет.

Проблема в том, что на момент создания формы колонок еще нет. Соответственно, типовые механизмы платформы по сохранению настроек для новых колонок не работают.

Наших пользователей, к сожалению, такой вариант не устроил, так как часть колонок нужны лишь нескольким пользователям, а не всем. Причем нужны в начале списка, а не где-то в хвосте.

Добавлять колонки в форму нам все-таки не хотелось, так что пришлось продублировать для нетиповых колонок сохранение настроек.

В общий модуль добавили две процедуры, одна из которых при закрытии формы сохраняет настройки пользователя, вторая восстанавливает сохраненные настройки при открытии формы.

Теперь для сохранения настроек колонок в любом табличной части достаточно вызвать процедуру общего модуля.

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    ЭлементыФормы.Список.Колонки.Вставить(1,"НоваяКолонка1");
    ЭлементыФормы.Список.Колонки.Вставить(2,"НоваяКолонка2");
    ЭлементыФормы.Список.Колонки.Вставить(3,"НоваяКолонка3");

    //Вызываем функцию, которая восстановит для добавленных нами программно колонок сделанные пользователем в прошлом сеансе настройки;
    ДополнительныйФункционал.ВосстановитьНастройкиКолонок(ЭтаФорма.ЭлементыФормы.Список.Колонки,"УникальноеИмяНастройки");
КонецПроцедуры

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    //Сохраним настройки пользователя для колонок НоваяКолонка1,НоваяКолонка2,НоваяКолонка3;
    ДополнительныйФункционал.СохранитьНастройкиКолонок(ЭтаФорма.ЭлементыФормы.Список.Колонки,"УникальноеИмяНастройки","НоваяКолонка1,НоваяКолонка2,НоваяКолонка3");
КонецПроцедуры

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

Процедура СохранитьНастройкиКолонок(КоллекцияКолонок,ИмяНастройки,СписокСохраняемыхКолонок) Экспорт

    НастройкиКолонок = Новый ТаблицаЗначений;
    НастройкиКолонок.Колонки.Добавить("ИмяКолонки");
    НастройкиКолонок.Колонки.Добавить("Позиция");
    НастройкиКолонок.Колонки.Добавить("Видимость");
    НастройкиКолонок.Колонки.Добавить("Ширина");
	
    СтруктураКолонок = Новый Структура(СписокСохраняемыхКолонок);
    Для каждого СохраняемаяКолонка Из СтруктураКолонок Цикл
        ИмяКолонки = СохраняемаяКолонка.Ключ;
	ОбрабатываемаяКолонка = КоллекцияКолонок[ИмяКолонки];
	СтрокаНастройки = НастройкиКолонок.Добавить();
	СтрокаНастройки.ИмяКолонки = ИмяКолонки;
	СтрокаНастройки.Позиция = КоллекцияКолонок.Индекс(ОбрабатываемаяКолонка);
	СтрокаНастройки.Видимость = ОбрабатываемаяКолонка.Видимость;
	СтрокаНастройки.Ширина = ОбрабатываемаяКолонка.Ширина;
    КонецЦикла; 
	
    НастройкиКолонок.Сортировать("Позиция");
	
    СохранитьЗначение(ИмяНастройки,НастройкиКолонок);

КонецПроцедуры

Процедура ВосстановитьНастройкиКолонок(КоллекцияКолонок,ИмяНастройки) Экспорт
	
    НастройкиКолонок = ВосстановитьЗначение(ИмяНастройки);
    Если НастройкиКолонок<>Неопределено Тогда
        Для каждого СтрокаНастроек Из НастройкиКолонок Цикл
	    ОбрабатываемаяКолонка = КоллекцияКолонок[СтрокаНастроек.ИмяКолонки];
	    ТекущаяПозицияКолонки = КоллекцияКолонок.Индекс(ОбрабатываемаяКолонка);
	    КоллекцияКолонок.Сдвинуть(ТекущаяПозицияКолонки,СтрокаНастроек.Позиция-ТекущаяПозицияКолонки);
	    ОбрабатываемаяКолонка.Видимость = СтрокаНастроек.Видимость;
	    ОбрабатываемаяКолонка.Ширина = СтрокаНастроек.Ширина;
	КонецЦикла; 
    КонецЕсли; 

КонецПроцедуры

Возможно, кому-то будет полезно.

См. также

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

Комментарии

1. script Мальчинко (script) 19.02.14 01:54
Уже пару раз с такой необходимостью столнулся. Спасибо. Пригодится однозначно.
2. Яков Коган (Yashazz) 19.02.14 11:35
Делаю такое во всех своих конфах уже очень давно. Действительно, часто бывает нужно.
3. Андрей Ким (NeronKrasu) 20.02.14 08:25
СохранитьЗначение(ИмяНастройки,НастройкиКолонок);
НастройкиКолонок = ВосстановитьЗначение(ИмяНастройки);
Это откуда берем?
Прикрепленные файлы:
4. Евгения Карук (ekaruk) 20.02.14 11:26
(3) NeronKrasu,
Стандартное сохранение средствами платформы.
Для каждого пользователя сохраняем под уникальным именем настройки конкретной формы.

СохранитьЗначение (SaveValue)
Синтаксис:
СохранитьЗначение(<Имя>, <Значение>)
Параметры:
<Имя> (обязательный)
Тип: Строка.
Имя, с которым сохраняется значение, используется для идентификации сохраняемых значений.
<Значение> (обязательный)
Тип: Произвольный.
Сохраняемое значение.
Описание:
Сохраняет значение для использования не только в текущем, но и в последующих сеансах работы с программой. Значение хранится индивидуально для каждой пары информационная база - пользователь. Например, можно сохранять значения по умолчанию, используемые данным пользователем.

ВосстановитьЗначение (RestoreValue)
Синтаксис:
ВосстановитьЗначение(<Имя>)
Параметры:
<Имя> (обязательный)
Тип: Строка.
Имя сохраненного значения.
Возвращаемое значение:
Тип: Произвольный.
Восстановленное значение. Если восстановить не удалось, возвращает Неопределено.
Описание:
Получает значение, сохраненное ранее с помощью метода СохранитьЗначение.
5. Андрей Киреев (FractonKireyev) 20.02.14 12:24
ЗАЧЁТ!!!
Идея очень красивая. Спасибо автору. Буду использовать.
6. Dima Dima (bayce) 20.02.14 20:20
поставил +.
Интересное решение.
7. Андрей Краснокутский (Andry.Boris) 20.02.14 21:46
Просто и доступно, однозначно +
8. Владимир Клименко (KliMich) 21.02.14 00:33
Спасибо! Описано доступно и всерьез!
9. EvgeniuXP EvgeniuXP (EvgeniuXP) 21.02.14 19:14
но для кого-то и облом:

Доступность:
Толстый клиент.
- и этим всё сказано.
10. Евгения Карук (ekaruk) 21.02.14 20:45
(9) EvgeniuXP, не работала с программным добавление реквизитов в списки управляемых форм.
Возможно, там эта проблема решена на системном уровне.
Если не решена, то не вижу проблем модифицировать код под синтаксис управляемых форм.
11. uno dos (unoDosTres) 26.02.14 17:08
Спасибо автору за идею, буду пробовать
12. Сергей Маслов (LexSeIch) 27.02.14 04:09
Мир этому дому!
Безусловно полезная заметка. Плюс.
13. unknown unknown (unknownN) 20.03.14 13:59
Как раз искал для себя подобное решение, спасибо.
14. Сергей Ломоносов (djserega) 05.04.14 16:41
у некоторых колонок ширина "-1" (наверное автоматическая настройка ширины)
и после того как восстанавливаешь ширину "-1", то она превращается "1" и колонка получается очень узкая
15. Серж а (ASV085) 21.10.14 20:44
Взял на заметку спасибо!
17. Игорь Дайнеко (Dnki) 26.11.14 09:48
Прелестно! Давно задумывался над проблемой, но никак не собрался с мыслями.
У меня только дополнение к командам Сохранить/Восстановить:
СохранитьНастройкиКолонок(ЭтаФорма.ЭлементыФормы.Список.Колонки, "УникальноеИмяНастройки"...

А именно к "УникальноеИмяНастройки". По опыту знаю, фантазия программиста бедновата выдумыванием названий.
А если вставить так:
СохранитьНастройкиКолонок(ЭтаФорма.ЭлементыФормы.Список.Колонки, Строка(СправочникСписок)...
где СправочникСписок - основной реквизит формы
тогда можно 1) копировать по другим спр-кам 2) четкая гарантия, что сохраняет и восстанавливает под одним именем.
18. Виталий (nafa) 03.02.15 02:32
Все хорошо, но в процедуре восстановления настрек надо добавить проверку наличия колонки:
Процедура ВосстановитьНастройкиКолонок(КоллекцияКолонок,ИмяНастройки) Экспорт
	
    НастройкиКолонок = ВосстановитьЗначение(ИмяНастройки);
    Если НастройкиКолонок<>Неопределено Тогда
		Для каждого СтрокаНастроек Из НастройкиКолонок Цикл
		    ОбрабатываемаяКолонка = КоллекцияКолонок.Найти(СтрокаНастроек.ИмяКолонки);
			Если ОбрабатываемаяКолонка <> Неопределено Тогда
			    ТекущаяПозицияКолонки = КоллекцияКолонок.Индекс(ОбрабатываемаяКолонка);
			    КоллекцияКолонок.Сдвинуть(ТекущаяПозицияКолонки,СтрокаНастроек.Позиция-ТекущаяПозицияКолонки);
			    ОбрабатываемаяКолонка.Видимость = СтрокаНастроек.Видимость;
			    ОбрабатываемаяКолонка.Ширина = СтрокаНастроек.Ширина;
			КонецЕсли;
		КонецЦикла; 
    КонецЕсли; 

КонецПроцедуры
...Показать Скрыть

А то иначе если колонку удалить (прекратить добавлять) то форма перестаёт открываться и выдает ошибку.
19. арт мор (morber) 11.07.16 08:50
20. Pavel Kuts (cdromscsi) 02.08.16 16:39
(14) djserega, вот как я решил сию проблему:
Процедура ВосстановитьНастройкиКолонок(КоллекцияКолонок, ИмяНастройки) Экспорт
	
	НастройкиКолонок = ВосстановитьЗначение(ИмяНастройки);
	
	Если НастройкиКолонок <> Неопределено Тогда
		
		Для каждого СтрокаНастроек Из НастройкиКолонок Цикл
			ОбрабатываемаяКолонка = КоллекцияКолонок[СтрокаНастроек.ИмяКолонки];
			ТекущаяПозицияКолонки = КоллекцияКолонок.Индекс(ОбрабатываемаяКолонка);
			КоллекцияКолонок.Сдвинуть(ТекущаяПозицияКолонки,СтрокаНастроек.Позиция - ТекущаяПозицияКолонки);
			ОбрабатываемаяКолонка.Видимость = СтрокаНастроек.Видимость;
			//на тот случай, когда ширина колонки (-1)
			//т.е. автоматическая ширина
			Если СтрокаНастроек.Ширина < 0 Тогда
				Продолжить
			Иначе
				ОбрабатываемаяКолонка.Ширина = СтрокаНастроек.Ширина;
			КонецЕсли;
		КонецЦикла; 
		
	КонецЕсли; 

КонецПроцедуры
...Показать Скрыть
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа