При разработке и доработке систем на платформе 1С часто возникает задача переноса внешних отчетов в расширение конфигурации (предварительно стоит провести анализ зависимостей). Это правильный подход с точки зрения поддержки и обновления системы (особенно если вы используете патчи конфигурации). Однако после такого переноса разработчики сталкиваются с проблемой: все пользовательские настройки и сохраненные варианты для этих отчетов остаются в старой базе и не применяются к новым объектам в расширении. Рассмотрим, как решить эту задачу и выполнить перенос объектов 1С и накопленных вариантов отчетов.
Проанализируем несколько способов: от простого ручного переноса для единичных случаев до мощного программного метода для массовой миграции.
Этот способ подходит, если вам нужно перенести всего несколько вариантов для одного-двух отчетов. Он не требует программирования, но достаточно трудоемок при больших объемах. Суть метода в том, что мы сохраняем настройки старого варианта в файл, а затем загружаем их в новый вариант, созданный в отчете из расширения.
Разберем процесс по шагам:
.xml.Этот метод надежен, но его главный недостаток — большое количество ручных действий, что делает его неприменимым для переноса сотен вариантов в десятках баз.
Для автоматизации процесса лучше всего разработать специальную обработку. Она будет программно считывать старые варианты и создавать их копии для отчетов из расширения. В основе этого метода лежит работа со справочником ВариантыОтчетов и менеджером ХранилищеВариантовОтчетов.
Рассмотрим алгоритм работы такой обработки:
Расширение1_. Полное имя объекта отчета, которое хранится в справочнике вариантов, выглядит как "Отчет.ИмяОтчета". Таким образом, нам нужно сопоставить "Отчет.СтарыйОтчет" с "Отчет.Расширение1_СтарыйОтчет". Это можно сделать, заложив логику в код или создав в обработке таблицу для ручного сопоставления.
ВариантыОтчетов, которые относятся к нашим старым отчетам. Ключевые реквизиты, которые нам понадобятся:
ИмяОбъекта — полное имя отчета.Ключ — уникальный идентификатор варианта.Наименование — название варианта, которое видит пользователь.Настройки — это ХранилищеЗначения, содержащее саму структуру настроек СКД.Пользователь — ссылка на пользователя, если вариант индивидуальный.ХранилищеВариантовОтчетов.Сохранить(). Этот метод принимает все необходимые параметры и записывает новый вариант в базу данных.
Посмотрим на пример кода, который можно использовать в такой обработке:
// Предполагается, что есть переменная СоответствиеОтчетов - это Соответствие,
// где Ключ - старое имя отчета ("Отчет.СтарыйОтчет"),
// а Значение - новое имя отчета ("Отчет.Расширение1_СтарыйОтчет").
Для Каждого ПараметрСоответствия Из СоответствиеОтчетов Цикл
СтароеИмяОтчета = ПараметрСоответствия.Ключ;
НовоеИмяОтчета = ПараметрСоответствия.Значение;
// Ищем все варианты для старого отчета
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВариантыОтчетов.Ссылка
|ИЗ
| Справочник.ВариантыОтчетов КАК ВариантыОтчетов
|ГДЕ
| ВариантыОтчетов.ИмяОбъекта = &ИмяОбъекта";
Запрос.УстановитьПараметр("ИмяОбъекта", СтароеИмяОтчета);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
СтарыйВариантОбъект = Выборка.Ссылка.ПолучитьОбъект();
// Получаем настройки из хранилища
НастройкиВарианта = СтарыйВариантОбъект.Настройки.Получить();
Если НастройкиВарианта = Неопределено Тогда
Сообщить("Не удалось получить настройки для варианта: " + СтарыйВариантОбъект.Наименование, СтатусСообщения.Важное);
Продолжить;
КонецЕсли;
// Вызываем метод для сохранения нового варианта
ХранилищеВариантовОтчетов.Сохранить(
НовоеИмяОтчета, // Имя объекта - наш новый отчет в расширении
СтарыйВариантОбъект.Ключ, // Ключ варианта, можно оставить старый
НастройкиВарианта, // Сами настройки, полученные из хранилища
СтарыйВариантОбъект.Наименование, // Наименование для пользователя
СтарыйВариантОбъект.Пользователь, // Ссылка на пользователя (если вариант личный)
СтарыйВариантОбъект.Пользователь.Пустая() // Является ли вариант общим
);
Сообщить("Успешно перенесен вариант '" + СтарыйВариантОбъект.Наименование + "' для отчета '" + НовоеИмяОтчета + "'");
КонецЦикла;
КонецЦикла;
Важный момент: метод ХранилищеВариантовОтчетов.Сохранить() создает или обновляет вариант. Если у пользователя уже есть вариант с таким же ключом для этого отчета, он будет перезаписан. Это удобно для повторного запуска обработки.
Этот способ решает другую, но смежную задачу. Он используется, когда варианты отчетов являются не пользовательскими, а стандартными, и должны поставляться вместе с расширением как его неотъемлемая часть. В этом случае настройки хранятся не в справочнике, а непосредственно в метаданных отчета.
Как это реализовать:
Пример кода для модуля менеджера отчета в расширении:
&После("ПриОпределенииНастроек")
Процедура Расш1_ПриОпределенииНастроек(Настройки)
// Сообщаем системе, что у нашего отчета есть настраиваемые варианты
Настройки.НастроитьВариантыОтчета = Истина;
КонецПроцедуры
&После("НастроитьВариантыОтчета")
Процедура Расш1_НастроитьВариантыОтчета(Настройки, НастройкиОтчета)
// Описываем каждый предопределенный вариант, созданный в СКД
// "Основной" - это имя (ключ) варианта, которое мы задали на закладке "Настройки" в СКД
ОписаниеВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "Основной");
ОписаниеВарианта.Описание = "Основной вариант (стандартный)"; // Наименование для пользователя
ОписаниеВарианта.ВидимостьПоУмолчанию = Истина;
// Описываем второй вариант
ОписаниеВарианта2 = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "ДляРуководителя");
ОписаниеВарианта2.Описание = "Сводный отчет для руководителя";
ОписаниеВарианта2.ВидимостьПоУмолчанию = Истина;
КонецПроцедуры
После добавления этого кода и обновления конфигурации (или через "Обновление вспомогательных данных") эти варианты станут доступны всем пользователям в стандартном меню выбора вариантов отчета. Они будут частью расширения и не потребуют миграции.