При использовании механизма РАУЗ (Расширенная аналитика учета затрат) в конфигурации "Управление производственным предприятием" (УПП) многие пользователи сталкиваются с критической проблемой: во время проведения документа Расчет себестоимости выпуска (РСВ) работа всей компании практически останавливается. Любая попытка провести документ (реализацию, поступление или требование-накладную) заканчивается ошибкой блокировки или бесконечным ожиданием.
В этой статье мы разберем природу возникновения этих блокировок, выясним, почему архитектура РАУЗ так чувствительна к параллельной работе, и изучим штатные и технические способы минимизации простоев системы.
Проанализируем ситуацию: почему в классическом партионном учете блокировки ощущались меньше, а в РАУЗ они становятся фатальными? В партионном учете данные распределены по множеству регистров (партии товаров на складах, затраты, взаиморасчеты). В РАУЗ же используется концепция универсального хранилища — регистра накопления Учет затрат (и его аналогов для регламентированного учета).
Рассмотрим подробнее механизм конфликта:
Учет затрат.Расчет себестоимости выпуска при проведении в рамках одной транзакции пытается захватить исключительную блокировку на этот регистр целиком или на огромные диапазоны его данных.Это самый эффективный и простой способ, предусмотренный разработчиками 1С. Рассмотрим, как он работает. Вместо того чтобы выполнять весь расчет и запись результатов внутри одного огромного «транзакционного пузыря», система разделяет процесс на этапы.
Для запуска этого режима выполните следующие действия:
Расчет себестоимости выпуска.Выясним, что происходит «под капотом» системы в этот момент:
Учет затрат не одним махом, а небольшими пакетами (порциями).Важное примечание: Как отмечают опытные специалисты, блокировки полностью не исчезнут, но их длительность сократится на порядок. Вместо многочасового простоя вы получите кратковременные задержки в несколько секунд.
УПП — конфигурация с долгой историей, и многие её объекты по умолчанию работают в режиме автоматических блокировок на уровне СУБД. Это означает, что MS SQL Server сам решает, что блокировать: одну строку, страницу или всю таблицу сразу (Lock Escalation).
Проанализируем шаги по оптимизации на уровне кода и настроек:
Учет затрат при достижении порога в 5000 блокировок строк.Алгоритмы РАУЗ активно используют временные таблицы. Если вы используете MS SQL Server, огромная нагрузка ложится на системную базу TempDB. Иногда «зависание» системы при расчете себестоимости вызвано не логическими блокировками транзакций, а так называемыми «ожиданиями на защелках» (latch waits) из-за медленных дисков.
Разберем рекомендации по настройке сервера:
TempDB на самых быстрых доступных накопителях (NVMe/SSD).TempDB на несколько файлов данных (обычно по количеству ядер процессора, но не более 8), чтобы уменьшить конкуренцию за ресурсы внутри самой СУБД.В некоторых релизах и доработанных конфигурациях УПП в настройках параметров учета или непосредственно в коде обработки расчета себестоимости можно встретить параметр «Максимальное количество записей в транзакции».
Посмотрим на пример логики, которую можно внедрить для управления этим процессом:
// Пример логики порционной записи в коде (упрощенно)
НаборЗаписей = РегистрыНакопления.УчетЗатрат.СоздатьНаборЗаписей();
Для Каждого СтрокаРезультата Из ТаблицаРезультатов Цикл
// Заполняем набор...
Если НаборЗаписей.Количество() >= 1000 Тогда
НаборЗаписей.Записать(); // Короткая транзакция
НаборЗаписей.Очистить();
КонецЕсли;
КонецЦикла;
Если НаборЗаписей.Количество() > 0 Тогда
НаборЗаписей.Записать();
КонецЕсли;
Уменьшение этого числа (например, до 500 или 1000) делает паузы между записями более частыми, что дает пользователям больше шансов «проскочить» со своими документами.
РАУЗ позволяет выполнять расчеты отдельно для управленческого и регламентированного (бухгалтерского) учета. Разберем стратегию планирования:
Если в вашей 1С:УПП при расчете РАУЗ «все лежит», первым делом приучите ответственных сотрудников использовать кнопку «Провести вне транзакции». Это штатное решение 90% проблем с блокировками. Если же это не помогает, необходимо переходить к техническому аудиту: проверять режим блокировок в конфигураторе, оптимизировать работу TempDB на SQL-сервере и контролировать размер пакетов при записи в регистры затрат.