Как сохранить общие параметры и настройки внешнего отчета для всех пользователей в 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

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

Разберем основные подходы к программному сохранению и считыванию настроек формы внешнего отчета, проанализируем их плюсы, минусы и особенности реализации.

Способ 1. Использование ХранилищаОбщихНастроек с фиксированным пользователем и ключом объекта

Платформа 1С:Предприятие 8.3 предоставляет объект ХранилищеОбщихНастроек (а также ХранилищеСистемныхНастроек), предназначенный для программного сохранения структур данных, реквизитов и настроек. По умолчанию настройки привязываются к текущему пользователю, однако метод сохранения позволяет передать фиксированное строковое имя пользователя.

Рассмотрим, как реализовать сохранение параметров отчета для всех пользователей с разделением по организациям. Для исключения ошибок при переименовании организаций в качестве ключа настройки рекомендуется использовать уникальный идентификатор ссылки (GUID):


&НаСервере
Процедура СохранитьНастройкиПоОрганизацииНаСервере(ОрганизацияСсылка, СтруктураНастроек)
	
	УстановитьПривилегированныйРежим(Истина);
	
	КлючОбъекта = "ВнешнийОтчет_НастройкиПоОрганизациям";
	
	// Формируем стабильный ключ на основе GUID организации
	КлючНастроек = "Орг_" + Строка(ОрганизацияСсылка.УникальныйИдентификатор());
	
	// Передаем фиксированное имя пользователя, чтобы настройки были общими для всех
	ИмяПользователяНастроек = "ОбщиеНастройкиДляВсех";
	
	ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, СтруктураНастроек, , ИмяПользователяНастроек);
	
КонецПроцедуры

&НаСервере
Функция ЗагрузитьНастройкиПоОрганизацииНаСервере(ОрганизацияСсылка)
	
	УстановитьПривилегированныйРежим(Истина);
	
	КлючОбъекта = "ВнешнийОтчет_НастройкиПоОрганизациям";
	КлючНастроек = "Орг_" + Строка(ОрганизацияСсылка.УникальныйИдентификатор());
	ИмяПользователяНастроек = "ОбщиеНастройкиДляВсех";
	
	СохраненныеДанные = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек, , ИмяПользователяНастроек);
	
	Если ТипЗнч(СохраненныеДанные) = Тип("Структура") Тогда
		Возврат СохраненныеДанные;
	КонецЕсли;
	
	Возврат Новый Структура;
	
КонецФункции

Посмотрим на логику работы при изменении организации на форме внешнего отчета:

  1. В событии формы ОрганизацияПриИзменении вызывается серверная процедура загрузки.
  2. Из хранилища считывается структура данных для выбранного GUID.
  3. Значения из структуры переносятся в соответствующие реквизиты формы с помощью метода ЗаполнитьЗначенияСвойств или прямого присвоения.

Способ 2. Использование реквизита ХранилищеНастроек в справочнике ДополнительныеОтчетыИОбработки

В типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) элемент справочника Справочники.ДополнительныеОтчетыИОбработки имеет реквизит ХранилищеНастроек с типом ХранилищеЗначения. В него можно сериализовать произвольную структуру параметров или таблицу соответствий.

Разберем пример чтения и записи настроек через объект справочника:


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

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

Важные ограничения и риски данного способа:

  1. Права доступа: обычные пользователи базы данных не имеют прав на запись элементов справочника ДополнительныеОтчетыИОбработки. Запись обязательно должна выполняться с вызовом УстановитьПривилегированныйРежим(Истина).
  2. Блокировки данных: при одновременной попытке нескольких пользователей сохранить настройки возникнет транзакционная блокировка элемента справочника.
  3. Перезапись при обновлении: при загрузке нового файла внешнего отчета через стандартную форму БСП реквизит ХранилищеНастроек может быть очищен или перезаписан.

Способ 3. Использование функций общего назначения БСП

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

Посмотрим на вызов процедур БСП:


// Сохранение общей настройки
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
	"ИмяВнешнегоОтчета", 
	"НастройкиПоУмолчанию", 
	СтруктураНастроек, 
	, 
	"ОбщийПользователь"
);

// Чтение общей настройки
СтруктураНастроек = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
	"ИмяВнешнегоОтчета", 
	"НастройкиПоУмолчанию", 
	Неопределено, 
	, 
	"ОбщийПользователь"
);

Рекомендации по выбору решения

  1. Для типовых конфигураций 1С без доработок оптимальным решением является Способ 1 или Способ 3 с использованием ХранилищеОбщихНастроек.
  2. Чтобы исключить дублирование настроек и сбои при изменении наименований элементов, в качестве ключа настройки всегда следует использовать строковое представление уникального идентификатора ссылки: XMLСтрока(Организация.УникальныйИдентификатор()) или Строка(Организация.УникальныйИдентификатор()).
  3. Все процедуры чтения и записи общих настроек из формы внешнего отчета должны выполняться строго на сервере в привилегированном режиме.
← На главную