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