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