При разработке конфигураций на платформе 1С:Предприятие 8 перед разработчиком неизбежно встает вопрос выбора методики проведения документов и контроля остатков. Традиционно выделяют две основные схемы: классическую (старую) методику и новую методику (введенную начиная с версии 8.2). Обе схемы ориентированы на работу в режиме управляемых блокировок, однако их философия кардинально отличается.
Часто у разработчиков возникает соблазн модернизировать новую методику, попытавшись встроить в нее динамический расчет себестоимости (например, по FIFO или средней стоимости) прямо в момент проведения. Давайте подробно проанализируем, почему такой гибридный подход не только не дает выигрыша в производительности, но и наносит серьезный ущерб параллельной работе пользователей.
---
Для начала вспомним, как функционируют обе методики в их стандартном (рекомендованном фирмой «1С») исполнении.
Алгоритм классического проведения выглядит следующим образом:
БлокировкаДанных) на аналитику списываемых товаров (номенклатура, склад). Это предотвращает изменение остатков другими транзакциями.Этот подход также называют «механизмом оперативного контроля». Его суть заключается в отказе от явного наложения управляемых блокировок разработчиком перед чтением:
Записывать = Истина (или через вызов метода Записать() набора записей). В этот момент СУБД автоматически накладывает исключительные блокировки на записываемые строки.---
Автор обсуждения предлагает объединить эти схемы, чтобы рассчитывать себестоимость в рамках новой методики. Предполагаемый алгоритм выглядит так:
На первый взгляд кажется, что мы получаем выигрыш: в случае нехватки товара транзакция прерывается мгновенно, минуя сложный расчет стоимости. Однако детальный технический анализ показывает несостоятельность этой гипотезы.
---
Запись данных в СУБД — это одна из самых ресурсоемких физических операций. Она включает в себя запись в транзакционный лог (LDF-файл в MS SQL Server), модификацию страниц данных в оперативной памяти и последующий сброс на диск.
При использовании предложенного гибридного метода система вынуждена выполнять запись набора движений дважды за одну транзакцию:
Двойная запись сводит на нет любые микросекундные выигрыши от быстрого контроля остатков. База данных начнет испытывать колоссальную нагрузку на дисковую подсистему ввода-вывода (I/O Bottleneck), что замедлит проведение документов для всех пользователей системы.
---
Главная цель новой методики проведения — повысить параллельность работы пользователей за счет сокращения времени блокировок таблиц. Мы блокируем только то, что пишем сами.
Однако расчет себестоимости (особенно по методу FIFO) принципиально зависит от состояния сторонних данных в информационной базе (остатков партий, которые были оприходованы другими документами). Чтобы корректно рассчитать сумму списания, мы должны гарантировать, что в момент расчета никакая другая транзакция не изменит эти партии.
Если мы попытаемся прочитать стоимостные остатки после записи количества, нам все равно придется наложить на них управляемую блокировку (разделяемую Shared или исключительную Exclusive). В итоге мы возвращаемся к необходимости блокировать диапазоны данных в таблицах СУБД, полностью нивелируя преимущество новой методики.
---
Сторонники гибридного метода утверждают, что при нехватке товара транзакция завершится быстрее, так как не будет тратиться время на расчет сумм. Но давайте сравним поведение классического метода и гибридного при нехватке остатков:
Таким образом, при нехватке товара классический метод отрабатывает значительно быстрее и чище, не нагружая СУБД операциями записи и последующего отката.
---
Как же обойти это ограничение, если бизнесу требуется и высокая параллельность (новая методика), и точный расчет себестоимости? Разработчики типовых конфигураций фирмы «1С» (таких как 1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей) решили эту проблему путем разделения контуров проведения на два этапа:
РеализацияТоваровУслуг) система контролирует исключительно количественные остатки на складах. Документ проводится мгновенно по принципам новой методики контроля остатков. Движения по стоимостным регистрам формируются «пустыми» (без сумм) или по предварительной оценке. Это обеспечивает максимальную скорость и параллельность работы пользователей.
РасчетСебестоимостиТоваров) при закрытии отчетного периода. В этот момент конкуренция пользователей за таблицы минимальна, что позволяет системе спокойно выполнить сложные расчеты без блокировки оперативной работы склада.
---
Рассмотрим правила выбора методики проведения при проектировании собственных регистров и документов:
Используйте классическую методику, если:
Используйте новую методику, если: