При долгой работе в программах 1С:Управление торговлей 11.5, 1С:Комплексная автоматизация 2.5 или 1С:ERP Управление предприятием 2.5 многие системные администраторы и программисты сталкиваются с лавинообразным ростом базы данных. При анализе физической структуры таблиц СУБД выясняется, что львиную долю объема (иногда до 50–70% от всей базы) занимает один единственный регистр сведений — Детализация себестоимости партий товаров, постатейные и прочие затраты (периодический).
В этой статье мы подробно разберем, почему растет этот регистр, как правильно перенастроить систему, чтобы остановить этот рост, и как безопасно очистить накопившиеся гигабайты устаревших данных без ущерба для учета.
Этот регистр появился в архитектуре прикладных решений 1С при переходе на новые механизмы распределения затрат в ERP/КА 2.5 и УТ 11.5. Он задействуется системой при использовании метода оценки стоимости ФИФО (взвешенная или скользящая оценка) и предназначен для решения следующих задач:
Почему регистр становится гигантским?
Рассмотрим механизм генерации записей. В розничной и оптовой торговле (особенно в таких сферах, как продажа одежды или обуви) номенклатура имеет множество характеристик (размер, цвет, рост). При проведении процедуры «Закрытие месяца» система строит сложнейший граф распределения затрат. Для каждой уникальной комбинации «Номенклатура + Характеристика + Партия + Склад + Статья расходов + Документ-источник» создается отдельная запись в регистре сведений на первое число каждого месяца.
Если в базе оформляются тысячи перемещений, а статьи расходов детализируются до первичных документов (например, до конкретного заказа или поступления), количество записей в этой таблице начинает исчисляться десятками и сотнями миллионов. Процесс закрытия месяца при этом начинает занимать часы, а то и сутки.
Среди пользователей и некоторых ИТ-специалистов бытует мнение, что данные этого регистра нужны исключительно для построения красивых отчетов по валовой прибыли с расшифровкой до статей затрат, и их можно безболезненно удалять. Это опасное заблуждение. На самом деле данные этого регистра активно используются внутренними механизмами системы:
Корректировка приобретения за прошлый налоговый период, система попытается сопоставить данные с исторической детализацией себестоимости. Отсутствие записей приведет к ошибкам расчета СЛУ (системы линейных уравнений) или к некорректной себестоимости в текущем периоде.Фирма «1С», признав эту проблему массовой, начиная с версий ERP 2.5.8.263 и УТ 11.5.8, существенно оптимизировала механизмы платформы. Рассмотрим настройки, которые необходимо выполнить прямо сейчас для прекращения избыточного наполнения базы.
Ранее опция детализации жестко привязывалась к раздельному учету НДС. Теперь разработчики разделили эти настройки. Пройдем по следующему пути в интерфейсе:
Часто программисты и бухгалтеры настраивают статьи расходов избыточно детально. Проанализируем справочник Статьи расходов:
Заказ поставщику, Поступление товаров услуг или Заказ на перемещение — это главный триггер для генерации сотен тысяч записей. Система вынуждена плодить комбинации под каждый документ.Склад или Номенклатура) либо полностью очистим поле аналитики.Если система ругается при попытке изменить аналитику в существующих статьях, рекомендуется создать новые элементы справочника с корректными настройками распределения (например, с направлением списания на Финансовый результат), а старые статьи закрыть для использования, перенаправив новые документы на созданные статьи.
Если регистр уже раздут до десятков гигабайт, простое удаление записей «напрямую» или через SQL-запросы может нарушить логику системы. Действовать нужно по строгому и безопасному регламенту. Для сокращения объёма накопленных исторических данных без ущерба для логики можно провести многопоточную свёртку 1С:ERP.
Перед началом любых манипуляций с удалением данных обязательно зайдем в раздел НСИ и администрирование — Поддержка и обслуживание — Даты запрета изменения данных и установим дату запрета для всех пользователей (включая администраторов). Это предотвратит случайное перепроведение документов прошлых лет. Если кто-то случайно перепроведет старый документ поступления, система при очередном закрытии месяца попытается пересчитать себестоимость за тот период и заново сгенерирует миллионы записей в очищенной таблице.
Для удаления записей регистра за прошлые года (например, старше 3-х лет) напишем внешнюю обработку. Напрямую очищать таблицы через СУБД крайне не рекомендуется во избежание нарушения ссылочной целостности базы. Будем использовать объектную модель 1С. В качестве альтернативы самостоятельному написанию кода можно использовать готовую обработку для очистки записей регистров по выбранному периоду.
Рассмотрим пример кода для выборочного удаления записей регистра сведений по периодам:
// Очистка записей регистра за определенный период
Процедура ОчиститьДетализациюСебестоимостиНаСервере(ДатаНачала, ДатаКонца)
НаборЗаписей = РегистрыСведений.ДетализацияСебестоимостиПериодический.СоздатьНаборЗаписей();
// Будем удалять данные порциями по месяцам для оптимизации транзакций и предотвращения блокировок
ТекущийМесяц = НачалоМесяца(ДатаНачала);
Пока ТекущийМесяц <= ДатаКонца Цикл
НаборЗаписей.Отбор.Период.Установить(ТекущийМесяц);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
НаборЗаписей.Очистить();
НаборЗаписей.Записать(Истина);
ЗаписьЖурналаРегистрации("ОчисткаРегистраСебестоимости",
УровеньЖурналаРегистрации.Информация, , ,
"Успешно очищен период: " + Строка(ТекущийМесяц));
КонецЕсли;
ТекущийМесяц = ДобавитьМесяц(ТекущийМесяц, 1);
КонецЦикла;
КонецПроцедуры
Этот код безопасно очищает регистр порциями. Запись пустого набора с установленным отбором по периоду полностью удаляет соответствующие строки из физической таблицы базы данных.
После удаления миллионов строк из регистра физический размер файла базы данных (в случае файлового варианта 1Cv8.1CD) или файлов базы данных на MS SQL Server / PostgreSQL не уменьшится автоматически. СУБД просто пометит эти страницы как свободные для будущих записей.
Чтобы реально вернуть дисковое пространство операционной системе, выполним следующие действия: автоматизировать архивацию, обновление и тестирование баз 1С можно при помощи специализированной утилиты в «тихом» режиме.
chdbfl.exe.VACUUM FULL; для очистки неиспользуемого пространства в таблицах базы данных.Проведение этих настроек и профилактических процедур позволит вам сократить объем базы данных на десятки гигабайт, значительно ускорить выполнение операции «Закрытие месяца» и повысить общую стабильность работы системы 1С.