Свертка базы данных в «1С:Управление производственным предприятием» (УПП) — это одна из самых ресурсоемких и сложных технических задач, с которой сталкивается программист или системный администратор 1С. Высокая связанность данных, миллионы записей в регистрах накопления и бухгалтерии, а также механизмы партионного учета или РАУЗ приводят к тому, что стандартная обработка СверткаБазы.epf может выполняться днями или даже неделями, намертво вешая рабочий сервер.
В этой статье мы подробно разберем, почему стандартный механизм свертки работает медленно, и рассмотрим эффективные альтернативные методики, которые помогут вам успешно решить эту задачу в разумные сроки.
Давайте проанализируем ситуацию. Стандартный алгоритм свертки состоит из трех основных этапов:
КорректировкаЗаписейРегистров).Основной затык происходит на втором и третьем этапах. При удалении документов платформа 1С производит проверку ссылочной целостности для каждого объекта. Если база содержит миллионы документов, проверка связей превращается в бесконечный процесс. Кроме того, СУБД тратит колоссальные ресурсы на пересчет индексов таблиц и запись логов транзакций при выполнении массовых операций удаления.
Ниже мы подробно разберем проверенные практические методы ускорения и альтернативные варианты свертки баз УПП.
Этот способ по праву считается самым надежным и быстрым для действительно больших баз данных. Вместо того чтобы долго и мучительно удалять старые документы из рабочей базы, мы перенесем нужные данные и остатки в абсолютно чистую базу. Давайте разберем этот процесс по шагам.
Шаг 1. Создание рабочей копии
Сделайте полную резервную копию вашей рабочей информационной базы и разверните ее на тестовом сервере. Все дальнейшие подготовительные действия выполняются исключительно в этой копии.
Шаг 2. Формирование остатков
В тестовой копии запустите типовую обработку свертки. Выполните только первый этап — формирование документов ввода остатков (корректировок регистров). На этом шаге не запускайте пометку на удаление и физическую очистку документов. Нам важно получить только корректно рассчитанные остатки на выбранную дату.
Шаг 3. Подготовка пустой конфигурации
В конфигураторе рабочей базы выгрузите конфигурацию в файл (команда Конфигурация -> Сохранить конфигурацию в файл...) с расширением .cf. Создайте абсолютно новую, пустую базу данных SQL и загрузите в нее полученный файл конфигурации. Таким образом, мы получаем чистую структуру базы без каких-либо транзакционных данных.
Шаг 4. Перенос нормативно-справочной информации (НСИ)
С помощью стандартной обработки ВыгрузкаЗагрузкаДанныхXML.epf перенесите из тестовой свернутой копии в новую пустую базу все необходимые справочники, константы, классификаторы и важные регистры сведений (например, курсы валют, учетную политику, параметры амортизации ОС). Поскольку конфигурации идентичны, перенос через XML на уровне платформы пройдет максимально быстро.
Шаг 5. Перенос документов остатков
Той же обработкой ВыгрузкаЗагрузкаДанныхXML.epf перенесите из копии в чистую базу созданные документы ввода остатков (корректировки регистров). После переноса обязательно проведите эти документы и активируйте движения по регистрам.
Преимущества метода: мы полностью избегаем самого длительного этапа — удаления старых данных. Новая база получается максимально «здоровой», не содержит скрытых битых ссылок и имеет минимальный физический размер.
Если вы все же приняли решение проводить свертку непосредственно в текущей базе данных, вам обязательно потребуется оптимизировать работу SQL-сервера. Без этого лог транзакций быстро переполнится, и процесс завершится аварийной ошибкой.
Проанализируем ключевые настройки базы данных на сервере MS SQL:
1. Перевод базы данных в модель восстановления SIMPLE
Перед началом свертки и удаления документов обязательно зайдите в свойства базы данных в SQL Server Management Studio (SSMS) и на вкладке Options переведите параметр Recovery model в режим Simple (Простая). В режиме Full СУБД записывает каждое изменение в файл лога транзакций (.ldf). При удалении миллионов строк файл лога мгновенно разрастется до терабайтных размеров, вызвав ошибку transaction log is full. В режиме Simple транзакции не накапливаются в логе в таком объеме, что спасет базу от зависания.
2. Порционное (пакетное) удаление данных
Стандартные платформенные механизмы 1С пытаются удалять данные огромными порциями в рамках одной транзакции. Для ускорения процесса очистки таблиц движений регистров программисты часто используют прямые SQL-запросы. Чтобы не заблокировать СУБД и не перегрузить оперативную память, удаление больших объемов данных необходимо выполнять пакетами (порциями).
Рассмотрим пример SQL-скрипта для порционного удаления записей из тяжелой таблицы по условию даты:
DECLARE @cnt int
SET @cnt = 1
WHILE @cnt > 0
BEGIN
-- Выбираем порцию идентификаторов для удаления во временную таблицу
SELECT TOP 10000 [Counter]
INTO #tt2
FROM [ИмяБазыДанных].[dbo].[ИмяТаблицыРегистра]
WHERE [Period] < '2016-01-01 00:00:00'
;
-- Удаляем записи, вошедшие в текущий пакет
DELETE FROM [ИмяБазыДанных].[dbo].[ИмяТаблицыРегистра]
WHERE [Counter] IN (
SELECT [Counter]
FROM #tt2
)
;
-- Сбрасываем временную таблицу и проверяем количество затронутых строк
DROP TABLE #tt2
;
SET @cnt = @@ROWCOUNT
;
END
Этот скрипт удаляет записи порциями по 10 000 строк. Использование временной таблицы #tt2 позволяет минимизировать блокировки и предотвращает лавинообразный рост лога транзакций.
Большая часть времени при записи документов остатков и удалении старых документов в 1С уходит на постоянный автоматический пересчет итогов регистров накопления и бухгалтерии. Чтобы избежать этого, выполните следующие действия:
1. Управление итогами регистров
Перед началом активной фазы свертки перенесите границу рассчитанных итогов на дату свертки (в нашем случае — на конец 2015 года) или полностью отключите использование итогов для регистров, по которым совершается наибольшее число движений. Сделать это можно программно или через стандартный монопольный режим управления итогами в режиме «1С:Предприятие».
2. Дробление свертки по периодам
Не пытайтесь свернуть базу за несколько лет одним махом. Если вам нужно очистить данные до 2016 года, выполняйте свертку по годам, кварталам или даже месяцам. Это позволит снизить нагрузку на сервер и контролировать процесс на каждом этапе. Если на каком-то шаге произойдет сбой, вам не придется начинать все с самого начала.
3. Аппаратные оптимизации
Процесс удаления документов в 1С во многом является однопоточным. Поэтому для ускорения свертки целесообразно временно перенести базу на более производительный с точки зрения частоты процессора компьютер (с высокой производительностью на одно ядро), использовать быстрые SSD-накопители корпоративного класса или настроить RAM-диск под временные файлы СУБД.
Сворачивая «1С:Управление производственным предприятием», нельзя забывать о сложной внутренней архитектуре этого решения. Обратите особое внимание на следующие моменты:
После завершения удаления данных физический размер файлов базы данных на диске (особенно в SQL-варианте) не уменьшится автоматически. СУБД лишь освободит страницы внутри файлов для новых записей. Чтобы физически уменьшить базу данных, выполните следующие шаги:
DBCC SHRINKDATABASE через SQL Server Management Studio. Это высвободит неиспользуемое дисковое пространство на сервере.Выбрав правильную стратегию (будь то метод «свертки наоборот» с переносом остатков или оптимизация СУБД для пакетного удаления напрямую), вы сможете успешно свернуть даже самую тяжелую базу данных УПП, сэкономив драгоценное время и нервы коллег.