При работе с крупными базами данных на платформе 1С:Предприятие 7.7 под управлением MS SQL Server часто возникает задача уменьшения объема данных. Это особенно актуально при подготовке периферийных информационных баз в системе УРБД (универсальное распределение баз данных), когда из центральной базы (ЦБ) необходимо исключить документы, не относящиеся к конкретному складу или подразделению. В этой статье мы подробно разберем, как работает метод непосредственного удаления, какие последствия он несет для SQL-сервера и как правильно подготовить "облегченную" копию базы.
Рассмотрим стандартный программный метод Удалить(1). В отличие от пометки на удаление, этот метод выполняет физическое удаление записи из таблиц базы данных. Проанализируем, что происходит внутри системы при вызове этой команды:
_1SJOURN — и удаляет соответствующую строку.DH* (шапка) и DT* (табличная часть).RA* и таблице итогов RG*, если документ был проведен._1SCRDOC.Важно понимать, что хотя данные из таблиц исчезают, физический размер файла базы данных (.mdf) на диске не уменьшается автоматически. Выясним причину: MS SQL Server просто помечает страницы, которые занимали эти данные, как свободные и готовые для повторного использования внутри того же файла. Чтобы реально освободить место на диске, нам потребуются дополнительные действия на стороне СУБД.
Проанализируем ситуацию с точки зрения системного администрирования. Если мы массово удаляем тысячи документов, это порождает колоссальную нагрузку на дисковую подсистему и систему логирования.
Лог транзакций (файл .ldf): При массовом удалении через метод Удалить(1) SQL Server записывает каждую операцию в лог транзакций. Если база находится в модели восстановления Full, файл лога может вырасти в несколько раз, превысив размер самой базы. Разберем по шагам, как этого избежать:
Simple.Посмотрим на пример кода, который часто используется для пакетного удаления документов в 1С 7.7:
Док = СоздатьОбъект("Документ");
Док.ВыбратьДокументы(ДатаНач, ДатаКон);
Пока Док.ПолучитьДокумент() = 1 Цикл
// Проверяем условие, например, принадлежность к складу
Если Док.Склад <> НужныйСклад Тогда
Док.Удалить(1); // Непосредственное удаление
КонецЕсли;
КонецЦикла;
Выясним, почему простое удаление может быть опасным. Хотя движок 1С 7.7 старается корректно вычищать движения, при программных сбоях в таблицах итогов (RG*) могут остаться "фантомные" записи. Это приведет к тому, что отчеты будут показывать неверные остатки.
Рассмотрим правильный алгоритм удаления проведенных документов:
СделатьНепроведенным(). Это гарантирует корректный пересчет итогов в таблицах RG*.Удалить(1).Часто в обсуждениях на форумах предлагают стратегию: "сделать копию ЦБ — удалить лишнее — создать дочернюю базу". Это эффективный способ, если нужно передать в филиал только НСИ (нормативно-справочную информацию) и остатки. Однако здесь есть критические нюансы, касающиеся механизмов миграции.
Проанализируем таблицу _1STRANS. Это системная таблица, где 1С хранит регистрацию изменений для обмена. Если вы просто удалите документы в копии базы, эти удаления могут зарегистрироваться как изменения и при первой же синхронизации "улетят" обратно в центральную базу, удалив данные там!
Как правильно подготовить копию для УРБД:
_1STRANS (средствами SQL: TRUNCATE TABLE _1STRANS).Рассмотрим понятие "Архивирование периода", упомянутое в сообщениях. В контексте 1С 7.7 под этим понимается свертка базы. Это более надежный метод, чем простое удаление. Выясним, из каких этапов он состоит:
Этот подход гарантирует, что в дочерней базе будут актуальные начальные данные, но объем таблиц _1SJOURN и DT* существенно сократится, что ускорит работу системы.
После удаления миллионов строк индексы в MS SQL становятся сильно фрагментированными. Разберем, к чему это приводит: даже если данных стало меньше, SQL Server может тратить больше времени на поиск из-за "дыр" в индексах.
Рекомендация: Сразу после удаления документов и выполнения процедуры Shrink, обязательно запустите Rebuild Indexes. В 1С 7.7 это также можно инициировать через процедуру "Тестирование и исправление" с флагом "Реиндексация", но на SQL-версии эффективнее использовать средства самого SQL Server Maintenance Plans.
Подведем итог: непосредственное удаление Удалить(1) является мощным инструментом, но требует понимания работы СУБД. Совместное использование программных методов 1С и административных инструментов SQL Server позволит вам эффективно управлять размером базы и корректно настраивать распределенные системы.