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

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

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

Понимание ограничений динамического списка

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

Метод 1: Использование коллекции параметров динамического списка

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

Рассмотрим шаги реализации:

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

Список.Параметры.УстановитьПараметр("ТЗ", ВашаТаблицаЗначений);

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

Метод 2: Использование регистра сведений (архитектурный подход)

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

Разберем процесс по шагам:

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

Этот метод позволяет полностью использовать мощь языка запросов 1С, включая оператор ПОМЕСТИТЬ для создания временных таблиц внутри самого запроса.

Метод 3: Использование временного хранилища

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


АдресДанных = ПоместитьВоВременноеХранилище(ВашаТаблицаЗначений, Новый УникальныйИдентификатор);
Список.Параметры.УстановитьПараметр("АдресТЗ", АдресДанных);

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

Пост-обработка в процедуре ПриПолученииДанных

Если ваша задача заключается не в фильтрации, а в «дообогащении» данных (например, добавлении колонки с расчетами из ТаблицыЗначений), используйте событие ПриПолученииДанных на сервере. Это событие позволяет программно изменять значения полей динамического списка после того, как запрос уже отработал:


Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    Для Каждого Оформление Из ОформленияСтрок Цикл
        КлючСтроки = Оформление.ДанныеСтроки.Ссылка;
        // Поиск в заранее подготовленной коллекции
        Значение = МояКоллекция.Найти(КлючСтроки);
        Если Значение <> Неопределено Тогда
            Оформление.Ячейки.МояКолонка.УстановитьТекст(Значение.Результат);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Итоги

Выяснили, что выбор метода зависит от объема данных и целей обработки:

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

← На главную