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

06.10.14

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

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

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

6000 руб.

16.01.2015    61789    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

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

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

5000 руб.

14.01.2016    54392    16    21    

42

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

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

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

2400 руб.

29.06.2020    16693    21    4    

35

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

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

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

27.12.2023    10729    750    elcoan    45    

106

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

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

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

2 стартмани

10.04.2023    9600    151    acces969    31    

118

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

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

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

1 стартмани

05.07.2022    3662    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12075    1    5    

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

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

ВосстановитьЗначение (RestoreValue)
Синтаксис:
ВосстановитьЗначение(<Имя>)
Параметры:
<Имя> (обязательный)
Тип: Строка.
Имя сохраненного значения.
Возвращаемое значение:
Тип: Произвольный.
Восстановленное значение. Если восстановить не удалось, возвращает Неопределено.
Описание:
Получает значение, сохраненное ранее с помощью метода СохранитьЗначение.
5. FractonKireyev 20.02.14 12:24 Сейчас в теме
ЗАЧЁТ!!!
Идея очень красивая. Спасибо автору. Буду использовать.
6. bayce 45 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 4896 21.02.14 20:45 Сейчас в теме
(9) EvgeniuXP, не работала с программным добавление реквизитов в списки управляемых форм.
Возможно, там эта проблема решена на системном уровне.
Если не решена, то не вижу проблем модифицировать код под синтаксис управляемых форм.
11. unoDosTres 26.02.14 17:08 Сейчас в теме
Спасибо автору за идею, буду пробовать
12. LexSeIch 210 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 657 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);
Оставьте свое сообщение