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

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

Динамический список в 1С: устройство, настройка и практика работы

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

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

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

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

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

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

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

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

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

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

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

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

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

Настройка отборов, сортировки и группировки

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

Программная установка отбора требуется, когда форма открывается с параметрами — например, список документов по конкретному контрагенту. Обычно это делается в обработчике ПриСозданииНаСервере: добавляется элемент отбора в настройки компоновщика с нужным полем, видом сравнения и значением.

Как программно установить отбор
  1. 1
    В обработчике ПриСозданииНаСервере обратитесь к Список.КомпоновщикНастроек.Настройки.Отбор
  2. 2
    Добавьте элемент: НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"))
  3. 3
    Задайте ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент")
  4. 4
    Установите ВидСравнения = Равно, ПравоеЗначение = параметр, Использование = Истина
  5. 5
    Откройте форму и проверьте, что список отфильтрован, а отбор виден пользователю

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

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

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

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

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

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

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

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

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

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

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

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

Отчёт на СКД

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

Эмпирическое правило простое: если пользователю нужно смотреть актуальные данные и открывать объекты — берите динамический список; если нужно вводить или менять данные прямо в таблице — таблицу значений; если нужен анализ с итогами — отчёт.

Типичные ошибки и как их проверить

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

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

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

Двойной клик по строке
Норма

Открывается форма соответствующего объекта

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

Ничего не происходит или открывается не тот объект — проверьте основную таблицу и поле ссылки

Запись нового объекта при открытом списке
Норма

Строка появляется в списке автоматически

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

Строка видна только после F5 — проверьте основную таблицу и настройки автообновления

Скорость прокрутки на рабочей базе
Норма

Прокрутка плавная, без заметных пауз

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

Список подвисает — анализируйте запрос и соединения

Для диагностики медленных списков полезно замерить время выполнения запроса через консоль запросов на копии рабочей базы и посмотреть план запроса средствами СУБД. Часто выясняется, что проблема решается одним параметром виртуальной таблицы или дополнительным индексом.

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

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

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

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

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

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

Как отключить автоматическое обновление списка?

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

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

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

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

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

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

Интерактивное добавление и копирование работают, только когда платформа однозначно определяет таблицу-источник новых объектов. Если запрос сложный (объединения, группировки) или основная таблица не указана, кнопки создания отключаются. Создание можно реализовать своей командой с открытием формы нового объекта.

Итог

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

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