Как перенести варианты отчетов в расширение конфигурации 1С?

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

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

Проанализируем несколько способов: от простого ручного переноса для единичных случаев до мощного программного метода для массовой миграции.

Решение 1: Ручной перенос вариантов через файлы XML

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

Разберем процесс по шагам:

  1. Сохранение старого варианта. В исходной базе данных откройте отчет, варианты которого нужно перенести. Выберите нужный вариант.
  2. Перейдите в меню "Ещё" → "Прочее" → "Изменить вариант отчета".
  3. В открывшемся окне редактора настроек отчета снова нажмите "Ещё" и выберите пункт "Сохранить настройки...". Сохраните настройки в файл с расширением .xml.
  4. Подготовка нового отчета. Теперь перейдите в базу, где установлено расширение. Откройте тот же отчет, но уже из расширения.
  5. Создание временного варианта. Очень важный шаг: просто загрузить настройки не получится, так как система не поймет, к какому варианту их применять. Поэтому сначала нужно создать новый, пусть даже пустой, вариант. Для этого зайдите в "Ещё" → "Прочее" → "Изменить вариант отчета" и в редакторе нажмите "Ещё" → "Сохранить вариант отчета...". Дайте ему временное имя.
  6. Загрузка настроек. Не выходя из редактора настроек, снова нажмите "Ещё" и выберите "Загрузить настройки...". Укажите ранее сохраненный XML-файл.
  7. Завершение. После загрузки все настройки из старого варианта применятся к вашему временному варианту. Теперь завершите редактирование и сохраните его уже с нужным наименованием и видимостью (например, "Доступен всем пользователям").

Этот метод надежен, но его главный недостаток — большое количество ручных действий, что делает его неприменимым для переноса сотен вариантов в десятках баз.

Решение 2: Программный перенос для массовой миграции

Для автоматизации процесса лучше всего разработать специальную обработку. Она будет программно считывать старые варианты и создавать их копии для отчетов из расширения. В основе этого метода лежит работа со справочником ВариантыОтчетов и менеджером ХранилищеВариантовОтчетов.

Рассмотрим алгоритм работы такой обработки:

  1. Сопоставление отчетов. Первым делом нужно определить, как старые отчеты соотносятся с новыми. Обычно отчет в расширении имеет префикс, например, Расширение1_. Полное имя объекта отчета, которое хранится в справочнике вариантов, выглядит как "Отчет.ИмяОтчета". Таким образом, нам нужно сопоставить "Отчет.СтарыйОтчет" с "Отчет.Расширение1_СтарыйОтчет". Это можно сделать, заложив логику в код или создав в обработке таблицу для ручного сопоставления.
  2. Получение старых вариантов. Необходимо перебрать все элементы справочника ВариантыОтчетов, которые относятся к нашим старым отчетам. Ключевые реквизиты, которые нам понадобятся:
    • ИмяОбъекта — полное имя отчета.
    • Ключ — уникальный идентификатор варианта.
    • Наименование — название варианта, которое видит пользователь.
    • Настройки — это ХранилищеЗначения, содержащее саму структуру настроек СКД.
    • Пользователь — ссылка на пользователя, если вариант индивидуальный.
  3. Создание новых вариантов. Для каждого найденного старого варианта мы будем создавать новый, используя метод ХранилищеВариантовОтчетов.Сохранить(). Этот метод принимает все необходимые параметры и записывает новый вариант в базу данных.

Посмотрим на пример кода, который можно использовать в такой обработке:


// Предполагается, что есть переменная СоответствиеОтчетов - это Соответствие,
// где Ключ - старое имя отчета ("Отчет.СтарыйОтчет"), 
// а Значение - новое имя отчета ("Отчет.Расширение1_СтарыйОтчет").

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

Важный момент: метод ХранилищеВариантовОтчетов.Сохранить() создает или обновляет вариант. Если у пользователя уже есть вариант с таким же ключом для этого отчета, он будет перезаписан. Это удобно для повторного запуска обработки.

Решение 3: Включение вариантов в состав расширения (предопределенные варианты)

Этот способ решает другую, но смежную задачу. Он используется, когда варианты отчетов являются не пользовательскими, а стандартными, и должны поставляться вместе с расширением как его неотъемлемая часть. В этом случае настройки хранятся не в справочнике, а непосредственно в метаданных отчета.

Как это реализовать:

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

Пример кода для модуля менеджера отчета в расширении:


&После("ПриОпределенииНастроек")
Процедура Расш1_ПриОпределенииНастроек(Настройки)
    // Сообщаем системе, что у нашего отчета есть настраиваемые варианты
    Настройки.НастроитьВариантыОтчета = Истина;
КонецПроцедуры

&После("НастроитьВариантыОтчета")
Процедура Расш1_НастроитьВариантыОтчета(Настройки, НастройкиОтчета)
    // Описываем каждый предопределенный вариант, созданный в СКД
    
    // "Основной" - это имя (ключ) варианта, которое мы задали на закладке "Настройки" в СКД
    ОписаниеВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "Основной");
    ОписаниеВарианта.Описание = "Основной вариант (стандартный)"; // Наименование для пользователя
    ОписаниеВарианта.ВидимостьПоУмолчанию = Истина;
    
    // Описываем второй вариант
    ОписаниеВарианта2 = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "ДляРуководителя");
    ОписаниеВарианта2.Описание = "Сводный отчет для руководителя";
    ОписаниеВарианта2.ВидимостьПоУмолчанию = Истина;
КонецПроцедуры

После добавления этого кода и обновления конфигурации (или через "Обновление вспомогательных данных") эти варианты станут доступны всем пользователям в стандартном меню выбора вариантов отчета. Они будут частью расширения и не потребуют миграции.

← На главную