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

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

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

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

Динамический список — это реквизит формы в 1С:Предприятии 8.3, который отображает данные из базы и автоматически обновляет их при изменениях. В отличие от обычной таблицы значений, он не хранит данные целиком в памяти клиента, а подгружает записи порциями по мере прокрутки, поэтому корректно работает даже с таблицами на миллионы строк.

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

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

Что такое динамический список и когда он нужен

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

Использовать динамический список стоит в трёх типовых случаях. Первый — формы списков справочников, документов, журналов: платформа создаёт их автоматически именно на динамических списках. Второй — подборы и панели на рабочем столе, где нужно показывать актуальные данные с отборами. Третий — произвольные выборки из нескольких таблиц, например остатки товаров с наименованиями из справочника номенклатуры.

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

Создание динамического списка через конструктор формы

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

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

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

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

Настройка произвольного запроса

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

Пример: выборка остатков товаров с наименованием номенклатуры. В тексте запроса соединяем виртуальную таблицу остатков со справочником, а поле ссылки выносим как ключевое. Важно: в произвольном запросе обязательно должно быть поле, однозначно идентифицирующее запись (обычно «Ссылка»), иначе список не сможет корректно работать с позиционированием и обновлением.

ВЫБРАТЬ

Остатки.Номенклатура КАК Ссылка,

Остатки.Номенклатура.Наименование КАК Наименование,

Остатки.КоличествоОстаток КАК Остаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки

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

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

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

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

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Список.ПроизвольныйЗапрос = Истина;

Список.ТекстЗапроса =

"ВЫБРАТЬ Док.Ссылка, Док.Контрагент, Док.Сумма

|ИЗ Документ.ЗаказПокупателя КАК Док

|ГДЕ Док.Организация = &Организация";

Список.ОсновнаяТаблица = "Документ.ЗаказПокупателя";

Список.Параметры.УстановитьЗначениеПараметра("Организация", ОрганизацияПоУмолчанию);

КонецПроцедуры

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

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

Отборы, сортировка и группировка

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

Программная установка отбора выглядит так:

ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(

Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Проведен");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = Истина;

ЭлементОтбора.Использование = Истина;

Сортировка задаётся свойством «Порядок» в настройках списка. Учитывайте, что сортировка по полю, не входящему в индекс таблицы, на больших объёмах заметно замедляет открытие и прокрутку списка. Для журналов документов естественная сортировка по дате обычно уже обеспечена платформой.

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

Если список тормозит при открытии, первым делом смотрите текст запроса: соединения без условий, выборка «звёздочкой» и отборы по неиндексированным реквизитам — три самые частые причины медленной работы.
ПЗ
Практическое замечание

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

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

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

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

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

Проверка результата и выбор альтернативы

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

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

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

Открытие формы
Норма

Список заполнен, ошибок в журнале регистрации нет

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

Ошибка запроса или пустой список при наличии данных

Запись нового элемента
Норма

Строка появляется в списке, курсор встаёт на неё

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

Список не обновляется или курсор теряется

Стандартные команды
Норма

Доступны «Создать», «Изменить», «Пометить на удаление»

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

Команды недоступны — не задана основная таблица

Прокрутка
Норма

Данные подгружаются без заметных пауз

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

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

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

Маршрут решения

Как выбрать инструмент

Нужен интерактивный список с автообновлением и командами созданияДинамический список с основной таблицей
Нужна выборка из нескольких таблиц с отборами для просмотраДинамический список с произвольным запросом
Нужны итоги, группировки и аналитикаОтчёт на СКД
Данные надо редактировать прямо в таблице формыТаблица значений

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

Можно ли создать динамический список без основной таблицы?

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

Почему динамический список пустой, хотя данные в базе есть?

Чаще всего причины три: не установлен параметр виртуальной таблицы запроса, сработал скрытый отбор (проверьте настройки компоновщика и фиксированный отбор) или у пользователя нет прав чтения на одну из таблиц запроса. Проверяйте в этом порядке.

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

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

Можно ли в произвольном запросе использовать временные таблицы?

Нет. Платформа сама дополняет текст запроса отборами и порядком, поэтому пакетные запросы и конструкция ИТОГИ в динамическом списке не поддерживаются. Если логика требует временных таблиц, выполните запрос отдельно и выведите результат в таблицу значений либо используйте отчёт на СКД.

Как сохранить настройки отбора пользователя между сеансами?

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

Итог

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

Динамический список создаётся добавлением реквизита формы с соответствующим типом: для простых задач достаточно указать основную таблицу, для сложных — включить произвольный запрос и установить параметры. Основная таблица сохраняет стандартные команды и позиционирование, а ограничения запроса (без ИТОГИ и временных таблиц) нужно учитывать заранее.