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