Массовое удаление строк в 1С 8.3: от выделения мышью до кода на встроенном языке
Содержание
Чтобы удалить несколько строк в 1С, выделите их мышью с зажатым Shift (подряд) или Ctrl (вразброс) и нажмите Delete. В табличной части документа строки исчезнут сразу, а в списке справочника или журнале документов те же действия только поставят пометку удаления. Окончательно помеченные объекты убирает обработка «Удаление помеченных объектов».
Ручного выделения хватает на десятки строк. Когда их сотни или строки надо отобрать по условию (нулевое количество, конкретная номенклатура, старые документы), подключают обработки или код на встроенном языке. Приёмы ниже работают на платформе 8.3 в интерфейсе «Такси» и подходят для БП 3.0, ЗУП 3.1, УТ 11 и ERP: механизм выделения и удаления задаёт платформа, а не конфигурация.
Табличная часть или список: в чём разница
Прежде чем удалять, определите, с чем работаете. От этого зависит, что произойдёт после нажатия Delete.
| Где строки | Что делает Delete | Можно ли вернуть |
|---|---|---|
| Табличная часть документа (товары, услуги, сотрудники) | Удаляет строку из формы сразу | Да, пока документ не записан |
| Список справочника, журнал документов | Ставит или снимает пометку удаления | Да, повторным Delete |
| Помеченные объекты после обработки удаления | Объект стёрт из базы | Только из резервной копии |
| Записи регистра сведений (цены, курсы, ставки) | Удаляет запись сразу, без пометки | Только из резервной копии или истории |
Табличная часть — это строки внутри одного документа. Список — это сами документы или элементы справочника. Удалить пять строк из «Реализации товаров и услуг» и удалить пять документов «Реализация» — разные задачи с разными последствиями.
Как удалить несколько строк в табличной части документа
Откройте документ и перейдите в нужную табличную часть, например на вкладку «Товары».
Выделение строк
- 🖱️ Подряд: щёлкните первую строку, зажмите
Shiftи щёлкните последнюю. С клавиатуры то же самое делаютShift + ↓/Shift + ↑. - 🖱️ Вразброс: зажмите
Ctrlи щёлкайте по нужным строкам. Повторный щелчок сCtrlснимает выделение. - 🖱️ Все строки: встаньте в таблицу и нажмите
Ctrl + A.
Удаление
- Нажмите
Deleteили выберитеУдалитьв контекстном меню (правая кнопка мыши) либо в менюЕщё. - Проверьте итоги внизу таблицы: сумма документа должна пересчитаться.
- Нажмите
ЗаписатьилиПровести и закрыть.
Строки пропадают без вопроса «Удалить?». Это нормально: пока документ не записан, изменения живут только в открытой форме.
Нужно убрать все строки с нулевым количеством или одним складом? Отсортируйте таблицу по этой колонке через меню Ещё (команды сортировки по возрастанию и убыванию). Нужные строки встанут блоком, и их удобно выделить через Shift. Сортировка меняет порядок строк в документе, учитывайте это, если порядок важен для печатной формы.
Если выделяется только одна строка
У каждой таблицы на форме есть свойство «Режим выделения»: одиночный или множественный. В типовых табличных частях почти везде стоит множественный. Если в доработанной или отраслевой конфигурации выделяется одна строка, обычной настройкой пользователя это не исправить. Свойство меняют в конфигураторе или расширением конфигурации, это задача для программиста.
Проведённый документ и закрытый период
Строки проведённого документа удаляются так же, но после записи документ нужно перепровести, иначе движения не совпадут с содержимым. Если дата документа попадает в закрытый период, программа не даст записать изменения: в типовых конфигурациях действует дата запрета изменения данных. Снимать её стоит только по согласованию с главным бухгалтером.
Пометка и удаление нескольких элементов списка
Справочники и документы в 1С не стираются одним нажатием. Сначала ставится пометка, потом специальная обработка проверяет ссылки и удаляет то, на что ничего не ссылается.
Шаг 1. Пометить объекты
- Откройте список: справочник «Номенклатура», журнал «Документы реализации» и так далее.
- Отберите лишнее. Удобно установить отбор по колонке или воспользоваться поиском в строке над списком.
- Выделите строки через
ShiftилиCtrl. - Нажмите
Deleteи подтвердите вопрос о пометке.
Помеченные объекты отображаются перечёркнутым значком. Проведённые документы при пометке распроводятся, их движения из регистров исчезают сразу, ещё до окончательного удаления.
Пометка проведённых документов сразу меняет остатки, взаиморасчёты и отчёты. Сделайте это в закрытом периоде — и цифры сданной отчётности перестанут сходиться с базой.
Шаг 2. Удалить помеченные
В БП 3.0 обработка находится в разделе Администрирование → Обслуживание, группа «Корректировка данных», ссылка «Удаление помеченных объектов». В любой конфигурации её можно открыть через Главное меню → Все функции → Обработки (если команда «Все функции» скрыта, она включается в Главное меню → Сервис → Параметры).
- Выберите режим: удалить все помеченные или только выбранные. Второй вариант безопаснее — вы увидите список и снимете галочки с лишнего.
- Запустите удаление.
- Изучите результат. Объекты, на которые ссылаются другие данные, программа не удалит и покажет, где найдены ссылки.
Перед массовым удалением помеченных сделайте резервную копию базы. Для файловой базы — Конфигуратор → Администрирование → Выгрузить информационную базу в файл .dt, для клиент-серверной — штатный бэкап СУБД. Выгрузка .dt требует, чтобы в базе не работали другие пользователи.
Объект не удаляется, если на него есть ссылка? Откройте найденный документ-ссылку и решите: либо его тоже пометить, либо заменить в нём ссылку на правильный элемент. Для дублей номенклатуры и контрагентов в типовых конфигурациях есть «Поиск и удаление дублей»: обработка переносит ссылки на оставшийся элемент и только потом удаляет дубль.
Групповое изменение реквизитов: где помогает, а где нет
Обработка «Групповое изменение реквизитов» есть в БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на БСП. В БП 3.0 она лежит в том же разделе Администрирование → Обслуживание, группа «Корректировка данных». Её также вызывают из списка: выделите строки и найдите команду изменения выделенных в меню Ещё.
Обработка меняет значения реквизитов у сотни объектов сразу: вид номенклатуры, ставку НДС, счёт учёта, ответственного. С её помощью удобно подготовить массовое удаление:
- Отобрать в обработке объекты по условию, например все элементы номенклатуры из группы «Архив».
- Посмотреть их количество и состав до того, как что-то менять.
- Перейти в список, установить такой же отбор, выделить всё через
Ctrl + Aи пометить на удаление.
Удалять строки табличных частей сразу у множества документов эта обработка не умеет: она меняет значения в существующих строках, а не убирает их. Для такой задачи нужен код (см. ниже) или внешняя обработка с произвольным алгоритмом.
Удаление строк через запрос и программный код
Язык запросов 1С только читает данные. Команд DELETE и UPDATE, как в SQL, в нём нет. «Удаление через запрос» на практике означает связку: запрос находит нужные объекты, а код их помечает или удаляет.
Пример запроса, который находит документы реализации с пустой табличной частью «Товары»:
ВЫБРАТЬ
Реализация.Ссылка КАК Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары
ПО Реализация.Ссылка = Товары.Ссылка
ГДЕ
Товары.Ссылка ЕСТЬ NULL
И НЕ Реализация.ПометкаУдаления
Такой запрос удобно сначала выполнить в консоли запросов и посмотреть результат. Если список совпадает с ожиданием, переходите к коду обработки.
Прямые запросы DELETE к таблицам СУБД в обход платформы не делайте. Платформа не узнает об изменениях, итоги регистров и ссылки разойдутся, и база может не открыться после такой «чистки».
Код пишут во внешней обработке или в консоли кода. Для рабочей базы сначала проверьте его на копии.
Удалить строки табличной части по условию
Самый надёжный способ — найти строки через НайтиСтроки() и удалить их по полученному массиву. Перебор идёт по массиву, а не по изменяемой таблице, поэтому строки не пропускаются.
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
Отбор = Новый Структура("Количество", 0);
НайденныеСтроки = ДокОбъект.Товары.НайтиСтроки(Отбор);
Для Каждого СтрокаТЧ Из НайденныеСтроки Цикл
ДокОбъект.Товары.Удалить(СтрокаТЧ);
КонецЦикла;
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Если условие сложнее простого равенства, перебирайте таблицу с конца. Удаление строки с большим индексом не сдвигает строки с меньшими, поэтому ничего не теряется:
ВГраница = ДокОбъект.Товары.Количество() - 1;
Для Сч = 0 По ВГраница Цикл
СтрокаТЧ = ДокОбъект.Товары[ВГраница - Сч];
Если СтрокаТЧ.Сумма < 1 Или Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
ДокОбъект.Товары.Удалить(СтрокаТЧ);
КонецЕсли;
КонецЦикла;
Классическая ошибка — прямой цикл Для Каждого по самой табличной части с удалением внутри. После удаления строки следующая сдвигается на её место, и цикл её пропускает.
Удалить выделенные строки на форме
В доработке формы выделенные строки берут из свойства ВыделенныеСтроки элемента таблицы. Там лежат идентификаторы, поэтому строку находят через НайтиПоИдентификатору(). Идентификаторы собирают в отдельный массив, чтобы не менять коллекцию во время перебора:
&НаКлиенте
Процедура УдалитьВыделенные(Команда)
Идентификаторы = Новый Массив;
Для Каждого Ид Из Элементы.Товары.ВыделенныеСтроки Цикл
Идентификаторы.Добавить(Ид);
КонецЦикла;
Для Каждого Ид Из Идентификаторы Цикл
СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(Ид);
Если СтрокаТЧ <> Неопределено Тогда
Объект.Товары.Удалить(СтрокаТЧ);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Пометить на удаление много объектов
Для справочников и документов из кода используйте УстановитьПометкуУдаления(Истина). Потом объекты удаляют штатной обработкой с контролем ссылок.
Метод Удалить() у объекта стирает его сразу и без проверки ссылок: в других документах останутся «битые» ссылки вида <Объект не найден>. В типовых базах так делать не стоит.
Внешние обработки для массового удаления
Когда программиста нет, а отбор сложный, выручает универсальная обработка «Универсальный подбор и обработка объектов». Её распространяют в составе диска ИТС, есть версия для управляемых форм. Обработка ищет объекты по произвольному отбору или запросу и применяет к найденному действие: в её составе есть установка пометки удаления и режим произвольного алгоритма на встроенном языке.
Как открыть внешнюю обработку (.epf):
- 📂 Разово:
Главное меню → Файл → Открыть, выбрать файл. Платформа покажет предупреждение безопасности, его нужно подтвердить. Открывать файлы из непроверенных источников нельзя: внешняя обработка выполняется с правами вашего пользователя. - 📂 Постоянно: подключить в
Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки, если обработка поддерживает регистрацию.
Порядок работы одинаковый для любой такой обработки: отбор → просмотр результата → действие на копии базы → действие в рабочей базе.
Особенности в облачной 1С:Fresh
Приложение во Fresh работает без доступа к конфигуратору. Отсюда три отличия.
- ☁️ Ручное удаление и пометка работают так же, как в обычной базе:
Shift,Ctrl,Delete. - ☁️ Удаление помеченных доступно пользователю с административными правами в приложении. Обработка той же логики: сначала пометка, потом проверка ссылок.
- ☁️ Внешние обработки нельзя просто открыть через
Файл → Открыть. В сервисе их подключают как дополнительные обработки, а перед использованием они проходят проверку сервисом. Консоль кода и самописные .epf без проверки во Fresh не запустить.
Резервные копии приложения сервис делает сам, их список виден в личном кабинете. Перед массовым удалением удобно создать копию вручную, если ваш тариф это позволяет.
Как вернуть удалённые строки
Шансы на восстановление зависят от того, на каком этапе вы спохватились.
- Документ ещё не записан. Закройте форму и на вопрос о сохранении изменений ответьте
Нет. Документ останется в прежнем виде. - Объекты только помечены. Выделите их в списке и снова нажмите
Delete: пометка снимется. Документы после этого нужно провести заново, при пометке их движения были отменены. - Документ записан с удалёнными строками. Если в базе включена история изменений (в БП 3.0 флажок хранения истории находится в
Администрирование → Общие настройки), откройте документ, найдите в менюЕщёисторию изменений и сравните версии. Удалённые строки видны в предыдущей версии, из неё документ можно вернуть. - Помеченные объекты уже удалены обработкой. Остаётся резервная копия. Не загружайте её поверх рабочей базы: пропадёт всё, что внесли после бэкапа. Разверните копию отдельной базой и перенесите нужные объекты выгрузкой и загрузкой данных в формате XML.
Кто и когда удалил данные, покажет журнал регистрации: Администрирование → Обслуживание → Журнал регистрации. Отберите события удаления и изменения данных за нужную дату.