При переносе пользовательских вариантов отчетов из одной информационной базы в другую программисты 1С часто сталкиваются с проблемой: варианты отчета успешно появляются в списке доступных настроек, но при их выборе отчет не применяет сохраненную структуру, отборы и параметры. Проанализируем причину такого поведения платформы и разберем, как правильно организовать программный перенос настроек.
Рассмотрим, как устроено хранение вариантов отчетов в платформе 1С:Предприятие 8.3. Данные о настройках отчетов размещаются на нескольких уровнях:
ХранилищеВариантовОтчетов) — хранит основные пользовательские варианты и их наименования.ХранилищеСистемныхНастроек) — содержит вспомогательную информацию, служебные связи и конфигурационные параметры отображения вариантов отчета для пользователей.ВариантыОтчетов.Если перенести данные исключительно из ХранилищеВариантовОтчетов, платформа создаст элементы в списке вариантов, однако при выборе конкретной настройки интерфейсный механизм не сможет связать её с системными настройками. В результате вариант оказывается «пустым» и настройки компоновки данных не восстанавливаются.
Посмотрим на пример выгрузки вариантов настроек отчетов во внешний файл XML с использованием объекта СериализаторXDTO:
Процедура СохранитьНастройки(Кнопка)
НовыйСXDTO = Новый СериализаторXDTO(ФабрикаXDTO);
Путь = "e:\config.xml";
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(Путь);
МенеджерХранилища = ХранилищеВариантовОтчетов;
Настройки = МенеджерХранилища.Выбрать();
Табл = Новый ТаблицаЗначений;
Табл.Колонки.Добавить("КлючОбъекта");
Табл.Колонки.Добавить("КлючНастроек");
Табл.Колонки.Добавить("Настройки");
Табл.Колонки.Добавить("Пользователь");
Табл.Колонки.Добавить("Представление");
Пока Настройки.Следующий() Цикл
Стр = Табл.Добавить();
Стр.КлючНастроек = Настройки.КлючНастроек;
Стр.КлючОбъекта = Настройки.КлючОбъекта;
Стр.Настройки = Настройки.Настройки;
Стр.Пользователь = Настройки.Пользователь;
Стр.Представление = Настройки.Представление;
КонецЦикла;
Запись.ЗаписатьОбъявлениеXML();
НовыйСXDTO.ЗаписатьXML(Запись, Табл, НазначениеТипаXML.Явное, ФормаXML.Элемент);
Запись.Закрыть();
КонецПроцедуры
При загрузке данных в целевую базу считывание из XML выполняется следующим образом:
Процедура ВосстановитьНастройки(Кнопка)
НовыйСXDTO = Новый СериализаторXDTO(ФабрикаXDTO);
Путь = "e:\config.xml";
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(Путь);
МенеджерХранилища = ХранилищеВариантовОтчетов;
Табл = НовыйСXDTO.ПрочитатьXML(Чтение);
Опис = Новый ОписаниеНастроек;
Для Каждого Стр Из Табл Цикл
Опис.КлючОбъекта = Стр.КлючОбъекта;
Опис.КлючНастроек = Стр.КлючНастроек;
Опис.Пользователь = Стр.Пользователь;
Опис.Представление = Стр.Представление;
МенеджерХранилища.Сохранить(Стр.КлючОбъекта, Стр.КлючНастроек, Стр.Настройки, Опис, Стр.Пользователь);
КонецЦикла;
Чтение.Закрыть();
КонецПроцедуры
Чтобы варианты отчетов не только отображались в списке, но и успешно восстанавливали свои настройки при открытии, необходимо применить следующий комплекс мер:
ХранилищеВариантовОтчетов следует выгрузить и восстановить записи из менеджера ХранилищеСистемныхНастроек. Именно в нем платформа хранит сопоставления выбранных пользователем вариантов и текущих форм отчетов.НастройкиКомпоновкиДанных рекомендуется помещать их в ХранилищеЗначения для предотвращения искажения типов при XDTO-сериализации.Если нет необходимости писать собственный программный перенос для всей базы, рассмотрим готовые интерактивные варианты: