При разработке внешних обработок и документов на управляемых формах 1С разработчики часто задаются вопросом: можно ли передать табличную часть или таблицу значений в запрос динамического списка для удобного вывода, фильтрации и сортировки данных? Проанализируем особенности работы платформы, выясним причины имеющихся ограничений и рассмотрим рабочие альтернативные варианты решения этой задачи.
Попытка передать объект типа ТаблицаЗначений или ТабличнаяЧасть в качестве параметра запроса динамического списка приводит к ошибке. Разберем ключевые причины, почему платформа 1С ограничила такую возможность:
ТаблицаЗначений и ТабличнаяЧасть не поддерживают сериализацию в компоновщике настроек (возникает ошибка сериализации XDTO).Если динамический список требуется только для наложения пользовательских отборов, поиска и сортировки строк, воспользуемся стандартным функционалом управляемой формы. Таблица на форме, связанная с реквизитом типа ТабличнаяЧасть или ТаблицаЗначений, уже содержит встроенные механизмы фильтрации.
Пользователь может использовать команды контекстного меню или командной панели:
Таким образом, для простой интерактивной работы с данными в оперативной памяти создавать динамический список не требуется.
Рассмотрим ситуацию, когда табличная часть содержит ссылки на объекты базы данных (например, справочники или документы). В этом случае мы можем выгрузить колонку со ссылками в массив и передать его в стандартный параметр запроса динамического списка.
Посмотрим, как настраивается запрос в динамическом списке:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В (&МассивСсылок)
В программном коде управляемой формы передаем выгруженный массив в параметры динамического списка:
МассивСсылок = ТабличнаяЧастьОболочки.ВыгрузитьКолонку("Номенклатура");
Список.Параметры.УстановитьЗначениеПараметра("МассивСсылок", МассивСсылок);
Тип Массив успешно сериализуется, поэтому данный метод позволяет динамически ограничивать выборку в динамическом списке только элементами из нашей табличной части.
Если необходимо выполнять сложный анализ, группировку и наложение гибких отборов на данные табличной части, проанализируем вариант с использованием СКД. Система компоновки данных умеет работать с объектами из оперативной памяти и выводить результат не только в табличный документ, но и обратно в таблицу значений.
Для реализации этого подхода выполним следующие шаги:
ТаблицаИсточника).ТаблицаЗначений.В случаях, когда данные табличной части являются вычисляемыми и не имеют прямых ссылок в базе данных, а полноценный динамический список необходим, применимы физические таблицы базы данных.
Разберем алгоритм решения по шагам:
РегистрСведений, в котором среди измерений укажем ИдентификаторСеанса (или УникальныйИдентификатор).
ВЫБРАТЬ
НашРегистр.Идентификатор КАК Идентификатор,
НашРегистр.Номенклатура КАК Номенклатура,
НашРегистр.Количество КАК Количество
ИЗ
РегистрСведений.НашРегистр КАК НашРегистр
ГДЕ
НашРегистр.Идентификатор = &ТекущийИдентификатор
После завершения работы с формой промежуточные записи из регистра сведений удаляются.
Передать непосредственно ТабличнуюЧасть или ТаблицуЗначений в параметр запроса динамического списка невозможно в силу архитектурных ограничений платформы 1С. Для решения практических задач используем штатные отборы таблицы формы, механизм передачи массива ссылок в параметр ГДЕ Ссылка В (&Массив) или обработку данных с помощью СКД.