Найти в Дзене

Как удалить десятки организаций и миллион записей из базы 1С, не привлекая внимания пользователей

Представьте ситуацию: вам звонит директор и говорит — «Слушай, у нас в базе болтается тридцать две организации, из которых реально работают четыре. Остальные — это старые ООО, которые мы ликвидировали ещё в 2019-м, плюс тестовые конторы, которые кто-то насоздавал при внедрении. Можешь убрать?» Вы открываете базу, смотрите на список справочника «Организации» — и там действительно 32 позиции. А потом открываете отчёт по объёму данных и понимаете, что за этими организациями тянется хвост примерно в 1,2 миллиона документов, регистров и прочего добра. Вот тут начинается самое интересное. Удалить организацию из 1С — это не то же самое, что нажать Delete в Excel. Это целая операция, которая при неправильном подходе может положить базу на несколько часов или вообще испортить данные так, что потом не разберёшься. Сегодня разберём, как это делается правильно — без паники, без простоев и без того, чтобы пользователи вообще заметили, что что-то происходит. Прежде чем лезть с лопатой, стоит понять
Оглавление
Как удалить организации из 1С
Как удалить организации из 1С

Как удалить десятки организаций и миллион записей из базы 1С, не привлекая внимания пользователей

Представьте ситуацию: вам звонит директор и говорит — «Слушай, у нас в базе болтается тридцать две организации, из которых реально работают четыре. Остальные — это старые ООО, которые мы ликвидировали ещё в 2019-м, плюс тестовые конторы, которые кто-то насоздавал при внедрении. Можешь убрать?» Вы открываете базу, смотрите на список справочника «Организации» — и там действительно 32 позиции. А потом открываете отчёт по объёму данных и понимаете, что за этими организациями тянется хвост примерно в 1,2 миллиона документов, регистров и прочего добра.

Вот тут начинается самое интересное. Удалить организацию из 1С — это не то же самое, что нажать Delete в Excel. Это целая операция, которая при неправильном подходе может положить базу на несколько часов или вообще испортить данные так, что потом не разберёшься. Сегодня разберём, как это делается правильно — без паники, без простоев и без того, чтобы пользователи вообще заметили, что что-то происходит.

Почему в базе 1С вообще накапливается такой мусор

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

История первая: наследие внедрения. Когда систему настраивали, консультант создал тестовые организации — «ООО Тест», «ИП Иванов_тест», «Организация 1» — чтобы проверить настройки учётной политики, обмены и прочее. Потом забыл удалить. Прошло три года, в этих организациях накопились тестовые документы, которые кто-то зачем-то проводил.

История вторая: реорганизация бизнеса. Компания прошла через слияния и поглощения. Было 15 юрлиц, стало 3. Но старые организации никуда не делись — в них хранится история за прошлые периоды, и бухгалтеры боятся их трогать.

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

По статистике, которую я собирал на своих проектах, в базах старше трёх лет в среднем 30-40% организаций в справочнике — это балласт. В одной торговой компании мы нашли 47 организаций, из которых активно использовались только 6. Остальные 41 — это история, тесты и чья-то забывчивость.

Что происходит с базой, когда вы просто «помечаете на удаление»

Многие думают: поставлю пометку на удаление, потом запущу обработку удаления помеченных объектов — и всё. Если бы всё было так просто, эта статья была бы в три абзаца.

Проблема в том, что организация — это один из самых «связанных» объектов в типовых конфигурациях 1С. Особенно в Бухгалтерии, УТ, КА и ERP. Посмотрите, что на неё ссылается:

  • Все документы, в которых она указана (накладные, счета, акты, платёжки)
  • Настройки учётной политики
  • Константы и параметры учёта
  • Регистры сведений (курсы валют по организации, настройки НДС и т.д.)
  • Регистры накопления (остатки, обороты)
  • Регистры бухгалтерии — проводки
  • Задачи и бизнес-процессы
  • Настройки обмена данными
  • Пользовательские настройки и избранное

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

