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

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

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

Как очистить список значений в 1С: метод Очистить(), удаление элементов по условию, отбор строк таблицы значений, работа с динамическими списками. Примеры кода.

Список значений в 1С — это универсальная коллекция, которая используется для хранения наборов данных: отобранных элементов справочников, параметров отчётов, значений реквизитов формы. Во встроенном языке она представлена объектом СписокЗначений, и для её очистки существует штатный метод Очистить(), который удаляет все элементы за один вызов.

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

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

Полная очистка списка значений методом Очистить()

Самый простой и правильный способ удалить все элементы списка — вызвать метод Очистить(). Он применим и к СписокЗначений, и к Массив, и к ТаблицаЗначений, что делает его универсальным решением для большинства коллекций во встроенном языке 1С.

// Создаём и заполняем список

Список = Новый СписокЗначений;

Список.Добавить(Справочники.Номенклатура.НайтиПоКоду("0000001"));

Список.Добавить(Справочники.Номенклатура.НайтиПоКоду("0000002"));

// Очищаем список полностью

Список.Очистить();

// Проверка: количество элементов равно нулю

Если Список.Количество() = 0 Тогда

Сообщить("Список очищен");

КонецЕсли;

Метод Очистить() удаляет именно элементы списка, а не сам объект. Переменная продолжает существовать, ссылку на неё заново создавать не нужно — список можно сразу заполнять новыми значениями. Это важно, когда список является реквизитом формы: пересоздание объекта может «оторвать» его от элемента управления на форме.

Альтернативный вариант — присвоить переменной новый пустой список: Список = Новый СписокЗначений;. Такой приём работает, но если на старый список есть другие ссылки (например, он привязан к реквизиту формы или передан в другую процедуру), они продолжат указывать на заполненную коллекцию. Для форм безопаснее именно Очистить().

Удаление отдельных элементов списка

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

Список = Новый СписокЗначений;

Список.Добавить("Первый");

Список.Добавить("Второй");

Список.Добавить("Третий");

// Удаление по индексу (нумерация с нуля)

Список.Удалить(0); // удалён элемент "Первый"

// Удаление по найденному значению

Элемент = Список.НайтиПоЗначению("Третий");

Если Элемент <> Неопределено Тогда

Список.Удалить(Элемент);

КонецЕсли;

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

Выборочная очистка списка по условию

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

// Удаляем из списка все пустые ссылки

Для Индекс = -Список.Количество() + 1 По 0 Цикл

ТекущийЭлемент = Список[-Индекс];

Если НЕ ЗначениеЗаполнено(ТекущийЭлемент.Значение) Тогда

Список.Удалить(ТекущийЭлемент);

КонецЕсли;

КонецЦикла;

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

НовыйСписок = Новый СписокЗначений;

Для Каждого Элемент Из Список Цикл

Если ЗначениеЗаполнено(Элемент.Значение) Тогда

НовыйСписок.Добавить(Элемент.Значение, Элемент.Представление);

КонецЕсли;

КонецЦикла;

Список = НовыйСписок;

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

Очистка списка значений на форме

Если список значений является реквизитом формы (например, СписокНоменклатуры с типом «СписокЗначений») и отображается в табличном поле или поле списка, очистка выполняется тем же методом Очистить(), но с учётом контекста формы.

&НаКлиенте

Процедура ОчиститьСписок(Команда)

СписокНоменклатуры.Очистить();

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

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

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

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

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

Количество элементов после очистки
Норма

Список.Количество() возвращает 0

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

Количество больше нуля — очищался другой объект или метод не вызван

Отображение на форме
Норма

Таблица или поле списка пустые сразу после выполнения

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

Данные видны — проверьте имя реквизита и контекст процедуры

Повторное заполнение
Норма

Новые элементы добавляются в пустой список без дублей

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

Появляются старые значения — список не был очищен перед заполнением

Очистка таблицы значений и динамического списка

Термин «список» в 1С может означать разные объекты, и подход к очистке отличается. Таблица значений (ТаблицаЗначений) очищается тем же методом Очистить() — удаляются все строки, колонки сохраняются. Если нужно удалить строки по условию, удобно использовать НайтиСтроки() с последующим удалением найденных строк.

// Удаление строк таблицы значений по условию

ПараметрыОтбора = Новый Структура("Пометка", Истина);

НайденныеСтроки = ТаблицаДанных.НайтиСтроки(ПараметрыОтбора);

Для Каждого Строка Из НайденныеСтроки Цикл

ТаблицаДанных.Удалить(Строка);

КонецЦикла;

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

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

Как выбрать действие

Нужно удалить все элементы списка значенийВызовите Список.Очистить() — объект останется пригодным для повторного заполнения
Нужно удалить элементы по условиюОбходите список с конца и вызывайте Удалить(), либо соберите новый список из подходящих элементов
Список — реквизит формыИспользуйте Очистить() и не пересоздавайте объект через Новый СписокЗначений
На форме динамический списокМеняйте отбор или запрос динамического списка — метод Очистить() к нему неприменим

Производительность и работа с большими списками

Для списков из нескольких сотен элементов разницы между способами очистки практически нет. На больших коллекциях (десятки тысяч элементов и больше) поэлементное удаление через Удалить() в цикле работает заметно медленнее, чем полная очистка или сборка нового списка, поскольку каждое удаление требует сдвига элементов внутри коллекции.

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

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

Чем отличается Очистить() от присвоения Новый СписокЗначений?

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

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

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

Почему после Очистить() список на форме не обновился?

Чаще всего очищается локальная переменная, совпадающая по имени с реквизитом формы, либо список был пересоздан через Новый СписокЗначений, что разорвало связь с элементом управления. Проверьте, что метод вызывается именно у реквизита формы.

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

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

Удаляет ли Очистить() данные из базы?

Нет. Метод удаляет только элементы коллекции в памяти. Данные в информационной базе изменятся лишь в том случае, если очищенный список является реквизитом объекта и этот объект будет записан.

Итог

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

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