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