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

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

При разработке внешних обработок или взаимодействии между формами в среде 1С:Предприятие часто возникает задача получить данные отборов, установленные пользователем в другой форме. Однако если стандартные отборы доступны в свойстве списка, то условия, наложенные через строку поиска или сочетание клавиш Ctrl+F, ведут себя совершенно иначе. Разберем архитектурные особенности этой функциональности и выясним, какими способами можно извлечь актуальные данные поиска.

Почему поиск Ctrl+F не виден в свойстве Отбор динамического списка

Проанализируем механизм работы платформы при использовании строки поиска. Значение, которое пользователь вводит через стандартную строку поиска таблицы, не сохраняется в коллекции Список.Отбор и не попадает в элементы структуры Список.КомпоновщикНастроек.Настройки.Отбор на клиенте. Платформа 1С формирует эти критерии «на лету» только в момент компоновки результирующего запроса к базе данных.

Для чтения реальных критериев выборки существуют методы ПолучитьИсполняемуюСхемуКомпоновкиДанных() и ПолучитьИсполняемыеНастройкиКомпоновкиДанных(). Главная сложность заключается в том, что эти методы относятся к расширению элемента управления ТаблицаФормы для динамического списка, а не к самому прикладному объекту данных. Элемент управления ТаблицаФормы существует на сервере исключительно внутри контекстных вызовов своей «родной» формы. По этой причине вызвать эти методы напрямую из внешней обработки или из другой открытой формы невозможно.

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

Решение 1. Использование экспортной функции в модуле целевой формы или расширении

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

Разберем по шагам реализацию данного подхода:

  1. В модуле исходной формы создаем контекстную серверную функцию:
    
    &НаСервере
    Функция ПолучитьТекущиеИсполняемыеНастройкиНаСервере() Экспорт
        Возврат Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
    КонецФункции
    
  2. В вызывающей форме или внешней обработке обращаемся к целевой форме через полученную клиентскую ссылку и вызываем экспортный метод: ЛокНастройки = ФормаСписка.ПолучитьТекущиеИсполняемыеНастройкиНаСервере();

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

Решение 2. Прокси-вызовы через подсистему БСП или инструменты разработчика

Если конфигурация типовая и внесение изменений в исходную форму крайне нежелательно, проанализируем варианты вызова серверного контекста формы через существующие механизмы. В типовых конфигурациях на базе БСП (Библиотеки Стандартных Подсистем) и специализированных инструментах (например, в подсистемах Инструментов Разработчика) реализованы общие серверные прокси-процедуры, способные инициировать контекстное выполнение кода формы.

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

Решение 3. Перехват настроек в событии ПриПолученииДанныхНаСервере

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

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

Решение 4. Асинхронное взаимодействие через механизм оповещений

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

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

Таким образом, прямой доступ к условиям быстрого поиска Ctrl+F без контекста формы платформой не предусмотрен, однако использование прокси-методов, экспортных контекстных функций или механизма расширений позволяет полностью решить эту задачу.

← На главную