Skip to main content

Контроль остатков

Две методики контроля отрицательных остатков при проведении документа: Старая (проверка до записи) и Новая (проверка после записи с откатом). Выбор зависит от архитектуры и требований к параллельности.

Сравнение методик​

КритерийСтарая методика (До записи)Новая методика (После записи)
Принцип1. Заблокировать данные 2. Запросить доступные остатки 3. Если хватает — записать движения1. Сразу записать движения 2. Проверить отрицательные остатки 3. Если есть — откатить транзакцию
БлокировкиНужно явно блокировать строки перед запросом (Новый БлокировкаДанных)Достаточно БлокироватьДляИзменения
Запрос остатковСложный: соединение таблиц документа и регистраПростой: отбор по отрицательным значениям в одной таблице
ПроизводительностьМедленнее (запрос на получение остатков + предварительная блокировка)Быстрее (Нет необходимости очищать старые движения документа, сокращение времени блокировки и отсутствие соединения таблиц в запросе на получение остатков)
Когда использоватьКогда нужны данные из регистра для расчета (например, себестоимость)Когда все данные есть в документе (количество, номенклатура)

Ключевые механизмы​

Режим разделения итогов​

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

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

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

Когда отключать: Например, для регистров, которые заполняются только регламентными заданиями (нет конкурентного доступа).

Свойство БлокироватьДляИзменения​

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

Имеет смысл использовать:

  • Есть контроль остатков
  • Включен разделитель итогов
  • Включен режим управляемых блокировок на уровне конфигурации

В новой методике:

НаборЗаписей.БлокироватьДляИзменения = Истина; // Выключает разделение итогов

В старой методике: Нужно блокировать данные до запроса остатков через отдельный механизм Новый БлокировкаДанных.

Ответы на ключевые вопросы​

1. Когда нельзя использовать новую методику?​

Когда для проведения нужны данные из самого регистра остатков (например, расчет суммы списания по средней себестоимости). Придется делать запрос до записи движений.

2. Как обеспечить параллельную работу?​

Через разделение итогов (включено по умолчанию). Каждая транзакция пишет в свой "слой", итоги суммируются при чтении.

3. Что делает БлокироватьДляИзменения?​

  • Выключает режим разделения итогов.

Материалы​