Как открыть форму списка документов с фильтром по массиву ссылок в 1С

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

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

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

Способ 1. Использование параметра формы Отбор

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

Допустим, у нас есть массив МассивЗаказов. Нам нужно открыть форму списка документов ЗаказКлиента, отфильтрованную по этому массиву. Проанализируем следующий код:


// Формируем структуру отбора
Отбор = Новый Структура("Ссылка", МассивЗаказов);

// Помещаем отбор в параметры формы
ПараметрыФормы = Новый Структура("Отбор", Отбор);

// Открываем форму с параметрами
ОткрытьФорму("Документ.ЗаказКлиента.ФормаСписка", ПараметрыФормы);

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

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

Способ 2. Программное добавление элемента отбора в Компоновку Данных

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

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


Если НовыеЗаказы.Количество() > 0 Тогда
    // Открываем форму и получаем ее объект. 
    // Используем УникальныйИдентификатор, чтобы всегда создавалось новое окно
    Форма = ОткрытьФорму("Документ.ЗаказКлиента.Форма.ФормаСписка", , , Новый УникальныйИдентификатор); 
    
    // Добавляем новый элемент отбора в динамический список "Список"
    НовыйОтбор = Форма.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); 
    
    // Настраиваем левое значение — поле, по которому фильтруем
    НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка"); 
    
    // Устанавливаем вид сравнения "В списке"
    НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; 
    
    // Устанавливаем правое значение — наш массив ссылок
    НовыйОтбор.ПравоеЗначение = НовыеЗаказы; 
    
    // Активируем использование отбора
    НовыйОтбор.Использование = Истина; 
Иначе
    Сообщить("Массив ссылок пуст, открывать форму нет смысла.");    
КонецЕсли;

В этом примере мы используем объект ПолеКомпоновкиДанных. Это критически важно, так как динамические списки в управляемых формах работают на механизме системы компоновки данных (СКД). Обратите внимание на использование УникальныйИдентификатор — это гарантирует, что если форма списка уже была открыта ранее с другими фильтрами, система создаст для нас новый экземпляр формы с чистого листа.

Способ 3. Использование инструментов БСП

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

Для установки отбора удобно использовать процедуру УстановитьЭлементОтбораДинамическогоСписка. Она берет на себя проверку на существование уже имеющихся отборов и корректное добавление новых. Рассмотрим пример:


// Пример использования БСП для установки отбора
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(
    Список.Отбор, 
    "Ссылка", 
    МассивСсылок, 
    ВидСравненияКомпоновкиДанных.ВСписке
);

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

Различие между параметром «Отбор» и «ФиксированныеНастройки»

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

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

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

Когда мы ограничиваем список документов, часто нам нужно решить сопутствующие задачи. Рассмотрим, какие параметры могут нам помочь:

  1. ТекущаяСтрока — позволяет не только отфильтровать список, но и сразу сфокусировать курсор на конкретном документе. Если в структуре параметров передать Параметры.Вставить("ТекущаяСтрока", НужнаяСсылка), система сама найдет этот документ в списке и выделит его.
  2. РежимВыбора — если форма открывается для того, чтобы пользователь выбрал один из предложенных документов, установите этот параметр в значение Истина.
  3. МножественныйВыбор — если нужно позволить пользователю выбрать сразу несколько документов из отфильтрованного списка с помощью клавиши Ctrl или Shift.

Ограничения и производительность

Важно помнить о производительности. Если ваш массив содержит тысячи ссылок, использование вида сравнения ВСписке может замедлить работу динамического списка, так как СУБД придется обрабатывать тяжелый запрос. В ситуациях с огромным количеством документов лучше пересмотреть архитектуру: например, использовать временные таблицы или помечать нужные документы каким-либо временным признаком (реквизитом), по которому и делать простой отбор.

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

← На главную