Я видел базы, где попытка удалить одну организацию через стандартный механизм приводила к тому, что сеанс висел 4 часа, а потом завершался с ошибкой. Пользователи при этом не могли нормально работать, потому что база была под нагрузкой.

Стратегия удаления: сначала думаем, потом делаем

Правильный подход к удалению организаций из большой базы — это проект, а не операция. Минимум три этапа: анализ, подготовка, удаление. И каждый этап важен.

Этап первый: аудит и классификация

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

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Организация КАК Организация,
| КОЛИЧЕСТВО(РеализацияТоваровУслуг.Ссылка) КАК КоличествоДокументов
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслуг.Организация
|УПОРЯДОЧИТЬ ПО
| КоличествоДокументов УБЫВ";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Организация.Наименование + ": " + Выборка.КоличествоДокументов + " документов");
КонецЦикла;

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

Организации с нулём документов — это ваши лучшие друзья. Их можно удалить быстро и безболезненно. Начинайте с них — это даст быстрый результат и поднимет настроение.

Этап второй: резервное копирование и тестовая среда

Это звучит банально, но я не могу это не написать. Перед любыми массовыми операциями с данными — делайте резервную копию. Не «у нас есть ночной бэкап», а свежую копию прямо сейчас. И проверьте, что она восстанавливается.

Ещё лучше — разверните копию базы на отдельном сервере и сначала отработайте всю процедуру там. Это займёт дополнительное время, но зато вы будете знать точно, сколько времени займёт операция на боевой базе и что именно произойдёт.

В одном из проектов мы именно так и сделали. На тестовой базе операция удаления 28 организаций с суммарным объёмом 800 тысяч записей заняла 6 часов 20 минут. Мы запланировали окно обслуживания на выходные — с пятницы 23:00 до субботы 10:00 — и уложились с запасом.

Технический арсенал: что использовать для массового удаления

Вариант 1: Стандартная обработка с предварительной очисткой ссылок

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

Алгоритм такой:

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

Для отмены проведения и пометки документов пишем обработку:

