Как передать таблицу значений в параметр динамического списка в 1С?

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

При разработке управляемых форм в 1С:Предприятие часто возникает необходимость ограничить вывод данных в динамическом списке на основе некоторого набора записей. Попытка передать объект типа ТаблицаЗначений напрямую в параметр динамического списка через метод Список.Параметры.УстановитьЗначениеПараметра() приводит к ошибке выполнения.

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

Выясним причину ошибки и ограничения платформы

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

Объект ТаблицаЗначений является сложным неколлекционируемым типом и не удовлетворяет этим требованиям. В отличие от обычного объекта Запрос, где таблицу значений можно передать как параметр и поместить во временную таблицу через менеджер временных таблиц, передать ТаблицуЗначений напрямую в параметры динамического списка нельзя.

Способ 1. Передача массива или списка значений

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

Рассмотрим по шагам, как реализовать этот подход:

  1. Выгрузим необходимую колонку из таблицы значений в массив.
  2. В тексте запроса динамического списка укажем условие с оператором В: ГДЕ Поле В (&МассивЗначений).
  3. Установим параметр динамического списка на сервере.

Посмотрим на пример кода:


// Выгружаем колонку с необходимыми ссылками из ТЗ в массив
МассивЗначений = ТЗ.ВыгрузитьКолонку("Ссылка");

// Передаем массив в параметр динамического списка
Список.Параметры.УстановитьЗначениеПараметра("МассивЗначений", МассивЗначений);

Способ 2. Использование программного отбора динамического списка

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

Разберем пример программного добавления отбора:


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

Способ 3. Использование физических служебных таблиц в базе данных

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

  1. Запишем данные таблицы значений во временный или служебный регистр сведений (или специальную табличную часть) с привязкой к уникальному ключу сеанса.
  2. В запросе динамического списка свяжем основную таблицу с данным регистром по ключевому полю и идентификатору.
  3. В параметр динамического списка передадим только простой идентификатор (например, УникальныйИдентификатор сеанса или пользователя).
  4. После завершения работы с формой или при ее закрытии удалим служебные данные из регистра.

Пример передачи параметра сеанса в динамический список:


// Передаем только простой идентификатор сеанса в параметр
Список.Параметры.УстановитьЗначениеПараметра("ИдентификаторСеанса", КлючСеанса);

Способ 4. Динамическое изменение текста запроса

Для небольших наборов данных можно программно сформировать условие ГДЕ или построить конструкцию ВЫБРАТЬ ... ОБЪЕДИНИТЬ ВСЕ ... непосредственно в свойстве Список.ТекстЗапроса на сервере.

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

Способ 5. Безопасная установка параметров с помощью БСП

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

Проанализируем вызов такой функции:


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

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

Способ 6. Замена динамического списка на таблицу значений формы

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

← На главную