Как мы знаем, в управляемом интерфейсе пользователям даны широкие возможности по управлению внешним видом форм. Они могут менять порядок и видимость колонок, настраивать свои отборы, условное оформление и т. д. Порой у пользователей возникает потребность поделиться с коллегами своими персональными настройками для определенной формы. 1С по умолчанию не предоставляет такой возможности.

Ниже представлен один из вариантов реализации такого механизма. Тестировался на демонстрационной базе БСП 3.1.2.

Обмен настройками списков в 1С

Сразу стоит отметить, что с точки зрения платформы настройки формы — это два разных механизма:

Обмен настройками списков в 1С

Это настройки внешнего вида формы, они хранятся в хранилище системных настроек в разрезе пользователей и объектов. Напрашивается решение — добавить команду, которая скопирует наши текущие настройки и запишет их для другого пользователя. Но это не сработает — менять чужие настройки может только пользователь с правом «Администрирование данных», которого у обычных пользователей, скорее всего, не будет. Установка привилегированного режима тут также не поможет.

Обмен настройками списков в 1С

А это настройки списка. Они хранятся в хранилище пользовательских настроек динамических списков, по аналогии с настройками формы. Но есть тонкость. Если настройки из прошлого окна записываются в хранилище сразу при закрытии окна настроек, то эти записываются только при закрытии формы — владельца списка. То есть чтобы получить к ним программный доступ, придется закрыть и заново открыть форму, что неудобно. Поэтому данные настройки целесообразно доставать непосредственно из дин. списка на форме.

Нам понадобятся новые объекты конфигурации.

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

Обмен настройками списков в 1С

2. Общие команды ПрименитьНастройкиПоСсылке и ПолучитьСсылкуНастроек. В типе параметра укажем вышеописанный определяемый тип.

Обмен настройками списков в 1С

Обмен настройками списков в 1С

Так как «Командная панель формы.Важное» присутствует не только на форме списка, но и на форме документа, наши команды будут по умолчанию отображаться и там. Чтобы этого избежать, необходимо открыть форму документа, на вкладке «Командный интерфейс» найти наши команды и отключить их видимость.

Обмен настройками списков в 1С

3. Справочник СохраненныеНастройки. Добавим в него 2 реквизита – ОбъектНастройки (тип Строка(200)) и ХранилищеНастроек (тип ХранилищеЗначения). В объекте настройки будем хранить полное имя формы — владельца настроек, в нашем примере «Документ._ДемоРеализацияТоваров.Форма.ФормаСписка». В хранилище настроек будем хранить структуру, содержащую настройки формы и настройки динамического списка.

Обмен настройками списков в 1С

4. Общие модули СохранениеНастроекКлиент и СохранениеНастроекСервер, в которых опишем реализацию механизма.

Обмен настройками списков в 1С

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

 

Механизм работает следующим образом:

Выставив нужные настройки, пользователь нажимает кнопку «Получить ссылку настроек». В этот момент формируется элемент справочника «Сохраненные настройки», в который записывается структура, содержащая настройки внешнего вида формы и пользовательские настройки динамического списка. Напомню, первые мы получаем из хранилища общих настроек, вторые — непосредственно из компоновщика настроек на форме. В хранилище пользовательских настроек динамических списков на момент нажатия кнопки лежат те настройки, с которыми форма была открыта. И если пользователь что-то менял на форме, эти изменения появятся в хранилище только после закрытия формы списка.

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

Ниже приведен полный код общих модулей с вызовами из модулей команд:

1. Команда «Получить ссылку настроек»

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	СохранениеНастроекСервер.ПолучитьСсылкуНастроекНаСервере(
		ТипЗнч(ПараметрКоманды), 
		ПараметрыВыполненияКоманды.Источник.Список.КомпоновщикНастроек.ПользовательскиеНастройки, 
		ПараметрыВыполненияКоманды.Источник.ИмяФормы);
КонецПроцедуры

2. Команда «Применить настройки по ссылке»

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	СохранениеНастроекКлиент.ПрименитьНастройки(ПараметрыВыполненияКоманды.Источник, ТипЗнч(ПараметрКоманды));
КонецПроцедуры

3. Общий модуль СохранениеНастроекКлиент

Процедура ПрименитьНастройки(Форма, ТипОбъекта) Экспорт
	
	Параметры = Новый Структура;
	Параметры.Вставить("Форма", Форма);
	Параметры.Вставить("ТипОбъекта", ТипОбъекта);
	
	Оповещение = Новый ОписаниеОповещения("ПрименитьНастройкиЗавершение", ЭтотОбъект, Параметры);
	ПоказатьВводСтроки(Оповещение, "", "Пожалуйста, вставьте ссылку");
	
