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