Как правильно управлять сохранением и применением пользовательских настроек СКД в 1С?

Программист 1С v8.3 (Управляемые формы)
← К списку

При работе с Системой Компоновки Данных (СКД) в 1С:Предприятии разработчики часто сталкиваются с ситуацией, когда программно установленные настройки отчета (отборы, параметры, поля) сбрасываются или игнорируются при открытии отчета пользователем. Пользователи могут нажать кнопку «Установить стандартные настройки», или же их ранее сохраненные настройки автоматически применяются, перекрывая наши программные установки. Давайте разберемся, почему это происходит и как обеспечить корректное применение наших настроек.

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

Понимаем жизненный цикл настроек СКД

Прежде чем погружаться в код, давайте рассмотрим, как работают настройки в СКД и в какой последовательности они загружаются. Это ключевой момент для понимания, почему наши настройки могут "сбрасываться".

  1. Настройки варианта отчета: Это базовые настройки, определенные в конфигураторе или в режиме предприятия при создании варианта отчета. Они являются основой.
  2. ПользовательскиеНастройки: Это настройки, которые конечный пользователь сохраняет для себя. Они применяются "поверх" настроек варианта отчета. Если пользователь изменил отбор или параметр и сохранил его, эти значения будут приоритетными.
  3. ФиксированныеНастройки: Это настройки, которые обычно задаются программно и не доступны для изменения пользователем. Важно, чтобы они не пересекались с пользовательскими, чтобы избежать путаницы.

Платформа 1С имеет определенную последовательность загрузки этих настроек, которая происходит на сервере:

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

Главная причина "сброса" наших настроек: Если мы пытаемся установить программные значения в ПередЗагрузкойВариантаНаСервере(), а у пользователя есть сохраненные пользовательские настройки (например, он изменил тот же параметр), то его сохраненные настройки перезапишут наши. Именно поэтому мы видим, что "все встает на места как должно быть" при нажатии "Установить стандартные настройки" – ведь при этом пользовательские настройки игнорируются.

Ключевые механизмы и объекты СКД

Давайте подробнее рассмотрим объекты и свойства, которые нам понадобятся для эффективного управления настройками.

ИдентификаторПользовательскойНастройки

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

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


ЭлементОтбора.ИдентификаторПользовательскойНастройки = "МойУникальныйОтбор";

Серверные события формы отчета СКД

Мы уже упоминали их, но давайте проанализируем их роль подробнее:

"Автосохранение данных"

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

"Режим отображения = Быстрый выбор" (Быстрый доступ)

Это свойство элемента настройки позволяет вывести его на основную форму отчета для быстрого доступа. Если вы программно добавляете отбор или параметр и хотите, чтобы пользователь мог легко его изменить, установите для него РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ.


ЭлементНастройки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;

Решение проблемы: Корректное управление настройками

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

1. Переопределение пользовательских настроек в ПередЗагрузкойПользовательскихНастроекНаСервере

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

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

Рассмотрим подробнее шаги:

  1. Получаем доступ к текущим настройкам: В этой процедуре мы работаем с объектом Настройки, который является коллекцией пользовательских настроек.
  2. Очищаем существующие пользовательские настройки (при необходимости): Если наша цель – полностью перезаписать то, что сохранил пользователь, мы можем очистить коллекцию настроек. Это полезно, если вы хотите, чтобы пользователь каждый раз начинал с "чистого листа" или ваших настроек по умолчанию. Если же вам нужно только изменить конкретные параметры, очищать все не стоит.
  3. 
    // Если нужно полностью очистить пользовательские настройки,
    // чтобы применить только свои:
    Настройки.Элементы.Очистить(); 
    
  4. Программно добавляем или изменяем параметры/отборы: Теперь мы можем добавлять свои отборы и параметры.

Посмотрим на пример программного добавления отбора:


// В процедуре ПередЗагрузкойПользовательскихНастроекНаСервере(Настройки)
// ...

// Получаем доступ к компоновщику настроек
КомпоновщикНастроек = Отчет.КомпоновщикНастроек;

// Получаем текущие настройки компоновщика
ТекущиеНастройки = КомпоновщикНастроек.Настройки;

// Пример 1: Добавление нового элемента отбора
// Создаем новый элемент отбора
НовыйОтбор = ТекущиеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

// Указываем поле, по которому будем отбирать
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");

// Устанавливаем вид сравнения
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

// Устанавливаем правое значение (конкретную организацию)
// Здесь мы можем получить значение из формы или других источников
НовыйОтбор.ПравоеЗначение = Справочники.Организации.НайтиПоКоду("000000001"); 

// Устанавливаем использование отбора
НовыйОтбор.Использование = Истина;

// Указываем, что это пользовательская настройка и даем ей уникальный идентификатор
// Это важно, чтобы платформа могла связать ее с пользовательскими настройками
НовыйОтбор.ИдентификаторПользовательскойНастройки = "ОтборПоОрганизацииПоУмолчанию";

// Если хотим, чтобы отбор отображался на форме отчета в быстром доступе
НовыйОтбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;

// Пример 2: Изменение значения существующего параметра
// Допустим, у нас есть параметр "ДатаНачала" в СКД
ПараметрДатаНачала = ТекущиеНастройки.ПараметрыДанных.НайтиПараметр("ДатаНачала");

Если ПараметрДатаНачала <> Неопределено Тогда
    // Устанавливаем значение параметра
    ПараметрДатаНачала.Значение = НачалоМесяца(ТекущаяДата());

    // Устанавливаем использование параметра
    ПараметрДатаНачала.Использование = Истина;

    // Также устанавливаем идентификатор для связи с пользовательскими настройками
    ПараметрДатаНачала.ИдентификаторПользовательскойНастройки = "ДатаНачалаОтчета";
КонецЕсли;

// ...

Важный момент: Если вы очищаете Настройки.Элементы, а затем добавляете свои настройки, убедитесь, что вы снова устанавливаете все необходимые параметры, которые должны быть доступны пользователю, включая ИдентификаторПользовательскойНастройки и РежимОтображения.

2. Инициализация настроек для первого открытия в ПередЗагрузкойВариантаНаСервере

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

Различие: Используйте ПередЗагрузкойВариантаНаСервере для установки значений по умолчанию, которые будут применяться, если нет пользовательских настроек. Используйте ПередЗагрузкойПользовательскихНастроекНаСервере для переопределения или дополнения *уже существующих* пользовательских настроек.


// В процедуре ПередЗагрузкойВариантаНаСервере(Настройки)
// ...

// Получаем текущие настройки компоновщика
КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
ТекущиеНастройки = КомпоновщикНастроек.Настройки;

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

// ...

Дополнительные полезные практики

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

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

← К списку