Почему встроенная замена ссылок в 1С выполняется очень долго и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При администрировании и поддержке крупных баз данных на платформе «1С:Предприятие 8» (особенно на базе современных конфигураций, таких как «Бухгалтерия предприятия 3.0», «ERP Управление предприятием» или «Комплексная автоматизация») специалисты часто сталкиваются со следующей проблемой: штатный механизм удаления помеченных объектов буквально «зависает» на этапе замены ссылок. Процесс, который ранее занимал считанные минуты, начинает выполняться часами даже для относительно небольшого количества элементов (например, несколько сотен дублей контрагентов или налогов).

В этой статье мы подробно проанализируем, почему встроенный механизм Библиотеки стандартных подсистем (БСП) работает так медленно, какие внутренние процессы платформы и СУБД на это влияют, а также разберем практические способы ускорения замены ссылок в десятки и сотни раз.

---

Как устроен стандартный сценарий замены ссылок

Давайте вспомним, как выглядит типовой процесс удаления объектов в современных конфигурациях. Когда мы инициируем удаление помеченных элементов, система выполняет поиск всех мест их использования в базе данных. Если ссылки на удаляемый объект найдены в документах, справочниках или регистрах, 1С выводит диалоговое окно со списком этих мест и предлагает заменить старую ссылку на другую (например, на правильный предопределенный элемент или на актуальный аналог).

После выбора целевого элемента запускается встроенная процедура замены ссылок, по завершении которой система предлагает повторить удаление. Логика этого процесса абсолютно верна с точки зрения целостности данных, однако техническая реализация встроенного механизма БСП накладывает жесткие ограничения на производительность.

---

Выясняем причины низкой производительности встроенного механизма

Проанализируем ключевые технические факторы, из-за которых встроенный поиск и замена ссылок могут выполняться часами.

1. Включение полной бизнес-логики при записи объектов

Это самый главный фактор замедления. По умолчанию встроенная функция БСП ЗаменитьСсылки производит перезапись всех измененных объектов с параметром:

ОбменДанными.Загрузка = Ложь

Что это означает на практике? При изменении ссылки в любом документе (даже если он был проведен несколько лет назад) система заново запускает всю тяжелую прикладную бизнес-логику:

Если заменяемая ссылка присутствует в сотнях проведенных документов, система пытается пересчитать по ним огромный объем данных, что приводит к колоссальным временным затратам.

2. Масштабные транзакции и блокировки данных

В стандартном коде БСП параметр ЗаменаПарыВТранзакции по умолчанию установлен в значение Истина. Это значит, что замена всех мест использования для одного дублирующегося элемента выполняется внутри одной неделимой транзакции СУБД.

Если один элемент (например, зачетверенный налог или статья затрат) используется в 400 документах, СУБД пытается одновременно наложить эксклюзивные блокировки на все эти 400 таблиц и записей. Это вызывает:

3. Отсутствие группировки по объектам базы данных

Стандартный алгоритм БСП не всегда оптимально группирует данные. Если в рамках одного документа (или в его различных табличных частях) содержится несколько заменяемых ссылок, система может считывать этот документ из базы данных, модифицировать его и записывать обратно несколько раз подряд. Это приводит к избыточным операциям чтения-записи (I/O) на дисковой подсистеме сервера.

4. Постоянный пересчет итогов регистров

При изменении аналитики в движениях документов СУБД тратит много ресурсов на актуализацию индексов и пересчет итогов регистров накопления и бухгалтерии. Если транзакция не оптимизирована, пересчет происходит итеративно для каждого объекта, что парализует производительность дисковой подсистемы.

5. Анализ служебных и техногенных таблиц

При поиске мест использования система сканирует абсолютно все таблицы метаданных конфигурации. В этот процесс вовлекаются огромные служебные таблицы:

Если в конфигурации не настроены исключения для поиска, система будет тратить драгоценное время на перезапись архивных данных, не имеющих практического значения для оперативного учета.

---

Разбираем способы решения проблемы и оптимизации процесса

Для того чтобы обойти ограничения встроенного механизма БСП и выполнить замену ссылок максимально быстро, рассмотрим несколько эффективных подходов.

Способ 1. Использование альтернативных инструментов разработчика

Для массовой замены сотен или тысяч ссылок мы рекомендуем отказаться от штатного интерактивного удаления БСП в пользу внешних специализированных обработок. Наилучшим выбором является использование инструментов из пакета «Инструменты разработчика» (ИР) или оптимизированных обработок поиска и замены дублей.

