Skip to main content

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Материалы