Как программно установить стандартные настройки динамического списка и обновить отборы во внешнем отчете?

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

В процессе работы с внешними отчетами и динамическими списками на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью программно управлять отборами и другими настройками. Обычная ситуация – желание предоставить пользователям "волшебные кнопки", которые автоматически применяют определенные группы отборов без необходимости вручную настраивать список. Однако, как показывает практика, простое изменение настроек в коде не всегда приводит к немедленному обновлению динамического списка на уже открытой форме, пока не будут установлены "стандартные настройки". Давайте подробно разберем, почему это происходит и как правильно реализовать программное управление настройками.

Ключевое различие: Настройки против ПользовательскиеНастройки

Прежде всего, давайте выясним принципиальную разницу между свойствами Настройки и ПользовательскиеНастройки объекта КомпоновщикНастроек. Это фундаментальное понимание помогает избежать многих ошибок:

  1. Настройки (Список.КомпоновщикНастроек.Настройки):
    • Представляют собой базовые или стандартные настройки, которые были определены разработчиком отчета или динамического списка.
    • Это своего рода "эталон", который задает начальное состояние и доступные возможности.
  2. ПользовательскиеНастройки (Список.КомпоновщикНастроек.ПользовательскиеНастройки):
    • Содержат изменения, внесенные пользователем поверх стандартных настроек.
    • Сюда относятся вручную установленные отборы, сортировки, условное оформление и другие персонализированные параметры.
    • Именно с этими настройками необходимо работать, если мы хотим применить изменения, которые будут действовать в текущем сеансе работы пользователя и не сохранятся перманентно как часть стандартных.

Ошибка в использовании Настройки вместо ПользовательскиеНастройки – распространенное заблуждение, которое не дает видимого результата, пока не будет произведен сброс к стандартным настройкам, по сути обнуляющий пользовательские изменения и возвращающий к базовым настройкам.

Почему удаление настроек из хранилища не приводит к немедленному обновлению

Многие программисты пытаются решить проблему, удаляя сохраненные настройки из ХранилищеСистемныхНастроек или ХранилищеПользовательскихНастроекОтчетов с помощью метода Удалить(). Давайте проанализируем эту ситуацию:

  1. Действие метода Удалить():
    • Метод Удалить() действительно удаляет записи о сохраненных настройках из базы данных 1С.
    • Это означает, что при следующем открытии формы или отчета пользователь увидит стандартные настройки, поскольку его персонализированные настройки были стерты из хранилища.
  2. Отсутствие немедленного эффекта на открытой форме:
    • Однако, удаление настроек из хранилища не приводит к немедленному обновлению или сбросу настроек на уже открытой форме.
    • Текущие настройки динамического списка в открытой форме продолжают действовать до тех пор, пока форма не будет явно обновлена или настройки не будут применены заново. Форма "помнит" свои текущие настройки, независимо от того, что хранится в базе данных.

Поэтому, чтобы добиться желаемого эффекта "сброса" или "применения" на уже открытой форме, нам нужны дополнительные действия.

Пошаговое решение: программная имитация "Установить стандартные настройки" и применение отборов

Для того чтобы программно "имитировать" нажатие кнопки "Установить стандартные настройки" и применить новые отборы на уже открытой форме, необходимо выполнить несколько ключевых шагов. Рассмотрим их подробно:

Шаг 1: Очистка пользовательских настроек отбора

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

Для этого мы обращаемся к коллекции элементов пользовательских настроек компоновщика и находим элемент, отвечающий за отбор. Затем очищаем его элементы:


// Получаем коллекцию элементов пользовательских настроек динамического списка
ПеременнаяПользовательскиеНастройки = Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;

// Находим в них элемент, соответствующий пользовательскому отбору
// ИдентификаторПользовательскойНастройки отбора берется из стандартных настроек
ПользовательскийОтбор = ПеременнаяПользовательскиеНастройки.Найти(Список.КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);

// Если элемент отбора найден, очищаем его, чтобы сбросить все пользовательские отборы
Если ПользовательскийОтбор <> Неопределено Тогда
    ПользовательскийОтбор.Элементы.Очистить();
КонецЕсли;

В этом коде Список – это наименование элемента формы типа "Динамический список", а Список.КомпоновщикНастроек – это компоновщик настроек этого списка. Важно использовать ИдентификаторПользовательскойНастройки из базовых Настройки, чтобы точно найти соответствующий элемент в ПользовательскиеНастройки.

