Почему нельзя рассчитывать себестоимость «на лету» при использовании новой методики проведения с управляемыми блокировками?

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

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

Часто у разработчиков возникает соблазн модернизировать новую методику, попытавшись встроить в нее динамический расчет себестоимости (например, по FIFO или средней стоимости) прямо в момент проведения. Давайте подробно проанализируем, почему такой гибридный подход не только не дает выигрыша в производительности, но и наносит серьезный ущерб параллельной работе пользователей.

---

Два подхода к проведению документов: краткий ликбез

Для начала вспомним, как функционируют обе методики в их стандартном (рекомендованном фирмой «1С») исполнении.

Методика I. Классическая (с предварительной блокировкой)

Алгоритм классического проведения выглядит следующим образом:

  1. Открывается транзакция проведения.
  2. Устанавливается явная управляемая блокировка (объект БлокировкаДанных) на аналитику списываемых товаров (номенклатура, склад). Это предотвращает изменение остатков другими транзакциями.
  3. Выполняется запрос к виртуальной таблице остатков регистра.
  4. В кодовой логике сопоставляются требуемые количества с фактическими остатками. Если остатков хватает, рассчитывается себестоимость списания (например, списываются конкретные партии по FIFO).
  5. Результаты расчета (движения с заполненным количеством и суммой) записываются в базу данных.
  6. Транзакция фиксируется, блокировки снимаются.

Методика II. Новая методика (с предварительной записью)

Этот подход также называют «механизмом оперативного контроля». Его суть заключается в отказе от явного наложения управляемых блокировок разработчиком перед чтением:

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

---

Суть проблемы: гибридный метод и почему он не работает

Автор обсуждения предлагает объединить эти схемы, чтобы рассчитывать себестоимость в рамках новой методики. Предполагаемый алгоритм выглядит так:

  1. Записываем движения (только количество) для автоматической установки блокировок СУБД.
  2. Выполняем запрос контроля отрицательных остатков. Если обнаружена нехватка — сразу откатываем транзакцию.
  3. Если товара хватает, делаем еще один запрос для расчета себестоимости (получаем партии/суммы).
  4. Заполняем суммы в движениях и записываем набор повторно.
  5. Фиксируем транзакцию.

На первый взгляд кажется, что мы получаем выигрыш: в случае нехватки товара транзакция прерывается мгновенно, минуя сложный расчет стоимости. Однако детальный технический анализ показывает несостоятельность этой гипотезы.

---

Причина №1. Проблема двойной записи (избыточный I/O)

Запись данных в СУБД — это одна из самых ресурсоемких физических операций. Она включает в себя запись в транзакционный лог (LDF-файл в MS SQL Server), модификацию страниц данных в оперативной памяти и последующий сброс на диск.

При использовании предложенного гибридного метода система вынуждена выполнять запись набора движений дважды за одну транзакцию:

Двойная запись сводит на нет любые микросекундные выигрыши от быстрого контроля остатков. База данных начнет испытывать колоссальную нагрузку на дисковую подсистему ввода-вывода (I/O Bottleneck), что замедлит проведение документов для всех пользователей системы.

---

Причина №2. Блокировки стоимостного контура все равно потребуются

Главная цель новой методики проведения — повысить параллельность работы пользователей за счет сокращения времени блокировок таблиц. Мы блокируем только то, что пишем сами.

Однако расчет себестоимости (особенно по методу FIFO) принципиально зависит от состояния сторонних данных в информационной базе (остатков партий, которые были оприходованы другими документами). Чтобы корректно рассчитать сумму списания, мы должны гарантировать, что в момент расчета никакая другая транзакция не изменит эти партии.

Если мы попытаемся прочитать стоимостные остатки после записи количества, нам все равно придется наложить на них управляемую блокировку (разделяемую Shared или исключительную Exclusive). В итоге мы возвращаемся к необходимости блокировать диапазоны данных в таблицах СУБД, полностью нивелируя преимущество новой методики.

---

Причина №3. Поведение системы при нехватке остатков (пессимистичный сценарий)

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

Таким образом, при нехватке товара классический метод отрабатывает значительно быстрее и чище, не нагружая СУБД операциями записи и последующего отката.

---

Архитектурное решение в современных ERP-системах

Как же обойти это ограничение, если бизнесу требуется и высокая параллельность (новая методика), и точный расчет себестоимости? Разработчики типовых конфигураций фирмы «1С» (таких как 1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей) решили эту проблему путем разделения контуров проведения на два этапа:

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

---

Резюме и рекомендации

Рассмотрим правила выбора методики проведения при проектировании собственных регистров и документов:

Используйте классическую методику, если:

Используйте новую методику, если:

← На главную