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

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

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

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

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

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

Что такое динамический список и где он настраивается

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

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

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

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

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

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

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

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

Как добавить отбор, сортировку и параметры

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

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

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

bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПометкаУдаления");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Ложь;
	ЭлементОтбора.Использование = Истина;
	ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
КонецПроцедуры

Как добавить колонку и настроить условное оформление

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

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

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

Как изменить список программно без изменения конфигурации

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

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

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

Маршрут решения

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

Нужно отфильтровать или отсортировать записи для себяИспользуйте «Ещё — Настроить список» в режиме предприятия
Условие обязательно для всех пользователей и не должно сниматьсяЗадайте отбор в свойствах реквизита списка или программно с режимом отображения «Недоступный»
Нужны данные из нескольких таблиц или вычисляемое полеВключите произвольный запрос и доработайте текст запроса
Конфигурация типовая и на поддержкеВыполните доработку через расширение конфигурации

Типовые ошибки и ограничения динамических списков

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

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

Третья типичная ситуация — попытка использовать в динамическом списке временные таблицы, пакетные запросы или несоединимые конструкции. Динамический список поддерживает только одиночный запрос-выборку: никаких «УНИЧТОЖИТЬ», «ПОМЕСТИТЬ» и нескольких запросов. Если логика требует предварительной подготовки данных, замените её вложенными запросами или виртуальными таблицами.

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

Как проверить результат после изменений

После изменения динамического списка проверку стоит выполнять в несколько шагов. Сначала откройте список в режиме предприятия и убедитесь, что данные отображаются и соответствуют ожидаемому отбору. Затем проверьте интерактивность: создание нового элемента из списка, открытие существующего, пометку удаления и проведение (для документов).

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

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

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

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

Открытие списка
Норма

Данные отображаются, условия отбора соблюдены

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

Ошибка запроса, пустой список или лишние записи

Команды формы
Норма

Работают «Создать», открытие, пометка удаления

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

Команды недоступны — проверьте основную таблицу

Пользовательский отбор
Норма

Настройки применяются и сочетаются с фиксированными условиями

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

Отбор ломает список или игнорируется

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

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

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

Задержки при каждой прокрутке — оптимизируйте запрос

Часто задаваемые вопросы

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

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

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

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

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

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

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

Нет. Динамический список поддерживает только одиночный запрос-выборку без пакетов, временных таблиц и инструкций ПОМЕСТИТЬ/УНИЧТОЖИТЬ. Сложную логику реализуйте через вложенные запросы, соединения и виртуальные таблицы регистров.

Как изменить список в типовой конфигурации, не снимая её с поддержки?

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

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

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

Итог

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

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