Шаг 2: Применение новых или стандартных настроек

После очистки пользовательских настроек у нас есть несколько вариантов действий, в зависимости от нашей цели:

  1. Имитация полного сброса к стандартным настройкам (как если бы пользователь нажал "Установить стандартные настройки"):

    Для этого мы загружаем в компоновщик настроек его же базовые (стандартные) настройки. Это эффективно перезаписывает все текущие настройки на форме на те, что были заданы разработчиком.

    
    Список.КомпоновщикНастроек.ЗагрузитьНастройки(Список.КомпоновщикНастроек.Настройки);
    
  2. Применение программно заданных отборов (например, по нажатию "волшебной кнопки"):

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

    Рассмотрим пример добавления отбора по реквизиту "Валюта":

    
    // Очищаем текущие отборы компоновщика настроек, чтобы избежать дублирования или конфликтов
    // Это делается, если мы хотим полностью заменить отборы на новые, а не дополнять существующие
    Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Очистить();
    
    // Создаем новый элемент отбора
    НовыйЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновщикаНастроек"));
    
    // Устанавливаем левое значение (поле, по которому отбираем)
    НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновщикаНастроек("Валюта");
    
    // Устанавливаем вид сравнения (например, "Равно")
    НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновщикаНастроек.Равно;
    
    // Устанавливаем правое значение (конкретное значение для отбора)
    // Предполагается, что переменная ВалютаОбъект содержит ссылку на нужную валюту
    НовыйЭлементОтбора.ПравоеЗначение = ВалютаОбъект;
    
    // Включаем использование данного элемента отбора
    НовыйЭлементОтбора.Использование = Истина;
    
    // Пример: если требуется установить отбор по группе значений (например, по списку валют):
    // НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновщикаНастроек.ВГруппе;
    // НовыйСписокЗначений = Новый СписокЗначений;
    // НовыйСписокЗначений.Добавить(Валюта1);
    // НовыйСписокЗначений.Добавить(Валюта2);
    // НовыйЭлементОтбора.ПравоеЗначение = НовыйСписокЗначений;
    

    Важно помнить, что если вы хотите, чтобы программно добавленные отборы могли быть изменены пользователем и сохранялись как его личные настройки, их следует добавлять не в Список.КомпоновщикНастроек.Настройки.Отбор.Элементы, а в элементы пользовательского отбора, полученного на Шаге 1. Это позволит им стать частью персонализированных настроек пользователя.

    
    // Пример добавления отбора в пользовательские настройки
    Если ПользовательскийОтбор <> Неопределено Тогда
        НовыйЭлементПользовательскогоОтбора = ПользовательскийОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновщикаНастроек"));
        НовыйЭлементПользовательскогоОтбора.ЛевоеЗначение  = Новый ПолеКомпоновщикаНастроек("ТипНоменклатуры");
        НовыйЭлементПользовательскогоОтбора.ВидСравнения    = ВидСравненияКомпоновщикаНастроек.Равно;
        НовыйЭлементПользовательскогоОтбора.ПравоеЗначение = Справочники.ТипыНоменклатуры.Услуга; // Пример значения
        НовыйЭлементПользовательскогоОтбора.Использование = Истина;
    КонецЕсли;
    

Шаг 3: Обновление динамического списка на форме

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

Для этого используем метод Обновить() у элемента формы, представляющего динамический список:


Элементы.Список.Обновить();

Этот простой, но крайне важный шаг гарантирует, что пользователь увидит актуальные данные в соответствии с примененными вами программными настройками.

Особенности работы с динамическим списком во внешнем отчете

Стоит отдельно отметить, что работа с динамическим списком, встроенным во внешний отчет, имеет свои нюансы. Внешние отчеты часто используют собственную Систему Компоновки Данных (СКД) для формирования основного результата. Однако, динамический список, как правило, имеет свой собственный КомпоновщикНастроек, который управляет его отображением. Если динамический список напрямую не связан с результатом СКД отчета, то изменения нужно вносить именно в КомпоновщикНастроек самого динамического списка (как показано в примерах выше), а не в настройки СКД отчета. Это важно учитывать для корректного применения отборов.

Заключение

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

← На главную