КонецПроцедуры

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

4. Общий модуль СохранениеНастроекСервер

Процедура ПолучитьСсылкуНастроекНаСервере(ТипОбъекта, Знач ПользовательскиеНастройки, Знач ИмяФормы) Экспорт
	
	ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
	
	СтруктураНастроек = Новый Структура;
	СтруктураНастроек.Вставить("ТипОбъекта", ТипОбъекта);
	СтруктураНастроек.Вставить("ПользовательскиеНастройки", ПользовательскиеНастройки);
	
	Отбор = Новый Структура;
	Отбор.Вставить("Пользователь", ТекущийПользователь);
	Отбор.Вставить("КлючОбъекта", ИмяФормы + "/НастройкиФормы");
	
	Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор);
	Если Выборка.Следующий() Тогда
		СтруктураНастроек.Вставить("НастройкиФормы", Выборка.Настройки);
	КонецЕсли;
	
	ШаблонНаименования = "%1 настройки формы списка от пользователя: %2, дата: %3";
	
	НоваяНастройка = Справочники.СохраненныеНастройки.СоздатьЭлемент();
	НоваяНастройка.Наименование = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонНаименования, 
									Строка(ТипОбъекта), ТекущийПользователь.Наименование, Формат(ТекущаяДата(),"ДЛФ=ДТ"));
	НоваяНастройка.ОбъектНастройки = ИмяФормы;
	НоваяНастройка.ХранилищеНастроек = Новый ХранилищеЗначения(СтруктураНастроек);
	НоваяНастройка.Записать();
	
	ОбщегоНазначения.СообщитьПользователю(ПолучитьНавигационнуюСсылку(НоваяНастройка.Ссылка));
	
КонецПроцедуры

Процедура ПрименитьНастройкиНаСервере(НавигационнаяСсылка, Параметры, СсылкаНекорректна) Экспорт
	
	ПерваяЧасть = Найти(НавигационнаяСсылка, "e1cib/data/");
    ВтораяЧасть = Найти(НавигационнаяСсылка, "?ref=");
	Если ПерваяЧасть = 0 Or ВтораяЧасть = 0 Тогда
		ОбщегоНазначения.СообщитьПользователю("Пожалуйста, вставьте корректную ссылку");
		СсылкаНекорректна = Истина;
		Возврат;
	КонецЕсли;
    
    ПредставлениеТипа = Сред(НавигационнаяСсылка, ПерваяЧасть + 11, ВтораяЧасть - ПерваяЧасть - 11);
	Если ПредставлениеТипа <> "Справочник.СохраненныеНастройки" Тогда
		ОбщегоНазначения.СообщитьПользователю("Настройки не найдены. Пожалуйста, вставьте корректную ссылку");
		СсылкаНекорректна = Истина;
		Возврат;
	КонецЕсли;
	
    ШаблонЗначения = ЗначениеВСтрокуВнутр(ПредопределенноеЗначение(ПредставлениеТипа + ".EmptyRef"));
    ЗначениеСсылки = СтрЗаменить(ШаблонЗначения, "00000000000000000000000000000000", Сред(НавигационнаяСсылка, ВтораяЧасть + 5));
    СсылкаНаНастройки = ЗначениеИзСтрокиВнутр(ЗначениеСсылки);
	
	Если Не СсылкаВерна(СсылкаНаНастройки) Тогда
		ОбщегоНазначения.СообщитьПользователю("Настройки не найдены. Пожалуйста, вставьте корректную ссылку");
		СсылкаНекорректна = Истина;
		Возврат;
	КонецЕсли;
	
	СтруктураНастроек = СсылкаНаНастройки.ХранилищеНастроек.Получить();
	
	Если СтруктураНастроек.ТипОбъекта <> Параметры.ТипОбъекта Тогда
		ОбщегоНазначения.СообщитьПользователю("Настройки не найдены. Пожалуйста, вставьте корректную ссылку");
		СтрокаСообщения = "Вы вставили ссылку на настройки другого типа документов (%1). Пожалуйста, вставьте корректную ссылку";
		ОбщегоНазначения.СообщитьПользователю(
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, Строка(СтруктураНастроек.ТипОбъекта)));
		СсылкаНекорректна = Истина;
		Возврат;
	КонецЕсли;
	
	Параметры.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(СтруктураНастроек.ПользовательскиеНастройки);
	Если СтруктураНастроек.Свойство("НастройкиФормы") Тогда
		ХранилищеСистемныхНастроек.Сохранить(Параметры.ИмяФормы + "/НастройкиФормы", , СтруктураНастроек.НастройкиФормы);
	КонецЕсли;
	
КонецПроцедуры

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