При работе с крупными информационными базами на платформе 1С:Предприятие 8.3 специалисты часто сталкиваются с ситуацией, когда стандартные механизмы очистки данных приводят к аварийному завершению работы сервера. Типичный сценарий: при попытке заменить около тысячи дублей справочника Контрагенты, процесс rphost начинает стремительно поглощать оперативную память (вплоть до 30-64 Гб и выше), что в конечном итоге «роняет» сессии всех активных пользователей. Рассмотрим подробнее, почему это происходит и как решить данную проблему, не прибегая к радикальному увеличению аппаратных мощностей.
Проанализируем техническую сторону вопроса. Проблема кроется не в самом удалении объектов, а в подготовительном этапе — установке блокировок данных. Типовая обработка «Поиск и удаление дублей» использует программный интерфейс БСП, в частности метод ОбщегоНазначения.ЗаменитьСсылки. Прежде чем начать транзакцию по замене ссылок, система пытается защитить данные от изменения другими пользователями.
Выясним, как формируется очередь блокировок. В конфигурациях с большим количеством метаданных (например, БИТ.ФИНАНС, ERP или Комплексная автоматизация) количество таблиц может исчисляться тысячами. Алгоритм БСП в старых версиях работает по следующему принципу: для каждого заменяемого объекта создается запись в объекте БлокировкаДанных для каждой таблицы, где этот тип данных может быть использован (включая все регистры сведений, накопления и документы с составными типами данных).
Проведем несложный расчет: если мы заменяем 1 000 ссылок, а в конфигурации 1 500 таблиц, система пытается создать 1,5 миллиона элементов блокировки. На платформе версии 8.3.9 и ниже объект БлокировкаДанных крайне неэффективно управляет памятью, не освобождая ее до полного завершения процедуры. В результате мы наблюдаем ситуацию, когда за несколько минут количество строк блокировки достигает сотен миллионов, что моментально «съедает» доступные 30 Гб памяти еще до начала реальной записи изменений.
Самый простой и действенный метод без изменения программного кода — это ручное ограничение объема транзакции. Вместо того чтобы пытаться заменить все 1000 найденных дублей одним нажатием кнопки, выполним следующие шаги:
Почему это помогает? Масштаб таблицы блокировок линейно зависит от количества заменяемых ссылок. Сократив количество объектов в 10 раз, мы кратно снижаем нагрузку на менеджер блокировок и предотвращаем переполнение памяти rphost.
Проанализируем настройки обработки. Часто система тратит ресурсы на блокировку таблиц, в которых заменяемые ссылки гарантированно отсутствуют или которые являются архивными. Если версия вашей БСП позволяет редактировать правила поиска, выполним следующие действия:
Контрагенты используются только в определенных документах, ограничим область поиска только этими метаданными.Это позволит сократить количество итераций метода ЗаменитьСсылки и уменьшить итоговый объем объекта БлокировкаДанных.
Если типовая обработка не справляется даже при малых порциях, рассмотрим альтернативные инструменты. Одним из наиболее эффективных решений является использование подсистемы «Инструменты разработчика» (DevTools).
В отличие от типового механизма БСП, специализированная обработка «Поиск и замена ссылок» из этого пакета работает по другому алгоритму:
Использование подобных инструментов позволяет обходить ограничения платформы 1С по памяти, хотя процесс может занять больше времени из-за частого открытия и закрытия транзакций.
Если вы решили внести изменения в код, обратите внимание на вызов функции в общем модуле. Рассмотрим пример типичного вызова:
ПарыЗамен = Новый Массив;
// Заполнение массива структур ПараЗамены (Дубль, Оригинал)
ПараметрыЗамены = ОбщегоНазначения.ПараметрыЗаменыСсылок();
ПараметрыЗамены.ВключатьБизнесЛогику = Ложь;
ОбщегоНазначения.ЗаменитьСсылки(ПарыЗамен, ПараметрыЗамены);
При анализе ситуации выясним, что внутри ОбщегоНазначения.ЗаменитьСсылки вызывается механизм, который инициализирует БлокировкаДанных. Чтобы избежать утечки памяти на старых релизах платформы (таких как 8.3.9.1850), рекомендуется:
ЗаменитьСсылки вызывалась в цикле для каждой пары отдельно, при этом обязательно вызывая СредстваГеопозиционирования.Очистить() или принудительно завершая процедуру для высвобождения контекста (хотя в рамках одной сессии это сложно реализовать без фоновых заданий).Важный момент: в конфигурациях типа БИТ.ФИНАНС часто присутствуют подписки на события, которые срабатывают при записи объектов. При массовой замене ссылок эти подписки могут инициировать дополнительные расчеты или поиски, что создает рекурсивную нагрузку. По возможности, при проведении технических работ по очистке дублей, стоит временно отключать необязательные регламентные задания.