Массовая отмена проведения документов и установка пометок на удаление — это ресурсоемкие операции, которые создают колоссальную нагрузку на дисковую подсистему и таблицы СУБД. Если во время такой процедуры в базе продолжают работать пользователи или запускаются регламентные задания, неизбежно возникают взаимоблокировки данных (дедлоки), критические замедления и ошибки параллельного доступа. Разберем, как правильно заблокировать информационную базу для пользователей, почему монопольный режим не решает задачу ускорения и как максимально оптимизировать саму процедуру пакетной обработки.
В типовой конфигурации 1С:Управление торговлей 10.3 реализован встроенный механизм управления сеансами. Для его использования выполним следующие шаги:
При включении блокировки система запускает таймер оповещения активных клиентов. По истечении отведенного времени клиентские приложения пользователей вызывают метод ЗавершитьРаботуСистемы(Ложь). Чтобы запустить сеанс администратора во время активного запрета, необходимо добавить в свойствах ярлыка запуска 1С ключ командной строки:
/UC <КодРазрешения>
По завершении регламентных работ блокировка снимается в том же окне снятием соответствующего флага либо автоматически по наступлению указанного времени окончания.
Если в базе зависли пользовательские сеансы, штатная обработка конфигурации не сможет завершить их принудительно. В клиент-серверной архитектуре наиболее надежным способом изоляции базы является настройка кластера серверов 1С:
Аналогичные параметры можно передать программно через утилиту командной строки rac или параметры пакетного запуска платформы /SessionLock и /SetScheduledJobsDenied.
Попытка вызвать метод платформы УстановитьМонопольныйРежим(Истина) в многопользовательской базе часто приводит к ошибке. Проанализируем причины:
.1CD), исключая сетевые межпроцессные блокировки.Чтобы ускорить процесс обработки большого объема документов в разы, применим комплекс инженерных решений:
ПередЗаписью, ОбработкаУдаленияПроведения) и блокирует накопление изменений в планах обмена.
Посмотрим на практический пример пакетной обработки с отключением проверок:
Порция = 200;
Счетчик = 0;
НачатьТранзакцию();
Для Каждого СсылкаДок Из МассивДокументов Цикл
ДокументОбъект = СсылкаДок.ПолучитьОбъект();
ДокументОбъект.ОбменДанными.Загрузка = Истина;
// Снимаем проведение без вызова сложных прикладных алгоритмов
Если ДокументОбъект.Проведен Тогда
ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
КонецЕсли;
// Устанавливаем пометку удаления
ДокументОбъект.ПометкаУдаления = Истина;
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Счетчик = Счетчик + 1;
Если Счетчик % Порция = 0 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
Перед запуском масштабной операции на рабочей базе SQL также рекомендуется временно перевести модель восстановления базы данных (Recovery Model) в режим Simple (Простая) и заранее выделить свободное дисковое пространство под файл журнала транзакций, чтобы предотвратить задержки на авторасширение.