Оптимизация проведения документов по нескольким регистрам в 1С
- Проведение одного документа длится более 3-10 секунд.
- Транзакция удерживает исключительные блокировки на 5-10 регистрах одновременно, парализуя работу смежных отделов.
- Длительные ожидания по событию технологического журнала
SDBLиTLOCKS.
1. Переход на методику оперативного проведения (Запись = Истина)
Не записывайте движения в регистры по отдельности в теле алгоритма. Заполняйте наборы записей в оперативной памяти и записывайте их пакетом в конце процедуры ОбработкаПроведения:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// 1. Установка управляемых блокировок по всем регистрам разом
УстановитьБлокировки();
// 2. Один пакетный запрос: чтение всех остатков и цен по всем регистрам
РезультатыЗапроса = ВыполнитьПакетныйЗапрос();
// 3. Проверка остатков в оперативной памяти
Если Не ПроверитьОстатки(РезультатыЗапроса, Отказ) Тогда
Возврат;
КонецЕсли;
// 4. Формирование наборов записей движений
Движения.ТоварыНаСкладах.Записывать = Истина;
Движения.Взаиморасчеты.Записывать = Истина;
ЗаполнитьДвижения(Движения.ТоварыНаСкладах, РезультатыЗапроса);
ЗаполнитьДвижения(Движения.Взаиморасчеты, РезультатыЗапроса);
КонецПроцедуры2. Исключение тяжелых расчетов и внешних вызовов из транзакции
- Никогда не отправляйте HTTP/SOAP запросы во внешние системы (CRM, Честный Знак, Банк) внутри транзакции проведения;
- Не генерируйте печатные формы и PDF-файлы внутри
ОбработкаПроведения; - Выносите вспомогательные расчеты в асинхронные фоновые очереди.
Частые вопросы (FAQ)
Почему нельзя выполнять запросы внутри цикла по строкам документа?
Запрос внутри цикла (N+1) генерирует сотни обращений к СУБД, кратно увеличивая сетевые задержки и общее время удержания транзакции.
Что такое 'смещенная транзакция'?
Это антипаттерн, когда транзакция открывается задолго до реальной записи данных (например, во время подготовки экранной формы), блокируя ресурсы для других пользователей.
Как влияет режим 'Записывать = Истина' на скорость проведения?
Платформа 1С оптимизирует запись всех помеченных наборов движений, сбрасывая их в СУБД за минимальное количество сетевых пакетов перед фиксацией транзакции.
Нужно ли очищать движения перед повторным проведением?
При оперативном проведении рекомендуется использовать режим 'ЗаписыватьВыбранные', очищая только те наборы, которые действительно перезаписываются.