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