Можно ли передать табличную часть в динамический список в 1С?

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

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

Почему нельзя передать таблицу значений или табличную часть в динамический список

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

  1. Ограничение компоновщика настроек: Динамический список использует компоновщик настроек, данные которого постоянно передаются между клиентским и серверным контекстом. Типы ТаблицаЗначений и ТабличнаяЧасть не поддерживают сериализацию в компоновщике настроек (возникает ошибка сериализации XDTO).
  2. Принцип работы динамического списка: Динамический список предназначен исключительно для порционного считывания данных из физических таблиц СУБД (базы данных). Он не предназначен для работы с временными таблицами или источниками данных, находящимися в оперативной памяти сервера.

Альтернатива 1: Использование штатных возможностей таблицы управляемой формы

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

Пользователь может использовать команды контекстного меню или командной панели:

  1. «Найти» — для быстрого поиска нужного значения в выбранной колонке.
  2. «Отфильтровать по текущему значению» — для мгновенной установки отбора по значению активной ячейки.
  3. Сортировка по возрастанию или убыванию при нажатии на заголовок колонки.

Таким образом, для простой интерактивной работы с данными в оперативной памяти создавать динамический список не требуется.

Альтернатива 2: Передача массива ссылок в запрос динамического списка

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

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


ВЫБРАТЬ
	Номенклатура.Ссылка КАК Ссылка,
	Номенклатура.Код КАК Код,
	Номенклатура.Наименование КАК Наименование
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Ссылка В (&МассивСсылок)

В программном коде управляемой формы передаем выгруженный массив в параметры динамического списка:


МассивСсылок = ТабличнаяЧастьОболочки.ВыгрузитьКолонку("Номенклатура");
Список.Параметры.УстановитьЗначениеПараметра("МассивСсылок", МассивСсылок);

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

Альтернатива 3: Использование Системы компоновки данных (СКД)

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

Для реализации этого подхода выполним следующие шаги:

  1. Создадим схему компоновки данных и добавим набор данных типа Объект.
  2. Зададим имя источника данных (например, ТаблицаИсточника).
  3. В коде передадим нашу табличную часть или таблицу значений в настройки компоновщика макета через внешний набор данных.
  4. Выведем результат обработки СКД в реквизит формы с типом ТаблицаЗначений.

Альтернатива 4: Запись данных во временный регистр сведений

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

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

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

ВЫБРАТЬ
	НашРегистр.Идентификатор КАК Идентификатор,
	НашРегистр.Номенклатура КАК Номенклатура,
	НашРегистр.Количество КАК Количество
ИЗ
	РегистрСведений.НашРегистр КАК НашРегистр
ГДЕ
	НашРегистр.Идентификатор = &ТекущийИдентификатор

После завершения работы с формой промежуточные записи из регистра сведений удаляются.

Резюме

Передать непосредственно ТабличнуюЧасть или ТаблицуЗначений в параметр запроса динамического списка невозможно в силу архитектурных ограничений платформы 1С. Для решения практических задач используем штатные отборы таблицы формы, механизм передачи массива ссылок в параметр ГДЕ Ссылка В (&Массив) или обработку данных с помощью СКД.

← На главную