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

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

Как очистить реквизит табличной части в 1С

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

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

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

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

Что значит «очистить реквизит» и чем это отличается от очистки табличной части

У табличной части документа или справочника есть два разных действия. Первое — ТабличнаяЧасть.Очистить(), которое удаляет все строки. Второе — очистка отдельного реквизита: строки остаются, но значение в конкретной колонке сбрасывается.

Типичные сценарии, когда нужна именно очистка реквизита: сбросить процент скидки во всех строках заказа, убрать устаревшую характеристику номенклатуры, очистить колонку «Склад» перед новым заполнением, стереть вручную введённые цены, чтобы пересчитать их заново.

Очистка реквизита программно: цикл по строкам

Базовый способ — обход коллекции строк табличной части оператором Для Каждого … Цикл и присвоение реквизиту пустого значения. Это работает и в модуле объекта, и в модуле формы, и во внешней обработке.

Для Каждого СтрокаТовары Из Объект.Товары Цикл

СтрокаТовары.Скидка = 0;

КонецЦикла;

Тип присваиваемого значения должен соответствовать типу реквизита. Для числового реквизита — 0, для строкового — пустая строка "", для ссылочного — пустая ссылка конкретного типа, для реквизита составного типа удобно использовать Неопределено.

// Пустая ссылка для ссылочного реквизита

СтрокаТовары.Склад = Справочники.Склады.ПустаяСсылка();

// Для реквизита составного типа

СтрокаТовары.ЗначениеСвойства = Неопределено;

bsl
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    СтрокаТЧ.Серия = Справочники.СерииНоменклатуры.ПустаяСсылка();
КонецЦикла;

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

Ошибка типа — самая частая причина того, что очистка «не срабатывает» или вызывает исключение. Если реквизит строго типизирован, присвоение несовместимого значения приведёт к ошибке преобразования.

Тип реквизитаПустое значениеПример
Число0Стр.Количество = 0;
Строка""Стр.Комментарий = "";
Дата'00010101'Стр.СрокГодности = '00010101';
БулевоЛожьСтр.Отменено = Ложь;
СсылкаПустаяСсылка()Справочники.Склады.ПустаяСсылка()
Составной типНеопределеноСтр.Значение = Неопределено;

Для даты пустое значение — это первая дата календаря '00010101', а не Неопределено, если тип реквизита строго «Дата». Проверить, пуст ли реквизит после очистки, можно функцией ЗначениеЗаполнено() — она вернёт Ложь для любого пустого значения.

Очистка без программирования: групповое изменение реквизитов

В конфигурациях на Библиотеке стандартных подсистем есть типовая обработка «Групповое изменение реквизитов» (раздел «Администрирование» — «Обслуживание», либо «Все функции» — «Обработки»). Она позволяет массово установить значение реквизита, в том числе пустое, у выбранных объектов.

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

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

Очистка на форме и интерактивные сценарии

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

&НаКлиенте

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

ОчиститьСкидкиНаСервере();

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

&НаСервере

Процедура ОчиститьСкидкиНаСервере()

Для Каждого СтрокаТовары Из Объект.Товары Цикл

СтрокаТовары.Скидка = 0;

КонецЦикла;

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

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

Очистка с условием и дополнительные сценарии

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

Для Каждого СтрокаТовары Из Объект.Товары Цикл

Если СтрокаТовары.Номенклатура.ВидНоменклатуры = ВидУслуги Тогда

СтрокаТовары.Склад = Справочники.Склады.ПустаяСсылка();

КонецЕсли;

КонецЦикла;

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

Типичные ошибки
01
Использование ТабличнаяЧасть.Очистить() вместо очистки реквизита — удаляются все строки документа
02
Присвоение Неопределено строго типизированному реквизиту — ошибка преобразования типа
03
Очистка реквизита без последующего пересчёта сумм и итогов — документ становится неконсистентным
04
Массовая обработка проведённых документов без проверки последствий для движений по регистрам
05
Запуск группового изменения на рабочей базе без резервной копии

Проверка результата и ограничения

После очистки убедитесь, что реквизит действительно пуст: откройте несколько обработанных документов и проверьте колонку визуально, либо выполните запрос с условием НЕ ЗначениеЗаполнено(Реквизит) по табличной части.

Учитывайте ограничения: у проведённых документов очистка реквизита и перезапись могут потребовать перепроведения, если реквизит участвует в движениях по регистрам. В документах, попадающих в закрытый период, запись может быть запрещена датой запрета изменения данных. Также проверьте права: у пользователя, запускающего обработку, должны быть права на изменение объектов.

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

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

Значения в колонке
Норма

Во всех строках реквизит пуст, ЗначениеЗаполнено() возвращает Ложь

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

Часть строк сохранила старые значения — цикл не прошёл по всем строкам

Итоги и суммы документа
Норма

Итоги пересчитаны и соответствуют новым данным строк

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

Суммы остались старыми — не вызван пересчёт после очистки

Проведение документа
Норма

Документ проводится без ошибок после изменения

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

Ошибки проведения из-за обязательности очищенного реквизита

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

Чем отличается Очистить() у табличной части от очистки реквизита?

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

Как очистить реквизит только в выделенных строках на форме?

Используйте коллекцию выделенных строк элемента формы: пройдите по Элементы.Товары.ВыделенныеСтроки, получите каждую строку через Объект.Товары.НайтиПоИдентификатору() и присвойте реквизиту пустое значение.

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

Нет, язык запросов 1С предназначен только для чтения данных. Изменение выполняется объектным способом: получить объект, изменить строки, записать. Прямые UPDATE-запросы к базе в обход платформы недопустимы.

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

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

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

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

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

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

Итог

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

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