Работа с высоконагруженными системами, такими как интеграция с системой маркировки «Честный ЗНАК», часто приводит к техническим сложностям. Одной из наиболее частых проблем является «раздувание» журнала регистрации (ЖР) из-за выполнения тысяч операций записи в базу данных. В этой статье мы разберем, как оптимизировать этот процесс и избежать переполнения логов, сохранив производительность системы.
Первое, на что стоит обратить внимание — это способ записи данных. Если вы записываете каждую строку в регистр сведений по отдельности, платформа 1С создает соответствующую запись в журнале для каждой операции. Чтобы минимизировать количество транзакций и событий в журнале, используйте запись набором записей.
При использовании РегистрСведенийНаборЗаписей вся пачка данных (например, 300 000 кодов маркировки) будет обработана как единое целое. Это позволит системе создать одну запись в журнале для всей операции, что радикально сократит объем хранимой информации.
При проектировании регистра сведений для таких задач важно грамотно определить структуру измерений:
ИдентификаторПакета — для логической группировки данных.КодМарки — собственно значение маркировки.ХэшКода — для корректного сравнения строковых значений, так как регистрозависимые данные могут вызывать дублирование или ошибки поиска.Если массовая загрузка выполняется программно, вы можете временно отключить регистрацию событий создания и обновления данных для конкретного сеанса. Для этого используется объект ИспользованиеСобытияЖурналаРегистрации и метод глобального контекста УстановитьИспользованиеСобытияЖурналаРегистрации.
Разберем пример реализации такой функции:
Процедура РегистрироватьСобытияЖурналаРегистрацииПриМассовойЗаписи(Регистрировать) Экспорт
УстановитьПривилегированныйРежим(Истина);
ИспользованиеСобытия = Новый ИспользованиеСобытияЖурналаРегистрации();
ИспользованиеСобытия.Использование = Регистрировать;
// Отключаем регистрацию событий создания и обновления
УстановитьИспользованиеСобытияЖурналаРегистрации("_$Data$_.New", ИспользованиеСобытия);
УстановитьИспользованиеСобытияЖурналаРегистрации("_$Data$_.Update", ИспользованиеСобытия);
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Важное предостережение: Данный метод влияет на весь текущий сеанс работы. Если ваша обработка выполняется в фоновом задании, изменения коснутся только этого задания, что безопасно. Однако никогда не вызывайте эту функцию в основном сеансе пользователя, так как это приведет к потере всех данных о действиях пользователя в журнале регистрации.
Если полностью отключить логирование не удается, необходимо пересмотреть стратегию обслуживания журнала регистрации:
ОчиститьЖурналРегистрации с установкой периода, если вам необходимо автоматизировать удаление старых записей.ВнешниеИсточникиДанных работает быстрее и не создает накладных расходов на платформенный ЖР.Подводя итог, можно сказать, что решение проблемы лежит в плоскости правильной архитектуры обмена. Старайтесь группировать данные, использовать НаборЗаписей и помнить об ограничениях сеансового управления журналом. Только комплексный подход, сочетающий правильный код и корректные настройки кластера, позволит системе стабильно работать с большими объемами данных.