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

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

Динамический список в 1С: что это и как с ним работать

Динамический список в 1С: что это, как работает, чем отличается от обычного запроса. Настройка, произвольный запрос, отборы, типичные ошибки и FAQ.

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

Технически динамический список читает данные небольшими порциями по мере прокрутки, а не выгружает всю таблицу целиком. Это позволяет открывать списки документов с миллионами записей без зависания клиентского приложения. Платформа сама строит SQL-запрос к СУБД, кэширует прочитанные порции и отслеживает изменения затронутых таблиц.

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

Что такое динамический список и где он встречается

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

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

Отличие от обычной таблицы значений принципиально: таблица значений хранит данные в памяти целиком и не обновляется сама, а динамический список — это «окно» в базу данных. Выгрузив данные в таблицу, вы фиксируете снимок; работая через динамический список, вы всегда видите актуальное состояние.

Как платформа работает с динамическим списком

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

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

Динамический список поддерживает интерактивные действия пользователя: отбор, сортировку, поиск, группировку. Все эти операции платформа транслирует в SQL-запрос и выполняет на стороне СУБД, а не в памяти клиента, что критично для производительности.

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

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

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

Настройка произвольного динамического списка
  1. 1
    Откройте форму списка в конфигураторе и выделите реквизит типа ДинамическийСписок.
  2. 2
    Установите свойство ПроизвольныйЗапрос = Истина.
  3. 3
    Укажите свойство ОсновнаяТаблица, например Документ.РеализацияТоваровУслуг.
  4. 4
    Напишите текст запроса с полем Ссылка и нужными соединениями.
  5. 5
    Проверьте в пользовательском режиме: открытие объекта, отборы, сортировку и скорость прокрутки.

Пример запроса для списка документов с контрагентом и суммой:

ВЫБРАТЬ

Реализация.Ссылка КАК Ссылка,

Реализация.Номер КАК Номер,

Реализация.Дата КАК Дата,

Реализация.Контрагент КАК Контрагент,

Реализация.СуммаДокумента КАК Сумма

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

Отборы, сортировка и настройки пользователя

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

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

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

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

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

ЭлементОтбора.ПравоеЗначение = Параметры.Организация;

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

ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

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

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

Производительность и ограничения

Главное правило производительности динамического списка: запрос должен быть простым и опираться на индексированные поля. Сортировка по дате и номеру выполняется по стандартному индексу и работает быстро; сортировка или отбор по вычисляемому полю или по полю через точку («Контрагент.Наименование») заставляет СУБД перебирать значительно больше данных.

Избегайте в произвольных запросах списка соединений с виртуальными таблицами регистров без жёстких отборов, вложенных запросов с группировками и функций над полями в условиях. Каждая такая конструкция ломает план запроса на СУБД, и список, который должен открываться за секунду, начинает «думать» десятки секунд.

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

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

Скорость открытия списка
Норма

Первая порция строк появляется в течение 1–3 секунд

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

Форма висит, внизу строка «Получение данных» дольше 10 секунд

Работа команд объекта
Норма

Двойной клик открывает объект, доступны пометка на удаление и копирование

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

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

Автообновление
Норма

Новый документ другого пользователя появляется в списке без переоткрытия

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

Изменения видны только после закрытия и повторного открытия формы

Ещё одно ограничение: динамический список нельзя программно перебрать «построчно» как таблицу значений. Если нужна обработка всех записей — выполняйте отдельный запрос. Список предназначен только для интерактивного отображения.

Динамический список или другие варианты отображения данных

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

Сравнение вариантов

Динамический список

Живые данные с автообновлением, отборы и сортировка на СУБД. Подходит для форм списков и рабочих мест. Нельзя перебрать построчно в коде.

Таблица значений на форме

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

Отчёт на СКД

Группировки, итоги, диаграммы, гибкие пользовательские настройки. Не предназначен для интерактивной работы с объектами (открытие, пометка).

Итог

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

Динамический список — это «живое окно» в базу данных: порционное чтение, автообновление и выполнение отборов на стороне СУБД. Для произвольного запроса обязательно укажите основную таблицу и поле Ссылка, а производительность обеспечивайте простым запросом по индексированным полям.

Частые вопросы о динамических списках

Почему список не обновляется автоматически после записи документа?

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

Как открыть форму списка с уже установленным отбором?

Передайте в параметрах формы структуру с ключом «Отбор», где имя свойства — имя поля, а значение — искомое значение. Например, при программном открытии: ПараметрыФормы = Новый Структура("Отбор", Новый Структура("Организация", Организация)). Платформа сама применит отбор к динамическому списку.

Можно ли добавить в список колонку с остатком товара?

Технически да — через произвольный запрос с соединением к виртуальной таблице остатков. Но это один из самых «тяжёлых» сценариев: на больших базах список будет тормозить. Лучше ограничить выборку отбором по складу или номенклатуре либо вынести остатки в отдельный отчёт.

Чем динамический список отличается от запроса в коде?

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

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

Потому что не указано свойство «ОсновнаяТаблица» у реквизита списка или в выборке запроса отсутствует поле «Ссылка». Платформа не понимает, к какому объекту базы относится строка, и отключает объектные команды.

Как сбросить пользовательские настройки списка?

В типовых конфигурациях откройте «Ещё — Настроить список» и удалите лишние отборы, либо используйте команду «Установить стандартные настройки», если она доступна. Администратор может очистить настройки пользователя централизованно через обработку управления настройками форм.