Как удалить десятки организаций и миллион записей из базы 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). Там собраны специалисты с реальными кейсами и отзывами — можно выбрать того, кто уже решал именно такие задачи, посмотреть его портфолио и договориться об условиях. Это быстрее и надёжнее, чем искать через знакомых или объявления.