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