Свертка крупной информационной базы в конфигурации «1С:Управление производственным предприятием 1.3» — одна из наиболее ресурсоемких и ответственных административных задач. Основная цель процедуры заключается в уменьшении физического размера базы данных, удалении неактуальных исторических документов и ускорении работы системы при сохранении корректных остатков на выбранную дату. Разберем по шагам ключевые подходы к свертке УПП 1.3, типовые проблемы, с которыми можно столкнуться, и проверенные способы их решения.
На практике применяются два основных сценария:
Проанализируем обязательные предварительные шаги, которые предотвратят сбои в процессе работы:
.dt.ВерсииОбъектов, а также очистим таблицы регистрации изменений планов обмена.Выясним причину частой ошибки, возникающей при обработке регистров сведений:
{ВнешняяОбработка.СверткаБазы.МодульОбъекта(658)}: Ошибка при вызове метода контекста (Записать)
НаборЗаписей.Записать();
по причине:
Запись с такими ключевыми полями существует!
Эта ошибка появляется в периодических или непериодических регистрах сведений (например, ЖурналУчетаСчетовФактур, СоответствиеСчетовБУиНУ и др.), когда несколько записей за разные исторические даты принудительно сводятся обработкой к одной дате среза. В результате формируются строки с абсолютно одинаковым набором измерений, что нарушает уникальность ключа записи.
Для устранения ошибки применим следующие решения:
Записать() выполним группировку таблицы значений по измерениям регистра либо очистим дублирующиеся строки.Рассмотрим специфику учета, которую критически важно учитывать при настройке правил и обработок:
УчетЗатрат. При партионном учете важно помнить, что замена исходных документов партий на документы ввода остатков сделает невозможным автоматический возврат товаров поставщику по старым партиям без ручной корректировки.НДС по приобретенным ценностям и НДС включенный в стоимость. В противном случае регламентные операции книги покупок и книги продаж в будущих периодах сформируют некорректные проводки.РаботникиОрганизаций, ПлановыеНачисленияРаботниковОрганизаций) сворачивать нельзя, чтобы сохранить историю кадровых перемещений и непрерывный стаж сотрудников.При свертке крупных баз стандартная обработка может завершиться аварийно с ошибкой «Недостаточно памяти». Посмотрим на пример кода, позволяющего оптимизировать удаление данных порциями с явной фиксацией транзакций:
// Отключение пересчета итогов на время массовой записи остатков
РегистрыНакопления.УчетЗатрат.УстановитьИспользованиеИтогов(Ложь);
// Пакетная очистка движений и удаление документов
РазмерПакета = 1000;
Счетчик = 0;
НачатьТранзакцию();
Для Каждого СсылкаДокумента Из МассивДокументовКУдалению Цикл
// Сначала очищаем движения без вызова тяжелых обработчиков
ДокументОбъект = СсылкаДокумента.ПолучитьОбъект();
Если ДокументОбъект <> Неопределено Тогда
Для Каждого Движение Из ДокументОбъект.Движения Цикл
Движение.Очистить();
Движение.Записать();
КонецЦикла;
ДокументОбъект.Удалить();
КонецЕсли;
Счетчик = Счетчик + 1;
Если Счетчик % РазмерПакета = 0 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
// Включение и пересчет итогов после завершения обработки
РегистрыНакопления.УчетЗатрат.УстановитьИспользованиеИтогов(Истина);
РегистрыНакопления.УчетЗатрат.ПересчитатьИтоги();
После успешного создания документов остатков и удаления старых данных выполним обязательные регламентные шаги:
REBUILD INDEX) и сжатие базы данных (SHRINKDATABASE / SHRINKFILE), чтобы освободить место на диске.