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

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

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

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

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

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

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

Как устроен динамический список и чем он отличается от других данных формы

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

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

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

Где встречаются динамические списки в типовых конфигурациях

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

Журналы документов, показывающие документы разных типов в одном списке, тоже реализованы через динамический список с запросом к нескольким таблицам. Аналогично устроены списки задач, взаимодействия в CRM-подобных блоках, различные рабочие места с табличными данными.

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

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

Чтобы добавить динамический список на форму, откройте форму в конфигураторе, перейдите на вкладку «Реквизиты» и добавьте реквизит с типом «ДинамическийСписок». Затем в свойствах реквизита задайте основную таблицу (например, «Документ.РеализацияТоваровУслуг») — платформа автоматически сформирует простой запрос по этой таблице.

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

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

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

Настройка отборов, сортировки и условного оформления

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

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

Сортировка по умолчанию задаётся либо в запросе (предложение УПОРЯДОЧИТЬ ПО), либо в настройках списка. Учтите: сортировка по неиндексированным полям на больших таблицах заметно замедляет подгрузку данных, поэтому для крупных баз сортировку лучше строить по дате, номеру или ссылке.

Произвольный запрос: возможности и ограничения

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

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

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

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

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

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

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

Типичные ошибки
01
Соединение с виртуальной таблицей остатков без отбора по периоду — запрос сканирует все итоги, форма открывается десятки секунд
02
Отбор по полю через точку (например, Контрагент.ИНН) — платформа добавляет скрытое соединение, резко растёт нагрузка на СУБД
03
Отсутствие основной таблицы у произвольного запроса — перестают работать команды создания, копирования и открытия объекта
04
Попытка редактировать сгруппированный список — при группировке в запросе интерактивное изменение данных невозможно по устройству платформы
05
Сортировка по вычисляемому полю на большой таблице — каждая прокрутка списка выполняет тяжёлую сортировку на сервере

Динамический список или таблица значений: что выбрать

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

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

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

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

Для списков объектов базы любого объёма; автообновление, отборы, стандартные команды. Ограничение: редактирование только по одной записи, нельзя свободно менять данные в памяти

Таблица значений

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

Отчёт на СКД

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

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

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

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

Форма открывается за 1–3 секунды, прокрутка плавная

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

Открытие занимает более 5–10 секунд, список подвисает при прокрутке

Работа стандартных команд
Норма

Создание, копирование, открытие объекта по двойному щелчку работают

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

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

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

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

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

Данные устаревают — проверьте, не заменён ли список таблицей значений

Корректность отборов
Норма

Отбор применяется к данным и сохраняется между сеансами

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

Отбор сбрасывается или фильтрует не те записи — проверьте программную установку отбора

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

Можно ли редактировать данные прямо в динамическом списке?

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

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

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

Как пользователю сохранить свой отбор, чтобы не настраивать его каждый раз?

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

Чем отличается отбор в динамическом списке от условия ГДЕ в запросе?

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

Можно ли вывести в динамическом списке остатки или цены товаров?

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

Почему после обновления конфигурации у пользователей сбросились настройки списка?

Если разработчик изменил состав полей запроса или ключевые свойства списка, сохранённые пользовательские настройки могут стать несовместимыми и перестать применяться. Это штатное поведение. Чтобы снизить риск, не переименовывайте поля запроса без необходимости, а после обновления проверьте типовые списки и при необходимости задайте новые настройки по умолчанию.

Итог

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

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