Как использовать свою форму настроек динамического списка в 1С 8.3

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

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

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

Подготовка к вызову формы настроек

Для начала проанализируем, какие данные необходимы для работы формы настроек. Динамический список использует объект КомпоновщикНастроек, который содержит в себе структуру доступных полей, текущие отборы, группировки, условия оформления и сортировку. Чтобы наша форма понимала, какие поля ей доступны, мы должны передать в неё источник доступных настроек.

Рассмотрим пример кода для вызова общей или произвольной формы настроек из формы списка:


&НаКлиенте
Процедура КомандаНастроитьСписок(Команда)
    
    // Подготавливаем параметры для открытия формы
    ПараметрыФормыНастроек = Новый Структура;
    ПараметрыФормыНастроек.Вставить("Заголовок", "Настройка отображения списка");
    
    // Важнейший параметр: ИсточникДоступныхНастроек. 
    // Без него в форме не будут видны поля компоновки.
    ПараметрыФормыНастроек.Вставить("ИсточникДоступныхНастроек", ЭтаФорма.Список.КомпоновщикНастроек.ПолучитьИсточникДоступныхНастроек());
    
    // Передаем текущие настройки
    ПараметрыФормыНастроек.Вставить("Настройки", ЭтаФорма.Список.КомпоновщикНастроек.Настройки);
    ПараметрыФормыНастроек.Вставить("ПользовательскиеНастройки", ЭтаФорма.Список.КомпоновщикНастроек.ПользовательскиеНастройки);
    ПараметрыФормыНастроек.Вставить("ФиксированныеНастройки", ЭтаФорма.Список.КомпоновщикНастроек.ФиксированныеНастройки);
    
    // Описываем оповещение, которое сработает после закрытия формы настроек
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияФормыНастроек", ЭтаФорма);
    
    // Открываем форму
    ОткрытьФорму("ОбщаяФорма.МояФормаНастроекСписка", 
                 ПараметрыФормыНастроек, 
                 ЭтаФорма, 
                 Истина, , , 
                 ОписаниеОповещения, 
                 РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
                 
КонецПроцедуры

Создание логики в форме настроек

В самой форме настроек (например, ОбщаяФорма.МояФормаНастроекСписка) необходимо создать реквизит с типом КомпоновщикНастроекКомпоновкиДанных. Назовем его КомпоновщикНастроек. При создании формы на сервере мы должны инициализировать этот компоновщик данными из параметров.

Рассмотрим серверный обработчик ПриСозданииНаСервере:


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

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

Способ 1: Использование метода Закрыть() с параметром

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

В форме настроек создадим команду "ОК" (или "Применить"):


&НаКлиенте
Процедура КомандаОК(Команда)
    // Возвращаем измененные пользовательские настройки
    Закрыть(КомпоновщикНастроек.ПользовательскиеНастройки);
КонецПроцедуры

Теперь вернемся в форму списка и реализуем процедуру ПослеЗакрытияФормыНастроек, которую мы указали при открытии:


&НаКлиенте
Процедура ПослеЗакрытияФормыНастроек(Результат, ДополнительныеПараметры) Экспорт
    
    Если Результат <> Неопределено Тогда
        // Результат в данном случае — это наши ПользовательскиеНастройки
        Список.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Результат);
        
        // Принудительно обновляем список, чтобы настройки применились визуально
        Элементы.Список.Обновить();
    КонецЕсли;
    
КонецПроцедуры

Способ 2: Прямое обращение к владельцу формы

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


&НаКлиенте
Процедура КомандаПрименить(Команда)
    
    // Проверяем, что владелец — это форма, у которой есть наш динамический список
    Попытка
        ВладелецФормы.Список.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(КомпоновщикНастроек.ПользовательскиеНастройки);
        ВладелецФормы.Элементы.Список.Обновить();
    Исключение
        Сообщить("Не удалось применить настройки напрямую к владельцу.");
    КонецПопытки;
    
КонецПроцедуры

Важные нюансы и рекомендации

Разберем несколько критически важных моментов, которые помогут избежать ошибок при работе с динамическими списками:

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

Выясним, почему иногда настройки не применяются. Чаще всего это происходит из-за того, что разработчик путает КомпоновщикНастроек.Настройки и КомпоновщикНастроек.ПользовательскиеНастройки. В управляемых формах приоритет имеют именно пользовательские настройки. Если вы изменили что-то в основных настройках компоновщика, но в пользовательских настройках для того же поля стоит другое значение — платформа применит пользовательское значение.

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

← На главную