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

Публикация № 259747

Разработка - Практика программирования

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Специальные предложения

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

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

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

Доступность:
Толстый клиент.
- и этим всё сказано.
10. ekaruk 5329 21.02.14 20:45 Сейчас в теме
(9) EvgeniuXP, не работала с программным добавление реквизитов в списки управляемых форм.
Возможно, там эта проблема решена на системном уровне.
Если не решена, то не вижу проблем модифицировать код под синтаксис управляемых форм.
11. unoDosTres 26.02.14 17:08 Сейчас в теме
Спасибо автору за идею, буду пробовать
12. LexSeIch 208 27.02.14 04:09 Сейчас в теме
Мир этому дому!
Безусловно полезная заметка. Плюс.
13. unknownN 20.03.14 13:59 Сейчас в теме
Как раз искал для себя подобное решение, спасибо.
14. djserega 253 05.04.14 16:41 Сейчас в теме
у некоторых колонок ширина "-1" (наверное автоматическая настройка ширины)
и после того как восстанавливаешь ширину "-1", то она превращается "1" и колонка получается очень узкая
20. cdromscsi 02.08.16 16:39 Сейчас в теме
(14) djserega, вот как я решил сию проблему:
Процедура ВосстановитьНастройкиКолонок(КоллекцияКолонок, ИмяНастройки) Экспорт
	
	НастройкиКолонок = ВосстановитьЗначение(ИмяНастройки);
	
	Если НастройкиКолонок <> Неопределено Тогда
		
		Для каждого СтрокаНастроек Из НастройкиКолонок Цикл
			ОбрабатываемаяКолонка = КоллекцияКолонок[СтрокаНастроек.ИмяКолонки];
			ТекущаяПозицияКолонки = КоллекцияКолонок.Индекс(ОбрабатываемаяКолонка);
			КоллекцияКолонок.Сдвинуть(ТекущаяПозицияКолонки,СтрокаНастроек.Позиция - ТекущаяПозицияКолонки);
			ОбрабатываемаяКолонка.Видимость = СтрокаНастроек.Видимость;
			//на тот случай, когда ширина колонки (-1)
			//т.е. автоматическая ширина
			Если СтрокаНастроек.Ширина < 0 Тогда
				Продолжить
			Иначе
				ОбрабатываемаяКолонка.Ширина = СтрокаНастроек.Ширина;
			КонецЕсли;
		КонецЦикла; 
		
	КонецЕсли; 

КонецПроцедуры
Показать
15. ASV085 25 21.10.14 20:44 Сейчас в теме
Взял на заметку спасибо!
17. Dnki 4 26.11.14 09:48 Сейчас в теме
Прелестно! Давно задумывался над проблемой, но никак не собрался с мыслями.
У меня только дополнение к командам Сохранить/Восстановить:
СохранитьНастройкиКолонок(ЭтаФорма.ЭлементыФормы.Список.Колонки, "УникальноеИмяНастройки"...

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

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

А то иначе если колонку удалить (прекратить добавлять) то форма перестаёт открываться и выдает ошибку.
19. morber 11.07.16 08:50 Сейчас в теме
21. Shaldryn 09.06.17 16:25 Сейчас в теме
Хорошая статья, очень помогла!
А не подскажите, не делали похожий функционал, но только с сохранением высоты табличных полей в обработке. Пример, тот же ПодборНоменклатуры в УТ 10.3, чтобы можно было сохранять высоту остатков товаров и справочника номенклатуры?

передаю высоту, но он при открытии не восстанавливает высоту. То есть для ЭлементыФормы.СправочникНоменклатуры.Высота присваивается сохраненная, а для ЭлементыФормы.ОстаткиТоваров.Высота остается прежней....Может он не редактируется или же надо еще какой то элемент передавать в настройки?
22. klmsoft 14 01.08.19 09:30 Сейчас в теме
Если необходимо сохранять настройки всех колонок.
То заполним строку всеми именами колонок
Например так
Для Каждого Колонка Из ЭлементыФормы.Товары.Колонки Цикл
			СписокСохраняемыхКолонок = СписокСохраняемыхКолонок + Колонка.Имя + ",";
		КонецЦикла;	
		СписокСохраняемыхКолонок = Лев(СписокСохраняемыхКолонок,СтрДлина(СписокСохраняемыхКолонок)-1);
Оставьте свое сообщение

См. также

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions Промо

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    4287    comol    22