С выходом версии 1С:ERP 2.5.7 (а также соответствующих версий КА 2.5.7 и УТ 11.5.7) архитектура учета складских запасов претерпела фундаментальные изменения. Привычный многим разработчикам и аналитикам регистр накопления СвободныеОстатки был выведен из эксплуатации и помещен в категорию «Удалить». В этой статье мы подробно разберем, почему это произошло, какие объекты пришли ему на смену и как теперь решать классическую задачу получения свободных остатков на определенный момент времени.
Ранее расчет доступного остатка производился «на лету» или базировался на данных нескольких регистров накопления, что приводило к серьезным проблемам с производительностью при проведении документов. Основная причина отказа от старой схемы — высокая конкуренция за ресурсы БД и блокировки таблиц при массовой работе пользователей с заказами и отгрузками. Новая концепция призвана минимизировать время транзакции за счет использования оптимизированного распределения запасов.
Важно понимать, что исчез не только регистр СвободныеОстатки. Вместе с ним статус «Удалить» получили:
ГрафикПоступленияТоваровГрафикОтгрузкиТоваровОбеспечениеЗаказовВесь функционал этих объектов теперь сосредоточен в новой подсистеме распределения запасов.
Вместо набора старых регистров 1С ввела связку из регистра сведений и регистра накопления:
РаспределениеЗапасов: хранит актуальное, оперативное состояние запасов «на текущий момент». Он не является периодическим и представляет собой своего рода «срез последних», рассчитанный специальными алгоритмами. Данные в нем обновляются либо сразу при проведении документа, либо в фоновом режиме через регламентное задание Обновление распределения запасов.РаспределениеЗапасовДвижения: служит «регистратором» изменений для вышеуказанного регистра сведений. Именно в нем фиксируются приходы, расходы и изменения состояний резервов (например, переход из «К обеспечению» в «Резервировать по мере поступления»).Проанализируем ситуацию: поскольку РаспределениеЗапасов — это регистр сведений без истории, мы не можем просто обратиться к нему с параметром даты. Для получения исторического среза нам придется комбинировать данные из разных источников.
Разберем алгоритм получения свободного остатка на дату по шагам:
1. Физический остаток. Получаем данные из регистра накопления ТоварыНаСкладах на нужную дату. Это наша база — общее количество товара, физически находящегося на складе.
2. Резервы и распределение. Для получения данных о зарезервированном товаре необходимо обратиться к виртуальной таблице остатков регистра накопления РаспределениеЗапасовДвижения на ту же дату. Рассмотрим пример структуры запроса для получения этих данных:
ВЫБРАТЬ
Распределение.Номенклатура,
Распределение.Характеристика,
Распределение.Склад,
СУММА(ВЫБОР
КОГДА Распределение.Состояние В (ЗНАЧЕНИЕ(Перечисление.СостоянияРаспределенияЗапасов.РезервКДате),
ЗНАЧЕНИЕ(Перечисление.СостоянияРаспределенияЗапасов.РезервУжеЕсть))
ТОГДА Распределение.КоличествоОстаток
ИНАЧЕ 0
КОНЕЦ) КАК Зарезервировано
ИЗ
РегистрНакопления.РаспределениеЗапасовДвижения.Остатки(&Период, ) КАК Распределение
СГРУППИРОВАТЬ ПО
Распределение.Номенклатура,
Распределение.Характеристика,
Распределение.Склад
3. Итоговый расчет. Свободный остаток будет вычисляться как ФизическийОстаток - Зарезервировано. Однако стоит помнить, что в новой системе понятия «К обеспечению» и графики поступлений также влияют на доступность, поэтому расчет может усложняться в зависимости от настроек обеспечения в конкретной базе.
Рассмотрим важный технический момент: при переходе на новый релиз система заполняет новые регистры с нуля. Проанализируем, как это происходит: процедура обновления (обработчик обновления БСП) заново пересчитывает распределение, основываясь на первичных документах (заказах, накладных), а не на движениях старого регистра СвободныеОстатки.
Внимание! Если в вашей системе активно использовался документ Корректировка записей регистров для ручного исправления свободных остатков без изменения заказов, то после обновления эти данные будут потеряны, так как алгоритм обновления их проигнорирует. В новой модели «правка руками» регистра накопления РаспределениеЗапасовДвижения без соответствующих записей в РС РаспределениеЗапасов может привести к непредсказуемому поведению системы обеспечения.
Выясним причину, по которой отчеты «на дату» иногда показывают странные результаты. В новой схеме исторические данные по строкам заказов с действием «К обеспечению» могут не сохраняться в том виде, в котором мы привыкли их видеть в РН СвободныеОстатки. По факту, РаспределениеЗапасовДвижения хранит именно движения распределения, и для полноценного восстановления картины на прошлый период иногда требуется анализировать состояние самих документов-заказов в связке с движениями регистра.
Если вам необходимо реализовать собственный отчет по остаткам на дату, настоятельно рекомендуем изучить схему компоновки данных (СКД) типового отчета «Остатки и резервы товаров». В актуальных версиях ERP этот отчет использует сложные динамические запросы, объединяющие физические остатки и данные нового механизма распределения. Копирование логики из типового отчета — самый безопасный путь, гарантирующий соответствие ваших данных системным показателям.
Таким образом, переход на 2.5.7 требует от программиста пересмотра всех кастомных алгоритмов, которые полагались на старый регистр свободных остатков. Основной вектор работы теперь — это использование РН РаспределениеЗапасовДвижения для исторических данных и понимание того, что РС РаспределениеЗапасов является ведущим для оперативной работы системы.