Изменить внешний вид обычных форм "на лету"? Сделано!

04.12.15

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ИзменениеВнешнегоВидаОбычныхФорм
.cf 32,04Kb
2
2 Скачать (1 SM) Купить за 1 850 руб.

1. Что понадобится

Релиз платформы 8.2 и выше

Возможность изменять конфигурацию

Немного желания Wink

2. "Поехали!"


Условимся, что форму, внешний вид которой хотим настроить, будем называть АРМ, а форму, в которой будем делать настройки, - ФормаНастроек


2.1. Для начала создадим непериодический, независимый регистр сведений.  Должно получиться следующее

Регистр сведений 

2.2. Создадим общую форму - ФормаНастроек. Поместим на нее ТабличноеПоле, укажем ТипЗначения - ТаблицаЗначений, добавим колонки в количестве, равном сумме измерений только что созданного РС + количество ресурсов, т.е. 5. Тип значений колонок установим аналогично измерениям, кроме колонки, которая соответствует ресурсу - у нее выберим составной тип данных - Булево, Цвет, Шрифт. Также добавим командую панель и свяжем ее с созданной Таблицой значений, не забыв про галочку Автозаполнение. Также настроим элементы управления колонок, опять же не забыв снять галочку РедактированиеТекста в колонках ЭлементФормы и ИмяСвойства.

 Общая форма

2.3. Добавим в любую форму конфигурации место вызова нашей ФормыНастроеек.  На всякий случай код

Форма = ПолучитьОбщуюФорму(<ИмяОбщейФормы>, ЭтаФорма);
Форма.ОткрытьМодально();

2.4. В процедуре ПередОткрытием ФормыНастроек сформируем список элементов, для которых будет возможность редактирования внешнего вида. Список может быть произвольным, в моем случае настраивать можно Табличные поля и Командные панели

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

2.5. В процедуру обработчика ПриИзменении элемента управления колонки  ЭлементФормы поместим следующий код

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

где Процедура ЗаполнитьСписокВыбора имеет следующий код. В зависимости от выбранного значения в колонке ЭлементФормы - СписокВыбора колонки ИмяСвойства - может быть различным. Оговорюсь, что в моем варианте задействовано 2 типа элемента - ТабПоле и КоманднаяПанель.

Процедура ЗаполнитьСписокВыбора(СтрокаТабличногоПоля)
	
	СтрокаТабличногоПоля.Пользователь   = ПараметрыСеанса.ТекущийПользователь;
	СтрокаТабличногоПоля.РабочееМесто   = Строка(ЭтаФорма.ВладелецФормы.ЭтотОбъект);
	ЭлементФормыВладельца = ЭтаФорма.ВладелецФормы.ЭлементыФормы[СтрокаТабличногоПоля.ЭлементФормы];
	СписокВыбора = ЭлементыФормы.ТаблицаНастроек.Колонки.ИмяСвойства.ЭлементУправления.СписокВыбора;
	СписокВыбора.Очистить();
	
	Если ТипЗнч(ЭлементФормыВладельца) = Тип("ТабличноеПоле") Тогда
		СписокВыбора.Добавить("ЧередованиеЦветовСтрок");
		СписокВыбора.Добавить("ЦветФонаПоля");
		СписокВыбора.Добавить("ЦветТекстаПоля");
	Иначе
		СписокВыбора.Добавить("ЦветФона");
		СписокВыбора.Добавить("ЦветФонаКнопки");
		СписокВыбора.Добавить("ЦветТекстаКнопки");
	КонецЕсли; 
	СписокВыбора.Добавить("Шрифт");

КонецПроцедуры // ЗаполнитьСписокВыбора()

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

	НаборЗаписей = РегистрыСведений.НастройкиРабочихМест.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Пользователь.Значение = ПараметрыСеанса.ТекущийПользователь;
	НаборЗаписей.Отбор.Пользователь.Использование = Истина;
	НаборЗаписей.Отбор.РабочееМесто.Значение = Строка(ЭтаФорма.ВладелецФормы.ЭтотОбъект);
	НаборЗаписей.Отбор.Пользователь.Использование = Истина;	
	НаборЗаписей.Прочитать();
	НаборЗаписей.Очистить();
	Для каждого СтрНастройки Из ТаблицаНастроек Цикл
		СтрНабораЗаписей = НаборЗаписей.Добавить();
		ЗаполнитьЗначенияСвойств(СтрНабораЗаписей, СтрНастройки);
		СтрНабораЗаписей.Значение = Новый ХранилищеЗначения(СтрНастройки.Значение);
	КонецЦикла; 
	НаборЗаписей.Записать();

