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

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

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

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

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

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

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

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

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

Стандартные формы списков справочников, документов, регистров сведений и журналов документов построены именно на динамических списках. Когда вы открываете «Номенклатуру» или список заказов, вы уже работаете с динамическим списком, просто платформа скрывает эти детали.

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

Открытие стандартного списка через интерфейс

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

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

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

Программное открытие списка через ОткрытьФорму

На практике чаще всего требуется открыть список из кода — например, по кнопке на форме документа показать связанные записи регистра. Для этого используется метод ОткрытьФорму() с указанием имени формы и структуры параметров.

bsl
&НаКлиенте
Процедура ПоказатьДокументыКонтрагента(Команда)

	ПараметрыФормы = Новый Структура;
	Отбор = Новый Структура;
	Отбор.Вставить("Контрагент", Объект.Контрагент);
	ПараметрыФормы.Вставить("Отбор", Отбор);

	ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка",
		ПараметрыФормы, ЭтотОбъект);

КонецПроцедуры

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

Дополнительно можно передать параметры «РежимВыбора» (если список открывается для подбора значения), «ЗакрыватьПриВыборе», «МножественныйВыбор» и другие стандартные параметры форм. Полный перечень зависит от конкретной формы и версии платформы.

Порядок программного открытия списка
  1. 1
    Определите имя формы: ОбъектМетаданных.Вид.ФормаСписка или имя своей формы
  2. 2
    Сформируйте структуру отбора по нужным полям
  3. 3
    Поместите отбор в структуру параметров формы
  4. 4
    Вызовите ОткрытьФорму() с параметрами и владельцем
  5. 5
    Проверьте, что список открылся отфильтрованным и отбор виден пользователю

Создание формы с произвольным динамическим списком

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

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

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

bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Список.ПроизвольныйЗапрос = Истина;
	Список.ТекстЗапроса =
	"ВЫБРАТЬ
	|	Остатки.Номенклатура КАК Номенклатура,
	|	Остатки.КоличествоОстаток КАК Остаток
	|ИЗ
	|	РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки";
	Список.Параметры.УстановитьЗначениеПараметра("Период", ТекущаяДатаСеанса());

КонецПроцедуры

Настройка отборов, параметров и сортировки

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

Программно отбор устанавливается через Список.КомпоновщикНастроек.Настройки.Отбор. Для каждого элемента указывают поле, вид сравнения (равно, в списке, содержит и т. д.) и правое значение. Важно устанавливать свойство Использование в Истина, иначе элемент отбора будет создан, но не применён.

Параметры запроса устанавливаются отдельно — через Список.Параметры.УстановитьЗначениеПараметра(). Если параметр объявлен в тексте запроса, но значение ему не присвоено, список при открытии выдаст ошибку. Поэтому параметры принято инициализировать в обработчике ПриСозданииНаСервере ещё до первого обращения к данным.

Типичные ошибки и ограничения

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

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

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

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

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

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

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

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

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

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

Состав данных
Норма

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

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

Строк меньше — ищите скрытый отбор в настройках списка

Отбор при открытии
Норма

Список отфильтрован, условие видно в «Настроить список»

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

Список полный — проверьте имя поля и тип значения отбора

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

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

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

Данные устарели — проверьте свойство ОсновнаяТаблица

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

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

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

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

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

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

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

Да, если речь о стандартном списке объекта — достаточно вызвать ОткрытьФорму() с именем вида «Документ.ЗаказПокупателя.ФормаСписка», и платформа сгенерирует форму автоматически. Своя форма нужна только для произвольного запроса или нестандартного оформления.

Почему отбор, переданный при открытии, не срабатывает?

Чаще всего несовпадает тип значения (передана строка вместо ссылки или наоборот) либо поле отбора отсутствует в запросе списка. Проверьте имя поля по тексту запроса и тип значения через отладчик.

Как задать отбор по списку значений?

Программно — через коллекцию элементов отбора компоновщика настроек с видом сравнения «ВСписке» и правым значением типа СписокЗначений. Через структуру параметра «Отбор» в ОткрытьФорму такой отбор передать нельзя — там поддерживается только равенство.

Как обновить динамический список после записи данных?

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

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

Да. Передайте в параметрах формы «РежимВыбора» = Истина и при необходимости «ЗакрыватьПриВыборе» = Истина. Результат выбора обрабатывается в обработчике ОбработкаВыбора формы-владельца или через описание оповещения.

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

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

Итог

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

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