Главное преимущество таких инструментов — возможность принудительной установки режима загрузки данных без вызова бизнес-логики 1С:

ОбменДанными.Загрузка = Истина

В этом режиме запись объектов происходит напрямую в таблицы базы данных «как есть». Пропускаются все проверки заполнения, подписки на события и тяжелые обработчики проведения. Скорость замены в таком случае увеличивается в сотни раз — замена сотен ссылок завершается за секунды вместо часов.

Способ 2. Программный вызов замены с отключением транзакционности для пар

Если вам необходимо выполнить замену программно (например, в собственной обработке обслуживания базы данных), мы можем использовать программный интерфейс БСП, переопределив параметры транзакций.

Рассмотрим пример кода, в котором отключается выполнение всей замены в рамках одной транзакции:


// Создаем структуру параметров для оптимизации замены ссылок
ПараметрыЗамены = Новый Структура;
ПараметрыЗамены.Вставить("ЗаменаПарыВТранзакции", Ложь);
ПараметрыЗамены.Вставить("ВыполнитьВТранзакции", Ложь);
ПараметрыЗамены.Вставить("ЗаписыватьВ режимеЗагрузки", Истина); // Если поддерживается версией БСП

// Формируем таблицу заменяемых элементов
ТаблицаЗамен = Новый ТаблицаЗначений;
ТаблицаЗамен.Колонки.Добавить("ИсходнаяСсылка", Новый ОписаниеТипов("СправочникСсылка.НалогиИОтчисления"));
ТаблицаЗамен.Колонки.Добавить("НоваяСсылка", Новый ОписаниеТипов("СправочникСсылка.НалогиИОтчисления"));

// Заполняем таблицу дубликатами
СтрокаЗамены = ТаблицаЗамен.Добавить();
СтрокаЗамены.ИсходнаяСсылка = ДубликатНалога;
СтрокаЗамены.НоваяСсылка = ПравильныйНалог;

// Вызываем штатный метод БСП с оптимизированными параметрами
ОбщегоНазначения.ЗаменитьСсылки(ТаблицаЗамен, ПараметрыЗамены);

При таком подходе замена в каждом конкретном объекте будет выполняться в отдельной транзакции. Это исключит эскалацию блокировок таблиц СУБД и позволит пользователям продолжать комфортную работу в базе параллельно с процессом замены.

Способ 3. Настройка исключений поиска ссылок в конфигурации

Чтобы встроенный механизм поиска не тратил ресурсы на анализ архивных и версионируемых данных, мы можем программно добавить исключения. Для этого проанализируем общий модуль ОбщегоНазначенияПереопределяемый и процедуру ПриДобавленииИсключенийПоискаСсылок.

Посмотрим на пример добавления исключений:


Процедура ПриДобавленииИсключенийПоискаСсылок(ОбластиПоиска) Экспорт
    // Исключаем из анализа тяжелые служебные регистры сведений
    ОбластиПоиска.Исключить(Метаданные.РегистрыСведений.ВерсииОбъектов);
    ОбластиПоиска.Исключить(Метаданные.РегистрыСведений.ИсторияЗапусковРегламентныхЗаданий);
    ОбластиПоиска.Исключить(Метаданные.РегистрыСведений.РезультатыОбменаДанными);
КонецПроцедуры

Это позволит существенно сузить область сканирования базы данных СУБД и ускорить как сам поиск мест использования, так и последующую замену.

---

Рекомендации по проведению массовой замены ссылок

Чтобы избежать зависаний базы данных и повреждения транзакционной логики, рекомендуем придерживаться следующих правил при работе с большими объемами данных:

  1. Выполняйте замену в монопольном режиме: Если замену приходится делать штатными средствами без отключения бизнес-логики (с флагом Загрузка = Ложь), обязательно планируйте эти работы на период минимальной активности пользователей (ночью или в технологическое окно). Отсутствие конкурентных блокировок сократит время выполнения операций СУБД в геометрической прогрессии.
  2. Разбивайте задачи на порции: Не пытайтесь заменить ссылки сразу для сотен разнородных объектов. Выполняйте операцию точечно — например, по 5-10 элементов за один проход. Короткие транзакции завершаются быстрее и безопаснее для системы.
  3. Всегда делайте резервную копию: Использование режима ОбменДанными.Загрузка = Истина несет в себе риски нарушения логической целостности (например, в базе могут остаться проведенные документы с некорректными с точки зрения бизнес-логики реквизитами). Перед выполнением подобных оптимизированных замен обязательно создавайте резервную копию базы данных и проверяйте результат на тестовом контуре.
← На главную