Как получить свободные остатки и историю резервов на прошлую дату в 1С:УТ 11.5

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

С выходом версии 1С:Управление торговлей 11.5 (а также ERP 2.5 и КА 2.5) многие разработчики и аналитики столкнулись с серьезной проблемой: привычные механизмы получения свободных остатков перестали работать. Если раньше в системе существовал явный регистр накопления СвободныеОстатки, то в новой архитектуре данные о резервах стали "эфемерными". Разберем подробно, почему так происходит, как теперь устроена система и какие есть пути решения задачи получения остатков на прошлую дату.

Почему старые методы больше не работают?

В новых версиях конфигураций 1С пересмотрела логику обеспечения заказов. Основным "двигателем" распределения запасов стал регистр сведений Распределение запасов. Проанализируем ключевое отличие: регистр накопления хранит историю (приходы и расходы), а регистр сведений хранит текущее состояние (срез). Как только заказ клиента отгружается или закрывается, запись о его резерве в регистре РаспределениеЗапасов просто удаляется или обновляется. Таким образом, система «забывает», что под этот заказ неделю назад был зарезервирован товар.

Рассмотрим ситуацию, которая часто вводит в заблуждение: использование регистра накопления ЗапасыИПотребности. Многие пытаются извлечь данные оттуда, но сталкиваются с тем, что ресурс ВНаличии в этом регистре ведет себя специфично. При установке в заказе статуса "К отгрузке", система делает движение расход по этому ресурсу датой самого заказа (или датой отгрузки). Если товар фактически поступит на склад позже даты заказа, мы увидим отрицательное наличие в промежутке времени. Это не ошибка программы, а логика контроля дефицита, которая, к сожалению, мало помогает в определении реального свободного остатка на дату в прошлом.

Влияние производительного режима резервирования

Выясним, изменится ли что-то при включении «Производительного режима формирования резервов». Данная опция (Настройки — Склад и доставка) переносит расчет распределения из транзакции проведения документа в фоновое задание. С точки зрения хранения данных:

  1. Система начинает более активно использовать регистры накопления ЗапасыИПотребности и ГрафикПоступленияТоваров.
  2. Появляется возможность более быстрого проведения документов, так как распределение считается отдельно.
  3. Однако, даже в этом режиме основная цель системы — обеспечить текущие и будущие отгрузки. Историчность резервов (сколько было свободно вчера) по-прежнему не является приоритетной задачей для типовых регистров.

Как рассчитать свободный остаток на дату (алгоритм)

Посмотрим на пример логики, которую можно применить для восстановления картины прошлого. Если нам крайне необходимо узнать свободный остаток на дату Т, нам придется выполнить сложный расчет, комбинируя данные из разных источников:

Свободный остаток на дату Т = (Остаток по регистру ТоварыНаСкладах) - (Резервы на дату Т).

Разберем по шагам, где взять вторую часть уравнения:

  1. Необходимо проанализировать регистр ТоварыКОтгрузке или ЗапасыИПотребности.
  2. Нужно отобрать движения документов (Заказов), которые на дату Т уже существовали и имели статус, предполагающий резервирование (например, "В резерве" или "К отгрузке"), но при этом еще не были фактически отгружены (т.е. по ним не было движений регистра ТоварыНаСкладах на дату Т).
  3. Проблема этого метода в том, что если состав заказа изменился сегодня, мы не узнаем, каким он был неделю назад, без включенного Версионирования объектов.

Варианты технической реализации решения

Если заказчик требует отчетность по эффективности менеджеров в динамике («почему товар лежал, а заказ не был отгружен»), рассмотрим два варианта доработки системы:

Вариант 1: Ежедневные «снимки» остатков

Это самый простой и стабильный метод для аналитики. Мы создаем новый регистр сведений (например, ИсторияСвободныхОстатков) и настраиваем регламентное задание, которое каждую ночь (в 23:59) копирует текущие данные из типового регистра РаспределениеЗапасов.


Процедура ЗафиксироватьОстаткиНаКонецДня()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   РаспределениеЗапасов.Номенклатура,
        |   РаспределениеЗапасов.Склад,
        |   РаспределениеЗапасов.ВНаличии - РаспределениеЗапасов.Зарезервировано КАК Свободно
        |ИЗ
        |   РегистрСведений.РаспределениеЗапасов КАК РаспределениеЗапасов";
    
    Результат = Запрос.Выполнить().Выгрузить();
    // Далее записываем результат в свой исторический регистр с текущей датой
КонецПроцедуры

Вариант 2: Использование механизма серий

Проанализируем совет из обсуждения на форуме: посмотреть на логику работы с сериями. При включенном учете по сериям система вынуждена более детально фиксировать остатки. В типовом коде получения остатков по сериям используется запрос к временным таблицам, которые объединяют ТоварыНаСкладах и ТоварыКОтгрузке. Вы можете использовать этот же подход в своем отчете, исключив разрез серий, если они не используются.

Резюме для разработчика

Подведем итог: в типовой УТ 11.5 отчет ОстаткиИДоступность с установленным периодом в прошлом работает некорректно для анализа резервов, так как он предназначен для планирования будущих отгрузок (параметр «Период» там — это граница видимости будущих поступлений). Для получения достоверных исторических данных о свободных остатках:

Для полноценного контроля менеджеров и их "прегрешений" в прошлом, рекомендуется все же идти по пути фиксации данных в отдельной таблице, так как архитектура 11.5 ориентирована на максимальную производительность в настоящем моменте, а не на хранение истории распределения.

← На главную