При работе со сложными отчетами на базе Схемы компоновки данных (СКД) пользователи часто сталкиваются с неприятной проблемой: после закрытия формы отчета все кропотливо заполненные отборы, параметры и группировки бесследно исчезают. При следующем открытии отчета пользователю приходится настраивать все заново.
В этой статье мы подробно разберем, почему так происходит, и рассмотрим практические способы решения этой задачи как для современных управляемых форм, так и для классических обычных форм в толстом клиенте 1С:Предприятия.
Выясним причину такого поведения платформы. В обычных формах у элементов управления и самой формы существуют стандартные свойства СохранятьЗначения и ВосстанавливатьЗначенияПриОткрытии. Однако эта автоматическая система рассчитана на работу с простыми типами данных (строки, числа, даты, ссылки, булево).
Объект КомпоновщикНастроек, управляющий отборами и параметрами СКД, представляет собой сложную древовидную структуру платформы. Платформа 1С «из коробки» не умеет напрямую записывать этот комплексный объект в стандартный механизм сохранения настроек формы. В управляемых формах эта проблема решена на уровне платформы за счет механизма вариантов отчетов, но в обычных формах разработчику приходится настраивать этот процесс вручную.
---
Если ваш отчет разработан для управляемого интерфейса (например, в конфигурациях «Бухгалтерия предприятия 3.0», «Управление нашей фирмой» или «ERP»), платформа предоставляет мощный встроенный механизм хранения настроек.
Рассмотрим стандартный интерактивный способ сохранения отборов без написания кода:
Если отчет встроен в конфигурацию, использующую Библиотеку стандартных подсистем (БСП), сохранение настроек и отборов происходит автоматически в разрезе пользователей при каждом закрытии формы, если это предусмотрено настройками панели отчетов.
---
Если вы работаете в обычной форме (например, в конфигурациях «Управление производственным предприятием 1.3», «Управление торговлей 10.3» или в собственном самописном решении), стандартная дискета сохранения настроек может отсутствовать или не работать для табличных полей отборов. Разберем по шагам несколько надежных программных и интерактивных способов решения этой проблемы.
Этот способ идеально подходит для внешних отчетов, так как не требует создания дополнительных объектов метаданных в конфигурации. Мы воспользуемся хитростью: переведем сложный объект настроек компоновщика в текстовую XML-строку, которую обычная форма без проблем сможет сохранить в своем стандартном хранилище.
Проанализируем алгоритм реализации:
СохраненныеНастройкиТест и типом данных Строка (длина неограниченна).СохраняемыеЗначения и установите флажок напротив нашего нового реквизита СохраненныеНастройкиТест. Убедитесь, что у формы также включено свойство СохранятьЗначения.
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
// Создаем объект записи XML для сериализации настроек СКД
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
// Записываем текущие настройки компоновщика в XML-строку
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, КомпоновщикНастроек.Настройки, "Settings", "http://v8.1c.ru/8.1/data-composition-system/settings");
// Помещаем XML-текст в сохраняемый реквизит формы
СохраненныеНастройкиТест = ЗаписьXML.Закрыть();
КонецПроцедуры
Процедура ПриОткрытии()
// Проверяем, были ли ранее сохранены настройки формы
Если ЗначениеЗаполнено(СохраненныеНастройкиТест) Тогда
Попытка
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СохраненныеНастройкиТест);
// Считываем объект настроек компоновщика данных из XML
Настройки = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("НастройкиКомпоновкиДанных"));
// Загружаем восстановленные настройки в компоновщик отчета
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Исключение
Сообщить("Не удалось восстановить сохраненные настройки отчета: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Этот способ элегантен тем, что сохранение происходит полностью автоматически и незаметно для пользователя.
Если настройки отборов должны сохраняться в базе данных (чтобы пользователь мог получить к ним доступ, зайдя с любого компьютера), или если вы настраиваете отчет, интегрированный в конфигурацию, лучше использовать объект ХранилищеЗначения. Для этой задачи можно использовать методику сохранения условий отбора в базе данных.
Посмотрим на пример кода, который записывает настройки в регистр сведений (для этого можно создать специальный регистр, например, СохраненныеНастройкиПользователей с измерениями Пользователь (СправочникСсылка.Пользователи), ИмяОтчета (Строка) и ресурсом Настройки (ХранилищеЗначения)):
// Функция записывает настройки в базу данных
Процедура СохранитьНастройкиВБазу(ИмяОтчета, ТекущийПользователь)
// Извлекаем текущую структуру настроек СКД
ТекущиеНастройки = КомпоновщикНастроек.ПолучитьНастройки();
// Помещаем настройки в ХранилищеЗначения
АрхивНастроек = Новый ХранилищеЗначения(ТекущиеНастройки);
// Записываем настройки в регистр сведений
МенеджерЗаписи = РегистрыСведений.СохраненныеНастройкиПользователей.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Пользователь = ТекущийПользователь;
МенеджерЗаписи.ИмяОтчета = ИмяОтчета;
МенеджерЗаписи.Настройки = АрхивНастроек;
МенеджерЗаписи.Записать();
КонецПроцедуры
// Функция извлекает и применяет настройки при открытии
Процедура ВосстановитьНастройкиИзБазы(ИмяОтчета, ТекущийПользователь)
// Задаем параметры отбора для регистра сведений
Отбор = Новый Структура;
Отбор.Вставить("Пользователь", ТекущийПользователь);
Отбор.Вставить("ИмяОтчета", ИмяОтчета);
// Получаем запись из базы
ЗаписьРегистра = РегистрыСведений.СохраненныеНастройкиПользователей.Получить(Отбор);
Если ЗаписьРегистра.Настройки <> Неопределено Тогда
// Извлекаем настройки из хранилища
ВосстановленныеНастройки = ЗаписьРегистра.Настройки.Получить();
Если ТипЗнч(ВосстановленныеНастройки) = Тип("НастройкиКомпоновкиДанных") Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(ВосстановленныеНастройки);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Вызовы этих процедур также следует разместить в обработчиках событий формы ПередЗакрытием и ПриОткрытии соответственно.
Если вы ведете разработку в устаревшей типовой конфигурации 1С на обычных формах (например, УПП 1.3), в ней, скорее всего, уже присутствует штатный регистр сведений СохраненныеНастройки.
Для интеграции вашего отчета в эту систему не нужно писать код с нуля. Достаточно проанализировать модули аналогичных типовых отчетов и вызвать функции общего назначения, такие как УниверсальныйОтчет.СохранитьНастройки() или использовать стандартные платформенные методы ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр() для сериализации настроек СКД в текстовый формат и записи в существующий регистр.
Если вам не хочется писать много программного кода, можно решить задачу интерактивно, добавив элементы управления на форму отчета:
ТабличноеПоле и свяжите его с путем к данным: КомпоновщикНастроек.Настройки.Отбор. Это выведет стандартное окно настройки отборов на форму.КоманднаяПанель.После этого на командной панели автоматически появятся системные кнопки для сохранения и загрузки настроек отбора. Пользователь сможет самостоятельно сохранять различные конфигурации отборов в файлы на диске или во внутреннюю базу данных и быстро переключаться между ними в процессе работы.
---
Мы проанализировали различные варианты решения проблемы сброса отборов в отчетах СКД. Подведем итог: