Как очистить список предупреждений синхронизации при накоплении более 1 миллиона записей?

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

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

Анализ причин зависания системы

Основная причина заключается в попытке интерактивного доступа к огромному набору данных. Платформа 1С при открытии формы выполняет запрос ко всей таблице, что вызывает тайм-аут. Важно понимать, что простое удаление записей — это борьба со следствием. Если записи возникают из-за ДатыЗапретаРедактирования, их удаление без изменения правил обмена или политики доступа приведет к тому, что при следующем сеансе обмена они появятся снова.

Решение проблемы программной очисткой

Для массовой обработки данных мы не можем полагаться на стандартные механизмы удаления, которые пытаются прочитать все записи разом. Нам необходимо использовать выборку записей через Запрос с последующей порционной очисткой. Разберем по шагам, как это реализовать:

  1. Создадим запрос, который выберет только те записи, которые необходимо удалить (например, по типу версии и периоду).
  2. Используем НаборЗаписей для порционного удаления, чтобы не перегружать SQL-сервер и не блокировать таблицу на долгое время.

Рассмотрим пример кода, который позволяет очистить регистр ВерсииОбъектов:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ВерсииОбъектов.Объект КАК Объект
    |ИЗ
    |	РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    |	ВерсииОбъектов.ТипВерсииОбъекта = &ТипВерсииОбъекта
    |	И ВерсииОбъектов.ДатаВерсии МЕЖДУ &ДатаНачала И КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ)";

Запрос.УстановитьПараметр("ДатаНачала", Объект.ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", Объект.ДатаОкончания);
Запрос.УстановитьПараметр("ТипВерсииОбъекта", Объект.ТипВерсии);

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    НаборЗаписей.Отбор.Объект.Установить(ВыборкаДетальныеЗаписи.Объект);
    НаборЗаписей.Прочитать();
    НаборЗаписей.Очистить();
    НаборЗаписей.Записать();
КонецЦикла;

Особенности работы с отборами в наборах записей

При попытке очистки важно учитывать технические ограничения платформы 1С:Предприятие. Объект РегистрСведенийНаборЗаписей позволяет устанавливать отбор только по измерениям, регистратору или периоду (в зависимости от настроек регистра). Если вы попытаетесь установить отбор по полю, которое не является измерением, система выдаст ошибку Поле объекта не обнаружено. Перед выполнением очистки обязательно проверьте структуру регистра в Конфигураторе.

Рекомендации для клиент-серверных баз

Если база данных работает в режиме клиент-сервер, прямое выполнение запросов к SQL может быть значительно быстрее программных методов 1С. Это связано с тем, что SQL работает с данными на уровне страниц БД, минуя накладные расходы платформы на сериализацию объектов. Однако данный метод является более опасным для неподготовленного пользователя. Обязательно:

Заключение

Подводя итог, можно сказать, что решение проблемы «миллиона предупреждений» лежит в плоскости автоматизации очистки. Используйте порционную обработку через Запрос и НаборЗаписей, чтобы обеспечить стабильную работу базы данных. Параллельно с технической очисткой обязательно проанализируйте настройки синхронизации, чтобы исключить причины возникновения конфликтов, так как автоматическое удаление записей — это лишь способ поддержания системы в работоспособном состоянии, а не исправление логики обмена.

← На главную