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