Работа с крупными базами данных в среде 32-битного сервера 1С:Предприятие накладывает серьезные технические ограничения. Одной из наиболее острых проблем является массовое удаление объектов (например, после свертки базы 1С:БГУ), когда количество помеченных элементов исчисляется сотнями тысяч. Стандартная обработка «Удаление помеченных объектов» в таких условиях часто завершается аварийно с ошибкой нехватки памяти, так как процесс rphost упирается в предел адресного пространства (около 2-3 ГБ). В этой статье мы разберем, как обойти это ограничение и успешно провести зачистку базы.
Рассмотрим механику процесса. Перед фактическим удалением система обязана выполнить контроль ссылочной целостности — проверить, не ссылаются ли другие объекты на те, что мы хотим удалить. Для этого используется функция НайтиСсылки(). Когда объектов 300 000 и более, таблица связей, которую 1С строит в оперативной памяти для анализа, разрастается до гигантских размеров. В 32-битной архитектуре один рабочий процесс просто не может выделить достаточно памяти под эту структуру, что приводит к завершению работы процесса.
Проанализируем наиболее эффективный способ, предложенный опытными специалистами. Использование портативного варианта Инструментов разработчика (ИР) позволяет значительно оптимизировать поиск ссылок. В отличие от штатных механизмов, ИР могут работать в клиентском контексте или использовать более эффективные алгоритмы обхода графа ссылок.
Если серверная память все равно переполняется, попробуйте запустить инструменты в 64-битном тонком клиенте (если клиентская машина позволяет) или использовать параметр запуска ЗапретитьАсинхронностьИР. Это поможет локализовать вычисления и снизить нагрузку на серверный процесс rphost.
Если «спортивный интерес» уступает место производственной необходимости, воспользуемся легальной возможностью временного апгрейда. Для этого можно использовать лицензию для разработчиков. Разберем по шагам алгоритм действий:
Out of Memory.Если мы абсолютно уверены, что ссылки на объекты отсутствуют (например, после корректно выполненной свертки), можно прибегнуть к программному удалению. Однако даже здесь важно соблюдать осторожность. Выясним, как правильно реализовать этот процесс, чтобы не перегрузить транзакционный лог СУБД и память сервера.
Рассмотрим пример кода для удаления объектов небольшими порциями:
// Пример удаления объектов порциями по 1000 штук
Процедура УдалитьОбъектыПорциями(ТипОбъекта)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ССЫЛКА
|ИЗ " + ТипОбъекта + "
|ГДЕ ПометкаУдаления = ИСТИНА";
Результат = Запрос.Выполнить().Выгрузить();
ВсегоОбъектов = Результат.Количество();
МассивДляУдаления = Новый Массив;
Для Индекс = 0 По ВсегоОбъектов - 1 Цикл
МассивДляУдаления.Добавить(Результат[Индекс].Ссылка);
// Каждые 1000 объектов выполняем удаление
Если МассивДляУдаления.Количество() >= 1000 Тогда
УдалитьОбъекты(МассивДляУдаления, Истина); // Истина - проверять ссылки
МассивДляУдаления.Очистить();
КонецЕсли;
ДляЗавершения
// Удаляем остаток
Если МассивДляУдаления.Количество() > 0 Тогда
УдалитьОбъекты(МассивДляУдаления, Истина);
КонецЕсли;
КонецПроцедуры
Метод УдалитьОбъекты(МассивСсылок, ПроверятьСсылочнуюЦелостность) работает быстрее, чем поштучное удаление в цикле, но при этом позволяет контролировать объем данных, обрабатываемых за один вызов.
Для облегчения работы 32-битного сервера проанализируем настройки консоли администрирования 1С. Эти шаги помогут высвободить ресурсы для процедуры удаления:
rphost, который не будет делить свои 2 ГБ памяти с другими пользователями.В конфигурации 1С:БГУ объекты сильно взаимосвязаны, но есть типы данных, которые можно удалять в первую очередь. Проанализируем ситуацию: сначала стоит удалять объекты, на которые реже всего ссылаются другие сущности. Это могут быть записи регистров сведений, специфические справочники аналитик или документы прошлых периодов, которые точно не связаны с текущим учетом.
Используйте штатную возможность удаления «по видам объектов». Выбирайте по одному типу справочника за раз. Это значительно уменьшает объем дерева ссылок, которое система строит в памяти при проверке, и позволяет 32-битному серверу уложиться в лимиты памяти.
Если вы обладаете навыками работы с СУБД, поиск ссылок можно переложить на плечи SQL-сервера. Это самый быстрый способ. Выясним причину: SQL-сервер оптимизирован для работы с большими таблицами и сложными связями. После того как внешним запросом подтверждено отсутствие ссылок на конкретные GUID, их можно удалить программным методом Объект.Удалить() непосредственно из 1С, что сработает мгновенно, так как проверка ссылок уже не потребуется.
Важное предупреждение: Любые операции по массовому удалению данных должны проводиться строго после создания полной резервной копии базы данных! В случае использования метода Объект.Удалить() восстановить данные без бэкапа будет невозможно.