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

06.10.14

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Работа с интерфейсом Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    55436    17    23    

43

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Богатый редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    63824    44    59    

82

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

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

2400 руб.

29.06.2020    19717    28    6    

44

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

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

20.08.2024    21824    mrXoxot    44    

128

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

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    10934    smielka    37    

105

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

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

27.12.2023    17954    1225    elcoan    53    

125

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

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

3 стартмани

10.04.2023    12654    167    acces969    31    

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

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

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

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

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

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

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

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

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