Многие администраторы и разработчики 1С сталкиваются с пугающей ситуацией: после запуска масштабного удаления помеченных объектов или загрузки через Конвертацию данных 2.0 (КД 2.0), процесс «зависает» на несколько суток. Самое странное происходит в конце: судя по Журналу регистрации, данные уже не пишутся, объекты не меняются, но сеанс остается неактивным, а монитор ресурсов показывает странную активность чтения мелкими порциями. Проанализируем ситуацию, разберем внутренние механизмы платформы и выясним, почему так происходит.
Рассмотрим две типичные ситуации, описанные пользователями:
В обоих случаях кнопка «Остановить» в отладчике не помогает. Это означает, что выполнение кода на встроенном языке завершено, и управление перешло к ядру платформы (на уровень C++). Выясним причину такого поведения.
Когда мы запускаем штатное удаление объектов, платформа выполняет колоссальный объем работы, который не ограничивается простым Object.Delete(). Рассмотрим подробнее, что происходит за кулисами:
Платформа должна гарантировать, что после удаления не останется «битых» ссылок. Для этого строится дерево связей. Если объектов 260 000, то количество проверяемых таблиц и записей может исчисляться сотнями миллионов. Все эти данные платформа сохраняет во временных файлах (папка %TEMP% или каталог в папке сервера 1С).
Проанализируем ситуацию в конце процесса: когда последний объект физически удален, платформе нужно сформировать отчет для пользователя — список тех объектов, которые не удалось удалить из-за наличия ссылок на них. Именно здесь начинаются проблемы:
ДеревоЗначений или сложную структуру для передачи на клиент. Если ссылок на неудаленные объекты много, сериализация этой структуры в XML для передачи между сервером и клиентом может занимать десятки часов.Представление. Если это сложный документ в ERP, вычисление представления может вызывать программный код в модуле менеджера, что порождает тысячи мелких запросов к базе.В файловом режиме (как в примере с ERP) ситуация усугубляется особенностями движка базы данных. Посмотрим на пример: при массовых операциях база работает с временными таблицами внутри файла базы данных или в системных временных файлах.
Когда транзакция удаления завершается, файловый движок должен выполнить «сборку мусора» и обновить индексы. В ERP таблицы индексов огромны. Несмотря на то, что записи в Журнал регистрации не идут (так как данные объектов не меняются), на уровне файловой системы происходит реорганизация страниц данных. Выясним причину чтения «малыми порциями»: это работа операционной системы и драйвера файловой системы по сбросу кэша записи и проверке целостности фрагментированного файла .1CD.
При загрузке через КД 2.0 используется последовательный разбор XML-файла. Рассмотрим подробнее, почему сеанс висит после загрузки:
ЗафиксироватьТранзакцию() может выполняться несколько часов, пока СУБД сбрасывает логи на диск.Чтобы не ждать 18 дней, разберем по шагам правильную стратегию работы с большими объемами данных:
Никогда не удаляйте и не грузите сотни тысяч объектов одним махом. Посмотрим на пример концептуального кода для удаления порциями:
Выборка = ПомеченныеНаУдаление.Выбрать();
Счетчик = 0;
Пока Выборка.Следующий() Цикл
НачатьТранзакцию();
Попытка
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Удалить();
Счетчик = Счетчик + 1;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
КонецПопытки;
Если Счетчик % 1000 = 0 Тогда
// Освобождаем память и даем платформе "вдохнуть"
ОбработкаПрерыванияПользователя();
КонецЕсли;
КонецЦикла;
Важный момент: штатная обработка удаления в 1С 8.3 имеет режим «Удалять порциями», который значительно снижает нагрузку на память и временные файлы.
Перед массовой загрузкой в ERP или Комплексную автоматизацию стоит временно отключить:
РегистрыНакопления.УстановитьИспользованиеИтогов(Ложь). Это ускорит запись в разы.Для удаления огромного количества объектов профессионалы рекомендуют использовать «Инструменты разработчика». Они позволяют обходить штатный механизм поиска ссылок платформой и выполнять его более оптимальными SQL-запросами, что сокращает время поиска с недель до часов.
Платформа 1С после завершения записи данных занималась десериализацией и подготовкой отчета о результатах операции. Огромный объем временных данных, накопленный за дни работы, требовал длительного времени на обработку внутренними алгоритмами ядра (C++), которые не транслируются в журнал регистрации и не прерываются отладчиком. Чтение малыми порциями — это признак того, что платформа «переваривала» гигантский временный файл со ссылками, пытаясь построить финальное дерево результатов для отображения пользователю.