Работа с регистрами сведений, содержащими десятки миллионов записей, часто становится серьезным испытанием для администраторов и программистов 1С. Когда стандартные операции удаления данных начинают приводить к ошибкам типа «Недостаточно памяти для выполнения запроса» или перезагрузке rphost, требуется переход к более надежным методам управления данными. Давайте разберем, как подойти к этой задаче системно.
Основная проблема при работе с большими объемами данных в 1С заключается в попытке сервера считать слишком много информации в оперативную память. Когда вы запускаете запрос или создаете НаборЗаписей, платформа пытается сформировать объектную модель для всех отобранных записей. Если условие отбора охватывает миллионы строк, сервер 1С неминуемо «захлебнется» в попытках обработать такой массив данных, что приводит к критическому росту потребления RAM и падению рабочего процесса.
Самый безопасный способ избежать переполнения памяти — это дробление задачи на мелкие, контролируемые порции. Вместо удаления всего объема сразу, работайте с небольшими группами данных.
Рассмотрим вариант реализации удаления через НаборЗаписей с цикличным обходом по конкретным элементам номенклатуры:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Спр.Ссылка ИЗ Справочник.Номенклатура КАК Спр ГДЕ Спр.Ссылка В (&Группа)";
Запрос.УстановитьПараметр("Группа", ВыбраннаяГруппа);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Номенклатура.Установить(Выборка.Ссылка);
Набор.Записать(); // Очистка всех цен по одной позиции
КонецЦикла;
Этот метод позволяет минимизировать блокировки, так как транзакция охватывает лишь одну номенклатурную позицию, а не всю таблицу регистра.
Если конфигурация и объем данных не позволяют использовать стандартные механизмы 1С из-за их медлительности, приходится обращаться к возможностям MS SQL Server напрямую. Однако делать это нужно крайне осторожно.
DELETE в циклах, удаляя записи порциями по 50-100 тысяч штук. Это предотвращает переполнение журнала транзакций SQL Server.Table Scan, что практически гарантирует зависание всей системы.Часто задача звучит не просто как «удалить всё», а как «очистить всё, кроме последних актуальных цен». В таком случае последовательность действий должна быть следующей:
НаборЗаписей или прямой INSERT в SQL.Помните, что прямые манипуляции с таблицами SQL минуют механизмы 1С. После выполнения подобных операций в обязательном порядке:
Работая с регистрами, содержащими более 70 миллионов записей, старайтесь избегать вложенных запросов. Построение простых, линейных запросов к БД позволяет оптимизатору SQL работать гораздо эффективнее, что сбережет ресурсы вашего сервера и нервы пользователей.