Работа с большими массивами данных в 1С всегда требует осторожности. Ситуация, когда после групповой пометки на удаление около 100 000 документов база начинает «намертво» зависать через пару минут после старта, является классическим примером перегрузки системы фоновыми процессами. В этой статье мы подробно разберем, почему это происходит, и проанализируем шаги, которые помогут вернуть систему в рабочее состояние.
Когда мы помечаем на удаление такой внушительный объем документов (100 000 штук), для базы данных это не просто смена «флажка». Это массовое изменение записей в таблицах, которое влечет за собой каскад событий. Задержка в пару минут перед зависанием объясняется тем, что системе требуется время на инициализацию сеанса и запуск регламентных или фоновых заданий, которые «видят» огромный фронт работы и пытаются его обработать, монополизируя ресурсы процессора или дисковой подсистемы.
Рассмотрим основные факторы, которые могут приводить к такому поведению в конфигурации «Управление торговлей 10.3».
В современных версиях платформы 1С механизмы фоновых заданий работают очень активно. Рассмотрим ситуацию: в системе может быть настроено автоматическое удаление помеченных объектов или поиск ссылок на них. Как только база запускается, планировщик задач инициирует эти процессы. Для 100 000 объектов поиск ссылок во всех таблицах базы данных — это колоссальная нагрузка.
Проанализируем наши действия для проверки этой гипотезы:
/AllowExecuteScheduledJobs -Off. Это запретит выполнение регламентных заданий в данном сеансе.Одной из самых ресурсоемких операций после массового изменения данных является обновление индекса полнотекстового поиска. Механизм ПолнотекстовыйПоискДанных пытается проиндексировать измененные документы, чтобы их можно было найти через глобальный поиск. На объеме в 100 000 записей это может вызвать 100% нагрузку на диск.
Разберем по шагам, как временно отключить этот механизм для восстановления работоспособности:
ПередНачаломРаботыСистемы (в копии базы) или через внешнюю обработку, если удастся ее запустить:
// Отключение полнотекстового поиска программно
ПолнотекстовыйПоиск.УстановитьИспользование(Ложь);
Если ваша база работает на MS SQL Server, выполнение операции пометки на удаление 100 000 документов — это одна или несколько огромных транзакций. Это приводит к резкому росту файла лога транзакций (.LDF). Если место на диске заканчивается или SQL Server настроен на фиксированный размер лога, система будет «фризиться» при попытке выполнить любую следующую операцию.
Рассмотрим план действий для системного администратора:
.MDF и .LDF.UPDATE STATISTICS [ИмяТаблицы] или стандартный план обслуживания.В «Управлении торговлей 10.3» документы при пометке на удаление, как правило, автоматически распроводятся. Если эти 100 000 документов были проведены, то 1С инициирует масштабный пересчет итогов в регистрах накопления (например, Закупки, Продажи, ПартииТоваровНаСкладах).
Посмотрим на ситуацию изнутри: система пытается актуализировать остатки на дату самого раннего измененного документа. Если вы пометили документы за прошлые периоды, 1С будет пересчитывать итоги за все последующие месяцы. Чтобы исправить это, разберем следующие шаги:
Иногда причина кроется в локальных файлах пользователя. При массовом изменении метаданных или состояний объектов кэш может содержать неактуальные ссылки, что вызывает циклическую ошибку или «зависание» интерфейса при попытке отрисовать список документов или рабочий стол.
Выясним, поможет ли очистка кэша:
%AppData%\1C\1Cv8\).Если база файловая, то 100 000 пометок на удаление — это критический объем для таблицы _Document. Любой фоновый процесс (например, проверка обновлений или индексация Windows) может вступить в конфликт за доступ к файлу базы. В файловом режиме блокировка часто ставится на всю таблицу или даже на весь файл целиком.
Проанализируем решение для файловой базы:
*.1CD, *.1CL, *.pfl в исключения, так как антивирус может блокировать файл базы для сканирования после его резкого увеличения.Чтобы избежать подобных ситуаций в будущем, разберем правильный алгоритм удаления больших объемов данных:
Пример кода для порционной пометки на удаление с фиксацией транзакции:
Выборка = Документы.РеализацияТоваровУслуг.Выбрать(ДатаНачала, ДатаОкончания);
Счетчик = 0;
Пока Выборка.Следующий() Цикл
ОбъектДок = Выборка.ПолучитьОбъект();
ОбъектДок.УстановитьПометкуУдаления(Истина);
Счетчик = Счетчик + 1;
// Фиксируем каждые 1000 объектов, чтобы не перегружать память и логи
Если Счетчик % 1000 = 0 Тогда
ОбработкаПрерыванияПользователя();
Сообщить("Обработано: " + Счетчик);
КонецЕсли;
КонецЦикла;
Следуя этим инструкциям, мы сможем не только восстановить работу базы после текущего сбоя, но и предотвратить возникновение подобных проблем в будущем, обеспечив стабильную работу 1С:Управление торговлей 10.3.