Рано или поздно перед любым администратором или программистом 1С встает задача уменьшения размера базы данных и повышения скорости ее работы. Самым очевидным решением кажется проведение свертки. Однако на практике этот процесс скрывает множество подводных камней.
В этой статье мы подробно проанализируем ситуацию, когда необходимо «отрезать» старый период работы, сравним два популярных подхода — очистку рабочей базы и перенос остатков в новую чистую базу, а также выясним причины, по которым стандартная свертка может оказаться неэффективной.
Рассмотрим подробнее два основных сценария, которые обычно стоят перед техническим специалистом, когда заказчик (или главный бухгалтер) требует свернуть базу на определенную дату:
Давайте разберем по шагам особенности, преимущества и недостатки каждого метода, чтобы принять взвешенное решение.
Очень часто инициатором свертки выступает бухгалтерия, желающая «отрезать» всего один прошлый год работы. Проанализируем, к чему приведет стандартная свертка за такой короткий период на практике:
Этот метод часто выбирают из-за кажущейся простоты, ведь пользователям не нужно переходить в другую базу. Но на самом деле этот процесс технически сложен и требует длительной монопольной работы с базой.
Выясним причину, почему удаление документов непосредственно в рабочей базе может затянуться на долгие часы или даже дни. Стандартная обработка СверткаИнформационнойБазы выполняет следующие действия:
После этого вам необходимо запустить процедуру «Удаление помеченных объектов». На больших базах стандартный механизм удаления работает крайне медленно, так как он проверяет каждую ссылку на удаляемый объект во всех таблицах базы данных. В процессе удаления система может зависнуть из-за нехватки оперативной памяти или переполнения лога транзакций СУБД.
Для ускорения процесса разработчики часто используют программное удаление без контроля ссылочной целостности через вызов метода Удалить() вместо УстановитьПометкуУдаления(). Рассмотрим пример того, как это делается в коде:
ВыборкаДокументов = Документы.РеализацияТоваровУслуг.Выбрать(ДатаНачала, ДатаОкончания);
Пока ВыборкаДокументов.Следующий() Цикл
ОбъектДокумента = ВыборкаДокументов.ПолучитьОбъект();
// Программное удаление объекта напрямую из базы данных без проверки ссылок
ОбъектДокумента.Удалить();
КонецЦикла;
Важное предупреждение: Использование метода Удалить() напрямую крайне опасно! Если на удаленный документ ссылались другие объекты в будущем периоде, в базе возникнут битые ссылки (объекты со значением «Объект не найден»). Это приведет к нарушению логики работы конфигурации и ошибкам при проведении последующих документов.
Специалисты сходятся во мнении, что перенос только необходимых данных в чистую базу — это самый «гигиеничный» и безопасный способ свертки. Рассмотрим подробнее, как реализовать этот подход:
Преимущества данного метода очевидны: в новой рабочей базе не будет старых «битых» ссылок, очистятся неиспользуемые элементы справочников (так называемый «шлак»), а размер базы данных уменьшится до минимально возможного физического предела. Это гарантирует максимальный прирост производительности системы.
Проанализируем технический нюанс: даже если вы успешно свернули базу и удалили тысячи помеченных документов, физический размер файла базы данных (1Cv8.1CD в файловом режиме) или размер базы на SQL-сервере не уменьшится автоматически. СУБД резервирует освободившееся место под будущие записи.
Чтобы реально вернуть свободное место на жесткий диск, выполните следующие технические процедуры:
v8_pack.exe.SHRINKDATABASE или SHRINKFILE через SQL Server Management Studio, а также выполните перестройку индексов (Index Rebuild).Подводя итог, можно сказать следующее: если перед вами стоит задача отрезать прошлые периоды работы базы, самым надежным решением будет **отказ от классической свертки внутри живой базы** в пользу **переноса остатков в новую чистую базу**. Это позволит избежать проблем с битыми ссылками, гарантированно уменьшит размер базы и сэкономит огромное количество времени как программисту, так и пользователям.