Как заблокировать базу 1С:УТ 10.3 для пользователей на время массовой обработки документов?

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

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

Штатная блокировка соединений через интерфейс программы

В типовой конфигурации 1С:Управление торговлей 10.3 реализован встроенный механизм управления сеансами. Для его использования выполним следующие шаги:

  1. Откроем главное меню: Сервис → Блокировка установки соединений с информационной базой.
  2. Установим флаг Блокировка установки соединений включена.
  3. Укажем период действия блокировки (время начала и планируемое время окончания).
  4. Зададим текст сообщения, которое увидят пользователи при попытке входа в систему или перед завершением текущей работы.
  5. Установим Код разрешения (секретный ключ/пароль), который позволит администратору войти в заблокированную базу для выполнения регламентных процедур.

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

/UC <КодРазрешения>

По завершении регламентных работ блокировка снимается в том же окне снятием соответствующего флага либо автоматически по наступлению указанного времени окончания.

Блокировка на уровне сервера 1С:Предприятия (клиент-серверный вариант)

Если в базе зависли пользовательские сеансы, штатная обработка конфигурации не сможет завершить их принудительно. В клиент-серверной архитектуре наиболее надежным способом изоляции базы является настройка кластера серверов 1С:

  1. Откроем консоль Администрирование кластера серверов 1С:Предприятия.
  2. Перейдем к списку информационных баз, откроем свойства нужной базы.
  3. Установим флаги Блокировка начала сеансов включена и Блокировка регламентных заданий включена.
  4. Заполним поля Начало, Конец, Сообщение блокировки и укажем Код разрешения.
  5. Откроем ветку Сеансы нужной базы и принудительно удалим все оставшиеся активные подключения.

Аналогичные параметры можно передать программно через утилиту командной строки rac или параметры пакетного запуска платформы /SessionLock и /SetScheduledJobsDenied.

Почему «УстановитьМонопольныйРежим(Истина)» не подходит?

Попытка вызвать метод платформы УстановитьМонопольныйРежим(Истина) в многопользовательской базе часто приводит к ошибке. Проанализируем причины:

  1. Метод не сбрасывает сеансы: если в системе присутствует хотя бы один пользователь или активно хотя бы одно фоновое/регламентное задание, вызов метода вызовет исключение времени выполнения.
  2. Отсутствие прироста скорости в клиент-сервере: монопольный режим блокирует метаданные от изменений другими сеансами, но в среде СУБД (SQL) транзакции записи, пересчет индексов и сброс страниц журнала транзакций выполняются по стандартным правилам. Заметное ускорение монопольный режим дает только в файловом варианте (.1CD), исключая сетевые межпроцессные блокировки.

Оптимизация массовой отмены проведения и пометки на удаление

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

  1. Использование свойства «ОбменДанными.Загрузка = Истина»:
    Установка этого флага перед вызовом методов записи или отмены проведения отключает тяжелые прикладные проверки в модуле документа (события ПередЗаписью, ОбработкаУдаленияПроведения) и блокирует накопление изменений в планах обмена.
  2. Пакетное оформление транзакций:
    Запись каждого документа в отдельной неявной транзакции перегружает диск частыми операциями записи в лог (flush). Оборачивание всего массива в одну общую транзакцию опасно переполнением журнала транзакций СУБД и потерей всех данных при сбое. Оптимально фиксировать данные порциями по 100–500 документов.
  3. Отключение итогов регистров:
    При удалении движений прошлых периодов система непрерывно актуализирует таблицы итогов регистров накопления. Для ускорения мы можем временно отключить итоги, выполнить очистку и затем пересчитать их один раз.

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


Порция = 200;
Счетчик = 0;
НачатьТранзакцию();

Для Каждого СсылкаДок Из МассивДокументов Цикл
    ДокументОбъект = СсылкаДок.ПолучитьОбъект();
    ДокументОбъект.ОбменДанными.Загрузка = Истина;
    
    // Снимаем проведение без вызова сложных прикладных алгоритмов
    Если ДокументОбъект.Проведен Тогда
        ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
    КонецЕсли;
    
    // Устанавливаем пометку удаления
    ДокументОбъект.ПометкаУдаления = Истина;
    ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
    
    Счетчик = Счетчик + 1;
    Если Счетчик % Порция = 0 Тогда
        ЗафиксироватьТранзакцию();
        НачатьТранзакцию();
    КонецЕсли;
КонецЦикла;

Если ТранзакцияАктивна() Тогда
    ЗафиксироватьТранзакцию();
КонецЕсли;

Перед запуском масштабной операции на рабочей базе SQL также рекомендуется временно перевести модель восстановления базы данных (Recovery Model) в режим Simple (Простая) и заранее выделить свободное дисковое пространство под файл журнала транзакций, чтобы предотвратить задержки на авторасширение.

← На главную