Почему при расчете себестоимости (РАУЗ) в УПП блокируются все документы и как этого избежать?

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При использовании механизма РАУЗ (Расширенная аналитика учета затрат) в конфигурации "Управление производственным предприятием" (УПП) многие пользователи сталкиваются с критической проблемой: во время проведения документа Расчет себестоимости выпуска (РСВ) работа всей компании практически останавливается. Любая попытка провести документ (реализацию, поступление или требование-накладную) заканчивается ошибкой блокировки или бесконечным ожиданием.

В этой статье мы разберем природу возникновения этих блокировок, выясним, почему архитектура РАУЗ так чувствительна к параллельной работе, и изучим штатные и технические способы минимизации простоев системы.

Причина «всеобщей» блокировки: архитектурные особенности РАУЗ

Проанализируем ситуацию: почему в классическом партионном учете блокировки ощущались меньше, а в РАУЗ они становятся фатальными? В партионном учете данные распределены по множеству регистров (партии товаров на складах, затраты, взаиморасчеты). В РАУЗ же используется концепция универсального хранилища — регистра накопления Учет затрат (и его аналогов для регламентированного учета).

Рассмотрим подробнее механизм конфликта:

  1. Все ключевые документы системы (от «Требования-накладной» до «Реализации товаров и услуг») делают записи в один и тот же регистр — Учет затрат.
  2. Документ Расчет себестоимости выпуска при проведении в рамках одной транзакции пытается захватить исключительную блокировку на этот регистр целиком или на огромные диапазоны его данных.
  3. Пока транзакция РСВ не завершена (а расчет может длиться часами), СУБД блокирует любые попытки других документов записать данные в этот регистр. В итоге работа пользователей парализуется.

Решение №1: Использование режима «Провести вне транзакции»

Это самый эффективный и простой способ, предусмотренный разработчиками 1С. Рассмотрим, как он работает. Вместо того чтобы выполнять весь расчет и запись результатов внутри одного огромного «транзакционного пузыря», система разделяет процесс на этапы.

Для запуска этого режима выполните следующие действия:

  1. Откройте документ Расчет себестоимости выпуска.
  2. Перейдите в меню «Действия» в верхней командной панели документа.
  3. Выберите пункт «Провести вне транзакции».

Выясним, что происходит «под капотом» системы в этот момент:

Важное примечание: Как отмечают опытные специалисты, блокировки полностью не исчезнут, но их длительность сократится на порядок. Вместо многочасового простоя вы получите кратковременные задержки в несколько секунд.

Решение №2: Переход на управляемые блокировки

УПП — конфигурация с долгой историей, и многие её объекты по умолчанию работают в режиме автоматических блокировок на уровне СУБД. Это означает, что MS SQL Server сам решает, что блокировать: одну строку, страницу или всю таблицу сразу (Lock Escalation).

Проанализируем шаги по оптимизации на уровне кода и настроек:

Решение №3: Оптимизация дисковой подсистемы для TempDB

Алгоритмы РАУЗ активно используют временные таблицы. Если вы используете MS SQL Server, огромная нагрузка ложится на системную базу TempDB. Иногда «зависание» системы при расчете себестоимости вызвано не логическими блокировками транзакций, а так называемыми «ожиданиями на защелках» (latch waits) из-за медленных дисков.

Разберем рекомендации по настройке сервера:

  1. Разместите файлы TempDB на самых быстрых доступных накопителях (NVMe/SSD).
  2. Разделите TempDB на несколько файлов данных (обычно по количеству ядер процессора, но не более 8), чтобы уменьшить конкуренцию за ресурсы внутри самой СУБД.

Решение №4: Настройка параметров записи результатов

В некоторых релизах и доработанных конфигурациях УПП в настройках параметров учета или непосредственно в коде обработки расчета себестоимости можно встретить параметр «Максимальное количество записей в транзакции».

Посмотрим на пример логики, которую можно внедрить для управления этим процессом:


// Пример логики порционной записи в коде (упрощенно)
НаборЗаписей = РегистрыНакопления.УчетЗатрат.СоздатьНаборЗаписей();
Для Каждого СтрокаРезультата Из ТаблицаРезультатов Цикл
    // Заполняем набор...
    Если НаборЗаписей.Количество() >= 1000 Тогда
        НаборЗаписей.Записать(); // Короткая транзакция
        НаборЗаписей.Очистить();
    КонецЕсли;
КонецЦикла;
Если НаборЗаписей.Количество() > 0 Тогда
    НаборЗаписей.Записать();
КонецЕсли;

Уменьшение этого числа (например, до 500 или 1000) делает паузы между записями более частыми, что дает пользователям больше шансов «проскочить» со своими документами.

Решение №5: Разделение видов учета и времени запуска

РАУЗ позволяет выполнять расчеты отдельно для управленческого и регламентированного (бухгалтерского) учета. Разберем стратегию планирования:

Резюме

Если в вашей 1С:УПП при расчете РАУЗ «все лежит», первым делом приучите ответственных сотрудников использовать кнопку «Провести вне транзакции». Это штатное решение 90% проблем с блокировками. Если же это не помогает, необходимо переходить к техническому аудиту: проверять режим блокировок в конфигураторе, оптимизировать работу TempDB на SQL-сервере и контролировать размер пакетов при записи в регистры затрат.

← На главную