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