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

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

Как сделать динамический список на форме 1С

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

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

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

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

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

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

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

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

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

Произвольный запрос: когда нужен и как настроить

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

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

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

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

Обратите внимание на ЕСТЬNULL: при левом соединении отсутствующие остатки вернут NULL, что портит сортировку и отборы по числовой колонке. Всегда оборачивайте потенциально пустые числовые поля.

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

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

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

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

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

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

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

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

Параметры виртуальных таблиц (период остатков, отборы регистров) задаются иначе — через коллекцию «Параметры» списка:

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

Обновление списка при изменении данных

Динамический список по основной таблице обновляется автоматически: при записи документа или элемента справочника платформа перечитывает затронутые строки. Это работает, пока запрос простой и основная таблица указана корректно.

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

Элементы.Список.Обновить();

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

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

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

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

Список появляется сразу с нужным отбором

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

Сначала виден полный список, затем он перечитывается

Запись документа из списка
Норма

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

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

Новая запись не видна до ручного обновления

Скорость работы
Норма

Список открывается за секунды на рабочем объёме данных

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

Форма подвисает, в техножурнале длительные запросы

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

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

Не используйте в запросе функции и выражения, мешающие индексации: ПОДСТРОКА в условиях соединения, сравнение через ВЫРАЗИТЬ без необходимости. Отборы, которые пользователь меняет интерактивно, должны ложиться на индексированные поля — дата, номер, ссылка, стандартные реквизиты.

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

Альтернативы динамическому списку

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

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

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

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

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

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

Дерево значений

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

СКД с выводом в табличный документ

Нужен сложный отчётный вид с группировками и итогами. Ограничение: нет интерактивных команд работы с объектами

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

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

Итог

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

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

Почему в списке недоступны команды «Создать» и «Изменить»?

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

Как скрыть от пользователя возможность менять отбор?

Установите у элемента отбора свойство РежимОтображения в значение «Недоступный» либо добавляйте отбор не в пользовательские настройки, а в фиксированные настройки списка — тогда он не появится в диалоге настройки.

Можно ли вывести в списке поле, которого нет в базе, например вычисляемый признак?

Да, через выражение в произвольном запросе: ВЫБОР КОГДА ... ТОГДА ... КОНЕЦ. Учтите, что отбор и сортировка по такому полю будут работать медленнее, чем по хранимому реквизиту, так как индекс использовать нельзя.

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

При произвольном запросе с соединениями платформа не всегда может отследить изменения. Вызовите Элементы.Список.Обновить() в обработчике оповещения (ОбработкаОповещения) или после программной записи объекта.

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

В обработчике ПриСозданииНаСервере добавьте отбор по полю ответственного или автору со значением ПользователиИнформационнойБазы.ТекущийПользователь() (через соответствующий прикладной механизм получения ссылки пользователя). Для системных ограничений лучше использовать RLS на уровне прав доступа.

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

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