При работе с системой компоновки данных (СКД) часто возникает задача принудительно установить определенный вариант отчета для конкретного пользователя или группы пользователей. Казалось бы, достаточно загрузить настройки в компоновщик при создании формы, но на практике программисты часто сталкиваются с тем, что система игнорирует эти изменения и загружает «последние использованные» настройки. В этой статье мы подробно разберем, почему так происходит, и рассмотрим несколько надежных способов программной смены варианта отчета.
Рассмотрим ситуацию: вы пишете код в процедуре ПриСозданииНаСервере, загружаете настройки из хранилища, но при открытии видите стандартный вариант. Выясним причину этого поведения. Дело в том, что жизненный цикл формы отчета в 1С подразумевает автоматическое восстановление настроек. После выполнения кода в ПриСозданииНаСервере платформа инициирует стандартные механизмы загрузки настроек пользователя, которые просто перетирают ваши программные изменения. Чтобы победить это поведение, нам нужно либо вмешаться в процесс открытия формы «снаружи», либо использовать правильные обработчики событий «внутри» самой формы. Для исследования последовательности работы обработчиков формы можно использовать инструмент для изучения событий 1С.
Проанализируем самый элегантный и правильный с точки зрения архитектуры платформы способ. Если мы открываем отчет программно (например, из другой формы или через обработку), мы можем передать нужный вариант прямо в параметрах открытия. Платформа 1С поддерживает стандартный параметр КлючВарианта. Если он передан, форма сразу откроется с нужным вариантом, минуя загрузку последних использованных настроек.
Рассмотрим пример кода для открытия отчета с конкретным вариантом:
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("КлючВарианта", "Основной"); // Имя варианта из конфигуратора или GUID из хранилища
ОткрытьФорму("Отчет.МойОтчет.Форма", ПараметрыОткрытия);
Этот метод хорош тем, что он работает до того, как форма начала инициализироваться, и избавляет нас от необходимости писать сложную логику внутри самой формы отчета.
Если в вашей конфигурации не используется БСП (Библиотека стандартных подсистем) и варианты хранятся в стандартном системном хранилище, нам потребуется извлечь настройки вручную. Посмотрим на пример кода, который позволяет получить настройки конкретного варианта по его представлению или ключу:
ИмяОтчета = "Отчет.НовыйОтчет";
СписокВариантов = ХранилищеВариантовОтчетов.ПолучитьСписок(ИмяОтчета);
Для Каждого ЭлементСписка Из СписокВариантов Цикл
Если ЭлементСписка.Представление = "НужныйВариант" Тогда
КлючВарианта = ЭлементСписка.Значение;
Настройки = ХранилищеВариантовОтчетов.Загрузить(ИмяОтчета, КлючВарианта);
// Загружаем настройки в компоновщик
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Прервать;
КонецЕсли;
КонецЦикла;
Важный нюанс: метод ЗагрузитьНастройки() меняет внутреннее состояние компоновщика, но не всегда обновляет визуальное отображение на форме (заголовок варианта, доступные отборы). Если вы используете этот код внутри формы, его лучше размещать в событиях, которые срабатывают после инициализации стандартных настроек.
Разберем, в каких событиях формы лучше всего выполнять подмену варианта, чтобы избежать затирания настроек платформой. Для управления процессом загрузки в управляемых формах предусмотрены специализированные обработчики:
КлючВарианта.Если вы хотите гарантированно установить настройки «в лоб», можно использовать процедуру ПриОткрытии на клиенте или ПриСозданииНаСервере, но при этом необходимо отключить стандартное сохранение/восстановление настроек в свойствах формы (снять галочку «Автоматическое сохранение данных в настройках»). Однако это радикальный метод, который лишит пользователей удобства сохранения их собственных правок.
Посмотрим на ситуацию, когда вариант зашит непосредственно в макет СКД. Мы можем обратиться к свойству ВариантыНастроек самой схемы компоновки данных. Рассмотрим пример, который можно использовать в модуле отчета или формы:
// Получаем схему
Схема = Отчет.ПолучитьМакет("ОсновнаяСКД");
// Ищем нужный вариант по имени, заданному в конфигураторе
Вариант = Схема.ВариантыНастроек.Найти("Дополнительный");
Если Вариант <> Неопределено Тогда
// Загружаем настройки варианта в компоновщик
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Вариант.Настройки);
КонецЕсли;
После этого не забудьте обновить пользовательские настройки, иначе визуально в форме отчета ничего не изменится:
Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Отчет.КомпоновщикНастроек.Настройки.ПользовательскиеНастройки);
Для того чтобы программная смена варианта отчета СКД работала стабильно, придерживайтесь следующих правил:
Параметры с ключом КлючВарианта при вызове ОткрытьФорму.ПередЗагрузкойВариантаНаСервере, чтобы подменить ключ до того, как платформа начнет загрузку данных.КомпоновщикНастроек состоит из нескольких уровней: основные настройки и пользовательские настройки. Для корректного отображения в интерфейсе часто требуется обновлять оба уровня.КлючВарианта (Строка или УникальныйИдентификатор) совпадает с тем, что ожидает метод Загрузить.Проанализировав эти методы, вы сможете гибко управлять поведением отчетов и обеспечивать пользователям именно те данные, которые им необходимы в текущий момент.