Немного поясню (знаю, что многим и так понятно, но есть и те, которые только начинают). Создаем набор записей созданного нами регистра сведений, ищем все записи, касающиеся текущего пользователя и АРМ, которую настраиваем в данный момент и затираем их. Далее в цикле обходим ТаблицуЗначений, добавляя ее строки в набор записей. В конце все записываем и закрываем ФормуНастроек.

2.7. После сохранения записей в РС отладчик вернет нас в модуль формы, из которой открывали ФормуНастроек. Теперь необходимо как то обработать результат настроек. Для этого в модуле формы АРМ поместим следующую процедуру и добавим ее вызов сразу после Форма.ОткрытьМодально()

Процедура ЗагрузитьНастройки()
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| НастройкиРабочихМест.Пользователь,
| НастройкиРабочихМест.РабочееМесто,
| НастройкиРабочихМест.ЭлементФормы,
| НастройкиРабочихМест.ИмяСвойства,
| НастройкиРабочихМест.Значение
|ИЗ
| РегистрСведений.НастройкиРабочихМест КАК НастройкиРабочихМест
|ГДЕ
| НастройкиРабочихМест.Пользователь = &Пользователь
| И НастройкиРабочихМест.РабочееМесто = &РабочееМесто";

Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);
Запрос.УстановитьПараметр("РабочееМесто", Строка(ЭтаФорма.ЭтотОбъект));