Процедура ОчиститьДокументыОрганизации(Организация)

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Организация = &Организация";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
Попытка
ОбъектДокумента = Выборка.Ссылка.ПолучитьОбъект();
Если ОбъектДокумента.Проведен Тогда
ОбъектДокумента.ОтменитьПроведение();
КонецЕсли;
ОбъектДокумента.УстановитьПометкуУдаления(Истина);
Исключение
Сообщить("Ошибка при обработке: " + Выборка.Ссылка + " - " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;

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

Обратите внимание на блок Попытка/Исключение — он здесь критически важен. При массовых операциях всегда будут исключения — заблокированные объекты, документы с особыми правами, что-то ещё. Без обработки исключений вся процедура упадёт на первой же ошибке.

Вариант 2: Прямая работа с регистрами через запросы

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

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

Процедура УдалитьЗаписиРегистраПоОрганизации(ИмяРегистра, Организация)

МенеджерЗаписей = РегистрыСведений[ИмяРегистра];

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.Текст =
"ВЫБРАТЬ
| Т.Период,
| Т.Организация
|ИЗ
| РегистрСведений." + ИмяРегистра + " КАК Т
|ГДЕ
| Т.Организация = &Организация";

Выборка = Запрос.Выполнить().Выбрать();

КоличествоУдалено = 0;

Пока Выборка.Следующий() Цикл
НаборЗаписей = МенеджерЗаписей.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Организация.Установить(Выборка.Организация);
НаборЗаписей.Отбор.Период.Установить(Выборка.Период);
НаборЗаписей.Записать();
КоличествоУдалено = КоличествоУдалено + 1;
КонецЦикла;

Сообщить("Удалено записей из " + ИмяРегистра + ": " + КоличествоУдалено);

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

Вариант 3: Групповое удаление через обработку «Удаление объектов»

В платформе 8.3.14 и выше есть улучшенная обработка удаления объектов, которая умеет работать в несколько потоков и лучше справляется с большими объёмами. Но и она имеет ограничения по объёму — при миллионе записей лучше не полагаться только на неё.

Как не мешать пользователям: работа в фоне и по расписанию

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

Регламентные задания — ваш лучший инструмент

Основная идея: не делайте всё за один раз, делайте маленькими порциями по расписанию. Создаём регламентное задание, которое каждую ночь в 2:00 удаляет, например, по 5000 документов. За месяц незаметно уберём 150 тысяч записей.

Процедура УдалениеДокументовПорциями() Экспорт

РазмерПорции = 5000;

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("МаксКоличество", РазмерПорции);
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ &МаксКоличество
| Т.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Т
|ГДЕ
| Т.ПометкаУдаления = ИСТИНА
| И Т.Организация В (&СписокОрганизацийДляУдаления)";

Выборка = Запрос.Выполнить().Выбрать();

МассивДляУдаления = Новый Массив;

Пока Выборка.Следующий() Цикл
МассивДляУдаления.Добавить(Выборка.Ссылка);
КонецЦикла;

УдалениеОбъектов.УдалитьОбъекты(МассивДляУдаления);

Сообщить("Удалено документов: " + МассивДляУдаления.Количество());

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

Такой подход имеет несколько преимуществ:

  • База не нагружается сильно — 5000 документов удаляются за несколько минут
  • Пользователи ночью не работают — конфликтов блокировок нет
  • Если что-то пойдёт не так — проблема будет только с текущей порцией, а не со всем объёмом
  • Прогресс можно отслеживать — каждую ночь смотрим, сколько осталось

На практике миллион записей при таком подходе убирается за 3-4 месяца. Да, это долго. Но зато незаметно и безопасно. Если нужно быстрее — увеличиваем порцию или запускаем задание несколько раз в сутки.

Мониторинг блокировок

Даже ночью в базе могут быть активные сеансы — регламентные задания, обмены данными, кто-то из другого часового пояса. Поэтому перед удалением порции стоит проверить, нет ли активных блокировок на нужные объекты.

Самый простой способ — добавить в начало процедуры проверку количества активных сеансов:

Функция МожноЗапуститьУдаление()

СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы();
КоличествоАктивных = 0;

Для Каждого Сеанс Из СеансыИнформационнойБазы Цикл
Если Сеанс.Пользователь.Имя <> "Регламентные задания" Тогда
КоличествоАктивных = КоличествоАктивных + 1;
КонецЕсли;
КонецЦикла;

Возврат КоличествоАктивных = 0;

КонецФункции

Если активных пользователей нет — запускаем удаление. Если есть — пропускаем итерацию и ждём следующего запуска.

Подводные камни, на которые все наступают

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

Грабли первые: забытые обмены данными

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

Решение: перед удалением организации проверьте все настроенные обмены и убедитесь, что эта организация там не фигурирует. Или сначала отключите обмен, потом удаляйте.

Грабли вторые: документы в закрытых периодах

Если в базе установлена дата запрета редактирования, то документы за закрытые периоды нельзя распровести стандартными средствами. Вам придётся либо временно снять запрет, либо удалять такие документы напрямую через административные инструменты.

В одном из проектов мы столкнулись с тем, что у ликвидированной организации были документы за 2017-2020 годы, период был закрыт. Пришлось согласовывать с главным бухгалтером временное снятие запрета на выходные — с обязательным восстановлением после операции.

Грабли третьи: ссылки в нетиповых конфигурациях

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

Рекомендация: перед началом работ попросите разработчика, который делал доработки, составить список всех нетиповых объектов, связанных с организацией. Это сэкономит много времени.

Грабли четвёртые: реквизиты в справочниках контрагентов

Часто организация прописана не только в документах, но и в карточках контрагентов — как «наша организация для этого контрагента». После удаления организации эти поля станут пустыми или битыми ссылками. Перед удалением обязательно проверьте справочник контрагентов и почистите такие реквизиты.

Грабли пятые: отчётность и архив

Регламентированная отчётность — декларации, балансы, отчёты в фонды — хранится в базе и привязана к организации. Если организация ликвидирована и отчётность за неё уже сдана, эти данные можно удалять. Но убедитесь, что у вас есть архивные копии всех сданных отчётов — хотя бы в PDF. Налоговая может попросить пояснения и через пять лет.

Реальный кейс: 32 организации, 1,2 миллиона записей, 6 недель работы

Расскажу про конкретный проект, который мы делали в конце прошлого года. Производственная компания, 1С:Комплексная автоматизация, база живёт с 2016 года. 32 организации в справочнике, из которых реально используются 4.

Вот как выглядел план работ:

  • Неделя 1: аудит — разбираем каждую из 28 «лишних» организаций, выясняем историю, считаем объём данных, согласовываем с заказчиком список на удаление
  • Неделя 2: быстрая победа — удаляем 11 организаций с нулевым или минимальным количеством документов (до 500 штук). Это делается за один вечер стандартными средствами
  • Недели 3-4: разворачиваем тестовую среду, пишем и тестируем обработки для массового удаления, отрабатываем весь сценарий на копии базы
  • Неделя 5: запускаем регламентное задание на боевой базе, удаляем по 10 000 документов в ночь
  • Неделя 6: финальная очистка, удаление самих организаций, тестирование, закрытие задачи

Итог: 28 организаций удалены, 1,2 миллиона записей убраны из базы, ни один пользователь не пожаловался на проблемы в работе. База стала работать заметно шустрее — особенно ускорились отчёты, которые раньше строились по всем организациям сразу.

Стоимость работ для заказчика составила около 180 000 рублей — это 6 недель работы специалиста. Много? Смотря с чем сравнивать. База стала быстрее, нагрузка на сервер снизилась, бухгалтеры перестали путаться в списке организаций. Плюс компания сэкономила на железе — не пришлось покупать дополнительный сервер, который уже планировали.

Чек-лист: что проверить перед началом удаления

Собрал в один список всё, что нужно сделать до того, как начать удалять:

  • Сделать свежую резервную копию базы и проверить её восстановление
  • Развернуть тестовую среду и отработать сценарий там
  • Составить полный список объектов, ссылающихся на организации (через конфигуратор или специальную обработку)
  • Проверить настройки обмена данными — нет ли там удаляемых организаций
  • Согласовать с главным бухгалтером временное снятие запрета редактирования (если нужно)
  • Экспортировать в PDF все регламентированные отчёты удаляемых организаций
  • Уведомить пользователей о планируемых технических работах (даже если работы ночные)
  • Проверить наличие нетиповых доработок, связанных с организацией
  • Убедиться, что в справочнике контрагентов нет ссылок на удаляемые организации
  • Настроить мониторинг — чтобы видеть прогресс удаления и ловить ошибки

Если все эти пункты закрыты — можно начинать. Если хотя бы один вызывает вопросы — сначала разберитесь с ним. Спешка при работе с данными обходится очень дорого.

Когда стоит привлечь внешнего специалиста

Честно скажу: не каждый штатный 1С-ник готов браться за такую задачу. И это нормально. Массовое удаление данных из боевой базы — это зона повышенного риска, и здесь важен опыт именно таких операций, а не общие знания 1С.

Стоит привлечь внешнего специалиста, если:

  • Объём данных больше 500 тысяч записей
  • Конфигурация сильно доработана и вы не знаете всех зависимостей
  • Нет тестовой среды и возможности её развернуть
  • Задача срочная — нужно сделать за неделю, а не за месяц
  • Штатный специалист не имеет опыта подобных операций
  • База критически важная и цена ошибки очень высока

Внешний специалист с опытом таких проектов сделает всё быстрее, безопаснее и с правильной документацией. Да, это стоит денег. Но потеря данных или недельный простой базы стоит несравнимо больше.

Если вам нужен такой специалист — найти проверенного 1С-разработчика с опытом работы с большими базами данных можно на бирже Koderion (koderion.ru). Там собраны специалисты с реальными кейсами и отзывами — можно выбрать того, кто уже решал именно такие задачи, посмотреть его портфолио и договориться об условиях. Это быстрее и надёжнее, чем искать через знакомых или объявления.