Как устранить самоблокировки пользователей в 1С:ERP при расчете взаиморасчетов и партионного учета

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

В высоконагруженных системах на базе 1С:ERP Управление предприятием часто возникает специфическая проблема — так называемые «самоблокировки». Ситуация выглядит парадоксально: анализатор блокировок (например, сервис Гилева) показывает, что один и тот же пользователь конфликтует сам с собой. Один сеанс пользователя удерживает блокировку, а второй сеанс того же пользователя (часто фоновое задание) ожидает её освобождения в течение 10–20 секунд и более. Разберем подробно, почему это происходит и как оптимизировать работу системы.

Анализ причин возникновения конфликтов доступа

Первым делом проанализируем ситуацию, описанную в сообщениях темы. Основная причина того, что пользователь «сам себя блокирует», заключается в архитектуре отложенных расчетов 1С:ERP. Когда в системе включены опции автоматической актуализации данных, любое действие пользователя (проведение документа или открытие отчета) может инициировать запуск фонового задания под той же учетной записью.

Рассмотрим механизмы, которые чаще всего становятся источниками проблем:

  1. Автоматический расчет взаиморасчетов: При проведении первичных документов (заказы, накладные, оплаты) система проверяет актуальность данных в регистрах расчетов. Если включена опция запуска фонового задания, система мгновенно порождает новый сеанс для пересчета цепочки документов.
  2. Актуализация при формировании отчетов: Популярные отчеты, такие как «Ведомость по расчетам с клиентами» или «ОСВ», при открытии проверяют, есть ли нераспределенные суммы. Если есть, они «тихо» запускают фоновый процесс актуализации.
  3. Распределение партий: Аналогичный механизм работает для партионного учета (версия 2.2 и выше).

Проблема усугубляется, если в коде конфигурации или расширения используется неоптимальная запись данных. Рассмотрим пример кода, который часто становится «узким местом»:


ВыборкаПоДокументам = ДанныеДвижений.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПоДокументам.Следующий() Цикл
    НаборЗаписей = РегистрыНакопления.ДвиженияДенежныеСредстваКонтрагент.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаПоДокументам.Регистратор);
    Выборка = ВыборкаПоДокументам.Выбрать();
    Пока Выборка.Следующий() Цикл
        ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), Выборка);
    КонецЦикла;
    НаборЗаписей.Записать();
КонецЦикла;

Проанализируем этот фрагмент. Использование метода НаборЗаписей.Записать() внутри цикла по регистраторам — это классическая анти-паттерн для управляемых блокировок. Каждая итерация цикла удерживает транзакцию. Если документов в выборке много, транзакция становится «длинной», и блокировка на таблицы регистра накопления ДвиженияДенежныеСредстваКонтрагент удерживается до самого конца цикла. В это же время фоновое задание пытается обновить те же записи, что и приводит к ожиданию в 13 и более секунд.

Настройка функциональных опций для снижения нагрузки

Чтобы избавить систему от лишних конфликтов, нам необходимо проверить настройки распределения расчетов. В 1С:ERP перейдем в раздел НСИ и администрирование – Настройка НСИ и разделов – Казначейство (или Продажи/Закупки в зависимости от версии).

Выясним, какие настройки влияют на появление фоновых процессов:

  1. Автоматически запускать фоновое задание расчета взаиморасчетов при проведении документов: Если эта галочка установлена, то каждое проведение документа «подцепит» за собой фоновый процесс. В условиях многопользовательской работы это гарантированно приведет к блокировкам. Рекомендуется отключить эту опцию.
  2. Автоматически запускать фоновое задание расчета взаиморасчетов из отчетов: Эту опцию также следует отключить, чтобы отчеты формировались быстрее, пусть и на неактуальных (до момента регламентного расчета) данных.
  3. Режим ведения взаиморасчетов: Если вы используете режим Офлайн, система накапливает задания в специальных технических регистрах.

Проверим состояние констант в конфигураторе или через «Функции для технического специалиста»:

Установим их в значение Ложь, если блокировки мешают оперативной работе пользователей.

Оптимизация регламентных заданий

После отключения автоматических триггеров расчет взаиморасчетов будет выполняться только регламентным заданием. Здесь тоже есть свои нюансы. Посмотрим на типовое задание Выполнение отложенных движений по расчетам с клиентами/поставщиками.

Если интервал запуска составляет 600 секунд (10 минут), за это время может накопиться огромный объем данных. Когда задание запустится, оно заблокирует таблицы на длительное время. Рассмотрим два пути оптимизации:

Проблема «старых» хвостов в регистрах заданий

Часто причиной длительных блокировок становится наличие записей в регистрах сведений Задания к распределению расчетов с поставщиками и Задания к распределению расчетов с клиентами за прошлые периоды. Как было отмечено в обсуждении, там могут находиться записи за 2018 год, хотя на календаре 2019-й.

Почему это опасно? Система взаиморасчетов ERP работает по принципу FIFO в рамках объекта расчетов. Если кто-то случайно перепровел старый документ, система помечает всю цепочку после него как неактуальную. Фоновое задание начинает пересчитывать расчеты с 2018 года, блокируя актуальные документы 2019 года.

Рекомендация: Регулярно очищайте регистры заданий от «мусора» или завершайте расчеты в закрытых периодах. Обязательно установите Дату запрета редактирования — это предотвратит случайное перепроведение старых документов и запуск бесконечных цепочек пересчета.

Переход на новую архитектуру взаиморасчетов

Начиная с версии 2.4.6 (и более поздних, таких как 2.5), фирма «1С» предложила Новую архитектуру взаиморасчетов (онлайн-режим). Рассмотрим её преимущества в контексте блокировок:

Однако помните, что переход на новую архитектуру — это серьезный шаг, требующий пересчета данных и проверки всех доработок в части взаиморасчетов.

Итоги и выводы

Для устранения самоблокировок в 1С:ERP выполним следующие шаги:

  1. Выключим автоматический запуск фоновых заданий актуализации из настроек системы.
  2. Проверим программный код на предмет записи наборов записей внутри длинных циклов. Запись должна производиться максимально быстро в конце процедуры.
  3. Настроим регламентные задания на более частый запуск короткими порциями.
  4. Закроем прошлые периоды датой запрета редактирования, чтобы исключить пересчет «хвостов» прошлых лет.
  5. При технической возможности рассмотрим переход на онлайн-режим взаиморасчетов.

Соблюдение этих правил позволит минимизировать время ожидания на блокировках и сделает работу пользователей в 1С:ERP комфортной и стабильной.

← На главную