РезультатЗапроса       = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл 
Попытка
ЭлементыФормы[ВыборкаДетальныеЗаписи.ЭлементФормы][ВыборкаДетальныеЗаписи.ИмяСвойства] = ВыборкаДетальныеЗаписи.Значение.Получить();
Исключение
Сообщить("Для свойства """ + ВыборкаДетальныеЗаписи.ИмяСвойства + """ элемента формы """ + ВыборкаДетальныеЗаписи.ЭлементФормы + """ не верно выбран тип данных!"); 
КонецПопытки;
КонецЦикла;
ЭтаФорма.Обновить();
КонецПроцедуры // ЗагрузитьНастройки()

Теперь после закрытия ФормыНастроек - в форме АРМ  сразу же будут видны результаты наших манипуляций с настройками.


2.8 Все бы хорошо, но осталась еще пара моментов. Хотелось бы, чтобы при открытии АРМ - пользователь сразу видел привычный ему фон списка документа, размер текста на кнопках и т.д. Для этого вызовем процедуру ЗагрузитьНастройки() в процедуре ПриОткрытии формы АРМ. Также и при открытии ФормыНастроек пользователь видел, какие настройки у него уже установлены. Для этого в процедуру ПередОткрытием ФормыНастроек поместим вызов следующей процедуры

 

Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	НастройкиРабочихМест.Пользователь,
		|	НастройкиРабочихМест.РабочееМесто,
		|	НастройкиРабочихМест.ЭлементФормы,
		|	НастройкиРабочихМест.ИмяСвойства,
		|	НастройкиРабочихМест.Значение
		|ИЗ
		|	РегистрСведений.НастройкиРабочихМест КАК НастройкиРабочихМест
		|ГДЕ
		|	НастройкиРабочихМест.Пользователь = &Пользователь
		|	И НастройкиРабочихМест.РабочееМесто = &РабочееМесто";
	
	Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);
	Запрос.УстановитьПараметр("РабочееМесто", Строка(ЭтаФорма.ВладелецФормы.ЭтотОбъект));
	
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл 
		СтрНастроек = ТаблицаНастроек.Добавить();
		ЗаполнитьЗначенияСвойств(СтрНастроек, ВыборкаДетальныеЗаписи);
		СтрНастроек.Значение = ВыборкаДетальныеЗаписи.Значение.Получить();
	КонецЦикла;

Ну, и напоследок. Теперь при октрытии ФормыНастроек видны уже сделанные настройки, но вспомним, что СписокВыбора элемента управления колонки ИмяСвойства у нас до этого заполнялся только при изменении значения в колонке ЭлементУправления, т.е. если попробовать выбрать что либо сразу после октрытия формы - список выбора будет пустой. Поэтому поместим следующий код в событии ПриАктивизацииСтроки элемента ФормыНастроек -  ТабличноеПоле  

 

Если ЭлементыФормы.ТаблицаНастроек.ТекущаяСтрока <> Неопределено И ЭлементыФормы.ТаблицаНастроек.ТекущаяСтрока.ЭлементФормы <> Неопределено Тогда
		ЗаполнитьСписокВыбора(ЭлементыФормы.ТаблицаНастроек.ТекущаяСтрока)
КонецЕсли;

Теперь точно все готово.  Так выглядит результат

Результат

UPD 04.12.15: выложил простенькую конфу, с поправками на формы списков

Оформление обычных форм "на лету"

См. также

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

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

6000 руб.

16.01.2015    63461    44    59    

82

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

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

2400 руб.

29.06.2020    19288    27    6    

42

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

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

1500 руб.

06.10.2020    10586    7    7    

11

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

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

20.08.2024    19453    mrXoxot    44    

126

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

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

27.05.2024    9168    smielka    37    

103

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

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

27.12.2023    17180    1191    elcoan    50    

123

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

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

2 стартмани

10.04.2023    12304    165    acces969    31    

124
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. webester 26 20.11.15 15:22 Сейчас в теме
Вы несомненно молодец. Делаете интересное дело. Я вам завидую. У меня список того, что надо сделать в 1С расписан на полгода вперед и продолжает расти а у вас:
Как-то раз очередная группа пользователей захотела видеть свои АРМ "в своем свете". Каждый хотел свой размер шрифта, его тип, цвет и прочую ерундистику

Вспоминается
- Доктор, когда я кончиком языка дотрагиваюсь до комочка фольги, в котором до этого пекли картошку, у меня покалывает за ухом. Что это значит?
- Что у Вас слишком много свободного времени!
Kirill_K; papami; jan27; +3 1 Ответить
2. dgolovanov 20.11.15 20:03 Сейчас в теме
Ну, не проблема автора, что у вас работы на пол-года вперед. Вы так медленно ее делаете? (шутка)
Хорошо, когда свободное время тратится на самообразование, а не классический админ-стайл - пока не трогают - смотрю фильмы на работе.
so-quest; Uncore; Brawler; +3 Ответить
3. vano-ekt 124 22.11.15 11:45 Сейчас в теме
хорошо, что за красили название регистра, ведь не каждый запросы читать будет
РегистрСведений.алг_НастройкиРабочихМест КАК НастройкиРабочихМест
DrAku1a; dgolovanov; nbeliaev; +3 Ответить
4. ekaruk 4983 24.11.15 22:01 Сейчас в теме
Идея классная.
Хотя вообще-то все эти извращения это зло и лучше такого не делать.
HiKS; sorb; +2 Ответить
5. Dnki 4 25.11.15 00:50 Сейчас в теме
(4) ekaruk, "все эти извращения это зло".
Чем более глупым и несерьезным занятие выглядит для женщины, тем более азартно мужики им займутся. Да на такую "глупость" намного быстрее найдется время, чем на программирование декларации и прочей мути!

Мое мнение: замечательно! автор задумался, что программы могут быть не одноцветными. И догадался, что все пользователи в детстве увлекались раскрашками.

Мои замечания:
- статью надо было построить по схеме: 1) в чем задача 2) как я решу визуально и концептуально 3) посмотрите мой код.
- насколько я понял, настройке подлежат только элементы формы. Из шрифт, размер, цвет. А как же сама форма? Хочу цвет не желтый!
- как не сразу понял, "РабочееМесто" это не стул пользователя (в смысле не имя компа, не имя сеанса и т.п.), а имя настраиваемого документа, элемента справочника. Тогда не понятно, как-же с формами списков и отчетами. Вызовы из них сбойнут на фразе:
= Строка(ЭтаФорма.ВладелецФормы.ЭтотОбъект);
6. nbeliaev 836 25.11.15 09:01 Сейчас в теме
(5) Dnki,
Спасибо за отзыв. Попробовал поменять отчет - все работает, сбоя нет. Вообще не совсем понятно - почему сбой должен был быть? Владелец то будет в любом случае у формы
17. Dnki 4 25.11.15 13:08 Сейчас в теме
(6)
= Строка(ЭтаФорма.ВладелецФормы.ЭтотОбъект);
"Владелец то будет в любом случае у формы"

Суть не в "ВладелецФормы", а "ЭтотОбъект". Он есть у формы Документа, элемента спр-ка, отчета. И нет у формы списка.
ИНТЕГРА; +1 Ответить
20. nbeliaev 836 04.12.15 10:25 Сейчас в теме
(17) Спасибо! да, как то упустил этот момент. выложил конфу с поправками.
(19) готово
7. Xershi 1556 25.11.15 09:14 Сейчас в теме
У нас точно так же пользователи воют после того как их с 1с7 пересадили.
Т.к. работы на такую глупость вагон, то этот вопрос отложили.
Благодаря статье, если придется решать этот вопрос сокращу время на разработку!
8. ИНТЕГРА 25 25.11.15 09:41 Сейчас в теме
Есть гораздо более удобный и простой вариант решения проблемы. Поражаюсь с каким упорством некоторые берутся решать банальные задачи кучей кода, когда можно немного подумать и решить красиво. Решал подобную задачу следующим образом:
1. Создавал копированием из исходной общую форму (текст модуля очищаешь при этом)
2. Менял ВИЗУЛЬАНО на нем элементы формы как надо (сдвигал, менял размер и тп... с цветами конечно не заморачивался как автор)
3. Делаешь обход по элементам своей формы и копируешь свойства в одноименную типовую.

Преимущества моего подхода:
- Кода - минимум (реализуется за пару часов. Под 1С все подобные задачи надо решать за пару часов, иначе выкидывайте свое решение на помойку и ищите другое).
- Возможность визуального редактирования.
- Возможность создавать новые элементы формы
... и тп.

У меня цель более естественная была - обновление конфигурации без редактирования форм, в результате изменения в формах генерировались программно.
9. Xershi 1556 25.11.15 09:47 Сейчас в теме
(8) ИНТЕГРА, так а смысл. Пользователь хочет видеть форму в нужном ему цвете, а чем вы ему помогли?
13. ИНТЕГРА 25 25.11.15 12:20 Сейчас в теме
(9) Xershi, Свойства формы тоже надо переносить из своей общей.
11. nbeliaev 836 25.11.15 10:18 Сейчас в теме
(8) ИНТЕГРА, может я чего не понял, но как в режиме Предприятие Вы копировали форму, очищали модуль и при этом еще и визуально двигали элементы? Покажите?
14. ИНТЕГРА 25 25.11.15 12:23 Сейчас в теме
(11) В конфигураторе конечно-же.
У автора, я не понял как визуализация процесса редактирования реализована.
16. nbeliaev 836 25.11.15 12:57 Сейчас в теме
(14) ИНТЕГРА, нет никакой визуализации редактирования. Есть возможность открыть общую форму из любой другой, самому определить список элементов и свойств, которые надо изменить (в конфигураторе, хоть все элементы формы). А пользователь уже из "предопределнных тобой в конфигураторе" выбирает элемент, его свойство и значение. Все настройки применяются без закрытия настраиваемой формы и тем более Предприятия.
Как вы заметили правильно - "пару свойств" - но так же легко было догадаться, что список может быть любым. Для своего конкретного случая мне нужно было "пара свойств", о чем я неоднократно упоминал по ходу статьи.
18. Xershi 1556 25.11.15 15:16 Сейчас в теме
(14) ИНТЕГРА, при открытии формы, можно каждому элементу назначит нужные нам параметры, чем автор и занимался. Список этих параметров он предоставил каждому пользователю. И теперь, если Вася захочет видеть синюю кнопку и рыжий фон, то у себя в 1С он это сможет сделать без программиста.
12. ekaruk 4983 25.11.15 10:56 Сейчас в теме
(8) ИНТЕГРА, Это не то. Тут вы вцелом меняли для всех.
А автор дал возможность каждому пользователю настроить вид формы для себя именно так, как он хочет.
15. ИНТЕГРА 25 25.11.15 12:34 Сейчас в теме
(12) ekaruk, по его подходу не весь вид, а только пару свойств как я заметил.
10. avasl 75 25.11.15 10:15 Сейчас в теме
в п. 2.6 это можно убрать из кода

НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
19. karaw 128 03.12.15 20:16 Сейчас в теме
Могли бы выложить cf-ник?
21. kosmo0 111 20.01.16 12:40 Сейчас в теме
Конфигурация никак не связана с какой-либо типовой? А если связана, то тот кто занимается обновлением не начинает выть?
А когда у вас будет сотрудников 50 и большая часть настроит под себя формы не начнутся поиски нужного реквизита на "соседнем" компе - у меня он большой и зеленый в этом углу, а здесь фиг найдешь.

Ну это все лирика. Какие аспекты стоит учитывать.

1. Чем больше отклонения от типовой конфигурации, тем больше затрат времени на обновление и больше шанс словить баги при очередном обновлении.
То есть. Придумают очередное изменение законодательство и начнут типовые конфигурации вылетать через 4-5 дней. Причем законодательство применяется с 1 января, а изменения в конфигурации появляются в феврале-марте. К тому же, обновлять типовой документ - поставить одну галочку. Правленый документ - смотреть логику документа. А если таких документов пара десятков?
2. Чем больше штат сотрудников, тем чаще в голову лезут мысли о единообразии (так гораздо проще, поверьте на слово). В нормальном случае сотрудники начинают помогать друг другу. А если у каждого свой собственный зоопарк, то объяснить (особенно по телефону) где находится нужная кнопочка и КАК ОНА ВЫГЛЯДИТ очень непросто.
3. ОБЯЗАТЕЛЬНО ДОЛЖЕН БЫТЬ механизм возврата к типовой форме. А то наколбасит какая-нибудь деятельная натура до такой степени что элементы перестанут помещаться на форме и как откатывать? Или после обновления что-то станет не видно - опять же как откатывать.

Помню тетеньке одной в Windows размер шрифта поменяли на крупный и то в некоторых местах тупо заголовки не стало видно. А с вашими изменениями только предполагаю куда может унести.
Оставьте свое сообщение