Перенести пользовательские из стандартного хранилища. Переносит пользовательские варианты из стандартного хранилища вариантов в хранилище подсистемы.
// Переносит пользовательские варианты из стандартного хранилища вариантов в хранилище подсистемы.
// Используется при частичном внедрении - когда ХранилищеВариантовОтчетов установлено не для всей конфигурации,
// а в свойствах конкретных отчетов, подключенных к подсистеме.
// Рекомендуется использовать в обработчиках обновления на конкретную версию.
//
// Параметры:
// ИменаОтчетов - Строка - имена отчетов, разделенные запятыми.
// Если параметр не указан, то переносятся все отчеты
// стандартного хранилища, после чего оно полностью очищается.
//
// Пример:
// // Перенос всех пользовательских вариантов отчетов при обновлении.
// ВариантыОтчетов.ПеренестиВариантыОтчетовИзСтандартногоХранилища();
// // Перенос пользовательских вариантов отчетов, переведенных в хранилище подсистемы "Варианты отчетов".
// ВариантыОтчетов.ПеренестиВариантыОтчетовИзСтандартногоХранилища("АнализЖурналаРегистрации, ЗадачиИстекающиеНаДату");
//
Процедура ПеренестиПользовательскиеИзСтандартногоХранилища(ИменаОтчетов = "") Экспорт
ПредставлениеПроцедуры = НСтр("ru = 'Прямая конвертация вариантов отчетов'");
ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры);
// Результат, который будет сохранен в хранилище.
ТаблицаВариантов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПереносВариантовОтчетов", "ТаблицаВариантов", , , "");
Если ТипЗнч(ТаблицаВариантов) <> Тип("ТаблицаЗначений") Или ТаблицаВариантов.Количество() = 0 Тогда
ТаблицаВариантов = Новый ТаблицаЗначений;
ТаблицаВариантов.Колонки.Добавить("Отчет", ОписаниеТиповСтрока());
ТаблицаВариантов.Колонки.Добавить("Вариант", ОписаниеТиповСтрока());
ТаблицаВариантов.Колонки.Добавить("Автор", ОписаниеТиповСтрока());
ТаблицаВариантов.Колонки.Добавить("Настройка", Новый ОписаниеТипов("ХранилищеЗначения"));
ТаблицаВариантов.Колонки.Добавить("ПредставлениеОтчета", ОписаниеТиповСтрока());
ТаблицаВариантов.Колонки.Добавить("ПредставлениеВарианта", ОписаниеТиповСтрока());
ТаблицаВариантов.Колонки.Добавить("ИдентификаторАвтора", Новый ОписаниеТипов("УникальныйИдентификатор"));
КонецЕсли;
УдалятьВсе = (ИменаОтчетов = "" Или ИменаОтчетов = "*");
МассивУдаляемыхКлючейОбъектов = Новый Массив;
ВыборкаХранилища = ХранилищеВариантовОтчетов.Выбрать(НовыйФильтрПоКлючуОбъекта(ИменаОтчетов));
ОшибокЧтенияПодряд = 0;
Пока Истина Цикл
Попытка
ЭлементВыборкиПолучен = ВыборкаХранилища.Следующий();
ОшибокЧтенияПодряд = 0;
Исключение
ЭлементВыборкиПолучен = Неопределено;
ОшибокЧтенияПодряд = ОшибокЧтенияПодряд + 1;
ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка,
НСтр("ru = 'В процессе выборки вариантов отчетов из стандартного хранилища возникла ошибка:'")
+ Символы.ПС
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если ЭлементВыборкиПолучен = Ложь Тогда
Если ИменаОтчетов = "" Или ИменаОтчетов = "*" Тогда
Прервать;
Иначе
ВыборкаХранилища = ХранилищеВариантовОтчетов.Выбрать(НовыйФильтрПоКлючуОбъекта(ИменаОтчетов));
Продолжить;
КонецЕсли;
ИначеЕсли ЭлементВыборкиПолучен = Неопределено Тогда
Если ОшибокЧтенияПодряд > 100 Тогда
Прервать;
Иначе
Продолжить;
КонецЕсли;
КонецЕсли;
// Пропуск не подключенных внутренних отчетов.
ОтчетМетаданные = Метаданные.НайтиПоПолномуИмени(ВыборкаХранилища.КлючОбъекта);
Если ОтчетМетаданные <> Неопределено Тогда
ХранилищеМетаданные = ОтчетМетаданные.ХранилищеВариантов;
Если ХранилищеМетаданные = Неопределено Или ХранилищеМетаданные.Имя <> "ХранилищеВариантовОтчетов" Тогда
УдалятьВсе = Ложь;
Продолжить;
КонецЕсли;
КонецЕсли;
// Внешние варианты отчетов переносятся все, поскольку для них невозможно определить
// подключены они к хранилищу подсистемы или нет.
МассивУдаляемыхКлючейОбъектов.Добавить(ВыборкаХранилища.КлючОбъекта);
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ВыборкаХранилища.Пользователь);
Если ПользовательИБ = Неопределено Тогда
Пользователь = Справочники.Пользователи.НайтиПоНаименованию(ВыборкаХранилища.Пользователь, Истина);
Если Не ЗначениеЗаполнено(Пользователь) Тогда
Продолжить;
КонецЕсли;
ИдентификаторПользователя = Пользователь.ИдентификаторПользователяИБ;
Иначе
ИдентификаторПользователя = ПользовательИБ.УникальныйИдентификатор;
КонецЕсли;
СтрокаТаблицы = ТаблицаВариантов.Добавить();
СтрокаТаблицы.Отчет = ВыборкаХранилища.КлючОбъекта;
СтрокаТаблицы.Вариант = ВыборкаХранилища.КлючНастроек;
СтрокаТаблицы.Автор = ВыборкаХранилища.Пользователь;
СтрокаТаблицы.Настройка = Новый ХранилищеЗначения(ВыборкаХранилища.Настройки, Новый СжатиеДанных(9));
СтрокаТаблицы.ПредставлениеВарианта = ВыборкаХранилища.Представление;
СтрокаТаблицы.ИдентификаторАвтора = ИдентификаторПользователя;
Если ОтчетМетаданные = Неопределено Тогда
СтрокаТаблицы.ПредставлениеОтчета = ВыборкаХранилища.КлючОбъекта;
Иначе
СтрокаТаблицы.ПредставлениеОтчета = ОтчетМетаданные.Представление();
КонецЕсли;
КонецЦикла;
// Очистка стандартного хранилища.
Если УдалятьВсе Тогда
ХранилищеВариантовОтчетов.Удалить(Неопределено, Неопределено, Неопределено);
Иначе
Для Каждого КлючОбъекта Из МассивУдаляемыхКлючейОбъектов Цикл
ХранилищеВариантовОтчетов.Удалить(КлючОбъекта, Неопределено, Неопределено);
КонецЦикла;
КонецЕсли;
// Результат выполнения
ЗаписатьВЖурналЗавершениеПроцедуры(ПредставлениеПроцедуры);
// Загрузка вариантов в хранилище подсистемы.
ЗагрузитьПользовательские(ТаблицаВариантов);
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ТипыСтандартныхХранилищНастроек (БСП)
ПеренестиПользовательскиеМакеты (БСП)
ЗагрузитьПользовательские (БСП)
УдалитьПользовательскийВариантОтчета (БСП)
ПриУдаленииПользовательскихВариантовОтчета (БСП)
ОшибкаФайлНеНайденВХранилищеФайлов (БСП)
Сохранить/Прочитать настройки СКД для обработок и прочих модулей