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

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

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

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

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

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

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

Ручное удаление строк в режиме «Предприятие»

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

Если нужно удалить несколько строк подряд, выделите их с зажатой клавишей Shift (диапазон) или Ctrl (произвольные строки) и нажмите Delete. Программа удалит все выделенные строки одним действием. Это удобно, когда в документ по ошибке загрузили лишний блок позиций.

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

Когда ручного удаления недостаточно

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

Во многих конфигурациях есть встроенная обработка «Групповое изменение реквизитов» (в разделе «Администрирование»), но она меняет значения реквизитов и не умеет удалять строки табличных частей. Для таких задач пишут внешнюю обработку или используют консоль кода.

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

Как выбрать способ

Нужно убрать одну-две строки в одном документеУдалите вручную клавишей Delete и перепроведите документ
Нужно удалить строки по условию в одном документеИспользуйте цикл по табличной части с методом Удалить()
Нужно полностью очистить табличную частьВызовите метод Очистить() у табличной части объекта
Нужно обработать много документовНапишите внешнюю обработку с запросом по документам и работайте на копии базы

Программное удаление конкретной строки: метод Удалить()

У объекта табличной части (коллекции строк) есть метод Удалить(), который принимает либо саму строку, либо её индекс. Индексация строк начинается с нуля — это частый источник ошибок у начинающих.

// Удаление первой строки по индексу

Объект.Товары.Удалить(0);

// Удаление конкретной найденной строки

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

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

Объект.Товары.Удалить(Строка);

КонецЕсли;

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

Найденные = Объект.Товары.НайтиСтроки(Новый Структура("Номенклатура", НоменклатураСсылка));

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

Объект.Товары.Удалить(Строка);

КонецЦикла;

Удаление строк по условию в цикле

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

КоличествоСтрок = Объект.Товары.Количество();

Для Индекс = 1 По КоличествоСтрок Цикл

Строка = Объект.Товары[КоличествоСтрок - Индекс];

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

Объект.Товары.Удалить(Строка);

КонецЕсли;

КонецЦикла;

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

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

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

Если нужно удалить все строки, вызывать Удалить() в цикле не требуется — у коллекции есть метод Очистить(). Он удаляет все строки за один вызов и работает быстрее цикла.

Объект.Товары.Очистить();

Объект.Записать(РежимЗаписиДокумента.Проведение);

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

Особенности управляемых форм

В управляемых формах табличная часть на форме — это не объект документа, а данные формы (коллекция ДанныеФормыКоллекция). У неё тоже есть методы Удалить() и Очистить(), и они доступны на клиенте, поэтому удалять строки из реквизита формы можно без вызова сервера.

// На клиенте в управляемой форме

Объект.Товары.Очистить(); // Объект здесь — реквизит формы

// Удаление текущей строки таблицы формы

ТекущиеДанные = Элементы.Товары.ТекущиеДанные;

Если ТекущиеДанные <> Неопределено Тогда

Объект.Товары.Удалить(ТекущиеДанные);

КонецЕсли;

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

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

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

Содержимое документа
Норма

Строки удалены, документ записан без ошибок

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

Строки на месте — изменения не записаны, вызовите Записать()

Движения документа
Норма

После перепроведения движения соответствуют оставшимся строкам

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

В регистрах остались записи по удалённым позициям — документ не перепроведён

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

Удалены только строки, подпадающие под условие

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

Удалены лишние строки — проверьте условие и направление цикла

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

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

Вызовите метод Очистить() у табличной части: Объект.Товары.Очистить(). Это работает и на сервере с объектом документа, и в управляемой форме с реквизитом формы. После очистки не забудьте записать документ.

Почему в цикле удаляется не каждая подходящая строка, а через одну?

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

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

Если документ ещё не записан после удаления, закройте его без сохранения — строки вернутся. Если документ уже записан, восстановить строки можно только из резервной копии или введя их заново вручную. Команды «отменить удаление строки» в 1С нет.

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

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

Кнопка удаления строки неактивна в документе. Что делать?

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

Чем Удалить() отличается от Очистить()?

Удалить() убирает одну конкретную строку — по ссылке на строку или по индексу. Очистить() удаляет все строки табличной части за один вызов. Для полной очистки всегда используйте Очистить() — это проще и быстрее цикла с Удалить().

Итог

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

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