Как сохранить настройки и отборы в отчете СКД при его закрытии?

Программист 1С v8.3 (Обычные формы)
← На главную

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

В этой статье мы подробно разберем, почему так происходит, и рассмотрим практические способы решения этой задачи как для современных управляемых форм, так и для классических обычных форм в толстом клиенте 1С:Предприятия.

Почему настройки СКД не сохраняются автоматически?

Выясним причину такого поведения платформы. В обычных формах у элементов управления и самой формы существуют стандартные свойства СохранятьЗначения и ВосстанавливатьЗначенияПриОткрытии. Однако эта автоматическая система рассчитана на работу с простыми типами данных (строки, числа, даты, ссылки, булево).

Объект КомпоновщикНастроек, управляющий отборами и параметрами СКД, представляет собой сложную древовидную структуру платформы. Платформа 1С «из коробки» не умеет напрямую записывать этот комплексный объект в стандартный механизм сохранения настроек формы. В управляемых формах эта проблема решена на уровне платформы за счет механизма вариантов отчетов, но в обычных формах разработчику приходится настраивать этот процесс вручную.

---

Решение для управляемых форм

Если ваш отчет разработан для управляемого интерфейса (например, в конфигурациях «Бухгалтерия предприятия 3.0», «Управление нашей фирмой» или «ERP»), платформа предоставляет мощный встроенный механизм хранения настроек.

Рассмотрим стандартный интерактивный способ сохранения отборов без написания кода:

  1. Откройте отчет и настройте все необходимые отборы на панели настроек.
  2. В верхней части формы отчета найдите кнопку «Выбрать другой вариант отчета или сохранить новый» (обычно она обозначается значком дискеты или папки с зеленой стрелкой).
  3. Нажмите кнопку «Сохранить вариант отчета...».
  4. В появившемся окне укажите наименование (например, «Продажи по региону Восток») и определите, кому будет доступен этот вариант (только вам или всем пользователям).
  5. При следующем открытии отчета достаточно выбрать сохраненный вариант через меню «Еще» -> «Варианты отчета».

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

---

Решения для обычных форм (в толстом клиенте)

Если вы работаете в обычной форме (например, в конфигурациях «Управление производственным предприятием 1.3», «Управление торговлей 10.3» или в собственном самописном решении), стандартная дискета сохранения настроек может отсутствовать или не работать для табличных полей отборов. Разберем по шагам несколько надежных программных и интерактивных способов решения этой проблемы.

Способ 1. Сериализация настроек компоновщика в XML

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

Проанализируем алгоритм реализации:

  1. Откройте форму вашего отчета в конфигураторе.
  2. Создайте новый реквизит формы с именем СохраненныеНастройкиТест и типом данных Строка (длина неограниченна).
  3. В свойствах формы найдите свойство СохраняемыеЗначения и установите флажок напротив нашего нового реквизита СохраненныеНастройкиТест. Убедитесь, что у формы также включено свойство СохранятьЗначения.
  4. Перейдите в модуль формы и пропишите сериализацию настроек в событии перед закрытием формы:

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    
    // Создаем объект записи XML для сериализации настроек СКД
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    
    // Записываем текущие настройки компоновщика в XML-строку
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, КомпоновщикНастроек.Настройки, "Settings", "http://v8.1c.ru/8.1/data-composition-system/settings");
    
    // Помещаем XML-текст в сохраняемый реквизит формы
    СохраненныеНастройкиТест = ЗаписьXML.Закрыть();
    
КонецПроцедуры
  1. Теперь напишем код для десериализации (восстановления) сохраненных отборов при открытии формы:

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

Этот способ элегантен тем, что сохранение происходит полностью автоматически и незаметно для пользователя.

Способ 2. Использование Хранилища значений (сохранение в базу данных)

Если настройки отборов должны сохраняться в базе данных (чтобы пользователь мог получить к ним доступ, зайдя с любого компьютера), или если вы настраиваете отчет, интегрированный в конфигурацию, лучше использовать объект ХранилищеЗначения. Для этой задачи можно использовать методику сохранения условий отбора в базе данных.

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


// Функция записывает настройки в базу данных
Процедура СохранитьНастройкиВБазу(ИмяОтчета, ТекущийПользователь)
    
    // Извлекаем текущую структуру настроек СКД
    ТекущиеНастройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Помещаем настройки в ХранилищеЗначения
    АрхивНастроек = Новый ХранилищеЗначения(ТекущиеНастройки);
    
    // Записываем настройки в регистр сведений
    МенеджерЗаписи = РегистрыСведений.СохраненныеНастройкиПользователей.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Пользователь = ТекущийПользователь;
    МенеджерЗаписи.ИмяОтчета   = ИмяОтчета;
    МенеджерЗаписи.Настройки    = АрхивНастроек;
    МенеджерЗаписи.Записать();
    
КонецПроцедуры

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

Вызовы этих процедур также следует разместить в обработчиках событий формы ПередЗакрытием и ПриОткрытии соответственно.

Способ 3. Использование типовых регистров старых конфигураций

Если вы ведете разработку в устаревшей типовой конфигурации 1С на обычных формах (например, УПП 1.3), в ней, скорее всего, уже присутствует штатный регистр сведений СохраненныеНастройки.

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

Способ 4. Добавление стандартной командной панели СКД на форму

Если вам не хочется писать много программного кода, можно решить задачу интерактивно, добавив элементы управления на форму отчета:

  1. Откройте форму отчета в конфигураторе.
  2. Разместите на форме элемент управления ТабличноеПоле и свяжите его с путем к данным: КомпоновщикНастроек.Настройки.Отбор. Это выведет стандартное окно настройки отборов на форму.
  3. Добавьте на форму элемент КоманднаяПанель.
  4. Откройте свойства созданной командной панели и установите свойство «Источник действий», указав в нем созданное ранее табличное поле отбора.
  5. Включите у командной панели свойство «Автозаполнение».

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

---

Резюме и рекомендации

Мы проанализировали различные варианты решения проблемы сброса отборов в отчетах СКД. Подведем итог:

← На главную