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