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