К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как вывести динамический список в 1С

Как вывести динамический список в 1С: настройка запроса, основной таблицы, отборов и произвольного запроса. Примеры кода, типичные ошибки и проверка результата.

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

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

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

Создание реквизита формы типа «Динамический список»

Откройте нужную форму в конфигураторе и перейдите на вкладку «Реквизиты» в правой части окна редактора формы. Нажмите «Добавить реквизит», задайте имя (например, СписокДокументов) и в поле «Тип» выберите ДинамическийСписок. После выбора типа справа появится кнопка настройки свойств списка — именно там задаётся источник данных.

В окне настройки динамического списка ключевое свойство — «Основная таблица». Если нужно вывести содержимое одного объекта (например, справочника «Номенклатура» или журнала документов «РеализацияТоваровУслуг»), просто выберите эту таблицу из списка. Платформа сформирует запрос автоматически, и дополнительная настройка не потребуется.

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

Настройка запроса и основной таблицы

При работе с основной таблицей запрос формируется платформой: выбираются все доступные поля объекта, включая реквизиты и стандартные поля (Ссылка, Код, Наименование, Дата, Номер). В настройках списка можно снять лишние поля — это ускорит выполнение запроса, особенно на больших таблицах.

Для произвольного запроса откройте конструктор и напишите текст, например выборку остатков из виртуальной таблицы регистра накопления. Обязательно проверьте запрос кнопкой «Проверить» прямо в конструкторе: синтаксическая ошибка проявится только при открытии формы, и искать её будет сложнее.

bsl
ВЫБРАТЬ
	Остатки.Номенклатура КАК Номенклатура,
	Остатки.Склад КАК Склад,
	Остатки.КоличествоОстаток КАК Остаток
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки

Если в запросе используются параметры (в примере выше — &Период), их нужно установить до вывода данных, иначе список покажет пустой результат или ошибку. Параметры задаются программно в обработчике ПриСозданииНаСервере через свойство Параметры динамического списка.

Вывод списка на форму

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

У элемента таблицы проверьте свойство «ПутьКДанным» — оно должно указывать на ваш реквизит. Если таблица создана вручную, а не перетаскиванием, задайте это свойство сами, иначе элемент останется пустым.

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

Для произвольных запросов полезно явно задать ключевое поле списка (свойство «КлючевоеПоле» или поле с признаком «Ключевое» в настройке). Без ключевого поля платформа не сможет корректно позиционироваться на строках и обновлять список.

Программная установка отборов и параметров

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

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

Параметры запроса устанавливаются через метод УстановитьЗначениеПараметра:

bsl
СписокДокументов.Параметры.УстановитьЗначениеПараметра("Период", ТекущаяДатаСеанса());

Обратите внимание: отбор в динамическом списке применяется на уровне СКД, а не изменением текста запроса. Если условие должно срезать данные до выполнения запроса (например, параметр виртуальной таблицы), используйте именно параметры, а не отбор — так запрос выполнится быстрее.

Обновление списка и работа в режиме предприятия

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

bsl
Элементы.СписокДокументов.Обновить();

Чтобы пользователь мог менять настройки списка (отборы, сортировку, группировку) без конфигуратора, добавьте на форму командную панель таблицы со стандартной командой настройки списка или используйте свойство «АвтоЗаполнениеДоступныхНастроек». В типовых формах списков это уже реализовано.

Если список должен реагировать на изменение данных из других форм (например, проведение документа в отдельном окне), используйте ОповеститьОбИзменении() в месте записи и обработчик ОбработкаОповещения в форме со списком — это надёжнее, чем периодическое обновление по таймеру.
ПЗ
Практическое замечание

Типичные ошибки и ограничения

Чаще всего проблемы возникают из-за несоответствия между запросом и настройками формы. Пустой список при корректном запросе обычно означает незаполненный параметр или отбор, который отсекает все строки. Ошибка «Поле не найдено» появляется, когда в элементах формы или отборе используется поле, отсутствующее в запросе.

Типичные ошибки
01
Не установлен параметр произвольного запроса — список пустой или ошибка при открытии формы
02
Не задано ключевое поле в произвольном запросе — не работает позиционирование и обновление строк
03
Отбор по полю, которого нет в запросе — ошибка «Поле не найдено» при открытии
04
Выборка всех полей и отсутствие отборов на большой таблице — форма открывается очень долго
05
Попытка программно изменить текст запроса после создания формы без пересоздания настроек — изменения не применяются

У динамического списка есть принципиальные ограничения. В нём нельзя использовать временные таблицы и пакетные запросы — только один запрос-выборку. Некоторые конструкции языка запросов (например, итоги по иерархии в произвольных запросах) также не поддерживаются. Если запрос не укладывается в ограничения, альтернатива — таблица значений, заполняемая программно, но она теряет автоматическую порционную подгрузку.

Проверка результата

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

Контрольные точки

Как проверить результат

Отображение данных
Норма

Строки видны сразу после открытия формы

Тревожный признак

Пустая таблица при наличии данных в базе

Работа отборов
Норма

Изменение отбора меняет состав строк

Тревожный признак

Список не реагирует на установленный отбор

Обновление
Норма

Новая запись появляется в списке после записи

Тревожный признак

Строка появляется только после переоткрытия формы

Скорость
Норма

Форма открывается за секунды

Тревожный признак

Заметная задержка при открытии и прокрутке

Итог

Что важно запомнить

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

Частые вопросы

Можно ли вывести динамический список на обычной (неуправляемой) форме?

Нет, динамический список работает только в управляемых формах. В обычных формах для тех же задач используются табличное поле с типом «СписокСправочника»/«СписокДокументов» или таблица значений, заполняемая запросом.

Как вывести динамический список программно, без конфигуратора?

Полностью программно создать элементы формы можно в обработчике ПриСозданииНаСервере: изменить реквизиты через ИзменитьРеквизиты(), добавить элемент таблицы и привязать его к реквизиту. Однако на практике проще заранее создать реквизит и элемент в конфигураторе, а программно менять только запрос, отборы и параметры.

Почему изменение текста запроса программно не даёт эффекта?

После присвоения нового текста в свойство ТекстЗапроса нужно сбросить настройки компоновки: Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Очистить() и пересоздать колонки элемента таблицы, если состав полей изменился. Без этого форма использует старые настройки, ссылающиеся на прежние поля.

Как вывести в список поле из связанной таблицы?

Для основной таблицы платформа позволяет выбирать поля через точку (например, Контрагент.ИНН) — включите такое поле в настройке списка. В произвольном запросе добавьте левое соединение с нужной таблицей и выведите поле в выборку.

Чем динамический список лучше таблицы значений?

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