Получить остатки заказов в УТ 11.5.22 и выше..
Такая простая задача не имеет простого решения. Если смотреть отчет ОстаткиИдоступность то там очень тяжелый запрос ("онлайн-офлайн" регистры), который дополняется текстом из модуля через процедуру РаспределениеЗапасов():
ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных.Основной.Запрос;
ИменаТаблиц = ОбеспечениеВДокументахСервер.НовыеИменаТаблицДляРаспределенияЗапасов();
ИменаТаблиц.Остатки = "ЗапасыИПотребностиОстатки"; // @query-part-1
ИменаТаблиц.ОстаткиКонтролируемыхПартий = "ЗапасыИПотребностиОстаткиКонтролируемыхПартий"; // @query-part-1
ИменаТаблиц.Результат = "ПодстановкаРасчетРезервов"; // @query-part-1
ОбеспечениеВДокументахСервер.РаспределениеЗапасов(ТекстЗапроса, ИменаТаблиц);
Пытался понять логику всего этого но, если честно, все это напоминает гавнокод.
ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных.Основной.Запрос;
ИменаТаблиц = ОбеспечениеВДокументахСервер.НовыеИменаТаблицДляРаспределенияЗапасов();
ИменаТаблиц.Остатки = "ЗапасыИПотребностиОстатки"; // @query-part-1
ИменаТаблиц.ОстаткиКонтролируемыхПартий = "ЗапасыИПотребностиОстаткиКонтролируемыхПартий"; // @query-part-1
ИменаТаблиц.Результат = "ПодстановкаРасчетРезервов"; // @query-part-1
ОбеспечениеВДокументахСервер.РаспределениеЗапасов(ТекстЗапроса, ИменаТаблиц);
Пытался понять логику всего этого но, если честно, все это напоминает гавнокод.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
2.
Avatarzorro
81
28.08.26 02:02
Сейчас в теме
так остатки заказов это 1 регистр. посмотри куда заказ клиента пишет. Оттуда и забирай остатки. реализация пишет туда же, только с расходом. По итогу у заказа остается 0 в остатках когда он полностью отгружен.
Если сомневаешься, то посмотри как заполняется реализация при создании на основании заказа. Она делает именно так как я и говорю
Если сомневаешься, то посмотри как заполняется реализация при создании на основании заказа. Она делает именно так как я и говорю
(3) Ну да, резервы можно получить из РегистрСведений.РаспределениеЗапасов так:
СУММА(ВЫБОР
КОГДА РаспределениеЗапасов.ХарактеристикаПотребности В (ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладе), ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления), ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладеИзЗаблокированных), ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных))
И РаспределениеЗапасов.СостояниеЗапаса В (ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии), ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка), ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииНеПодлежитРазблокировке), ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлению), ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой), ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюНеПодлежитРазблокировке))
ТОГДА РаспределениеЗапасов.Количество
ИНАЧЕ 0
КОНЕЦ) КАК ВРезерве
но у этого рег. сведений нет Периода, - даты, на какую срез (для решения этой проблемы я использовал РаспределениеЗапасов.заказнаотгрузку.дата<=&д2). И речь про то, чтобы получить именно то что осталось вне резервов - остатки "живых" (неотгруженных) заказов, которые не вошли в резервы. То, что можно посмотреть в СостоянииВыполнения в каждом конкретном заказе. Методом тыка я нашел эти остатки так (но, вероятно, это не точно):
....
среднее(ЗапасыИпотребностиОстатки.кобеспечениюОстаток +ЗапасыИпотребностиОстатки.РезервироватьнаскладеОстаток + ЗапасыИпотребностиОстатки.РезервироватьПоМереПоступленияОстаток) КАК ЗаказыПокупателей
ИЗ
РегистрСведений.РаспределениеЗапасов КАК РаспределениеЗапасов
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыИПотребности.Остатки(&д2
,
Склад ССЫЛКА Справочник.Склады
И Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)) КАК ЗапасыИпотребностиОстатки
ПО (РаспределениеЗапасов.Номенклатура = ЗапасыИпотребностиОстатки.Номенклатура)
СУММА(ВЫБОР
КОГДА РаспределениеЗапасов.ХарактеристикаПотребности В (ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладе), ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления), ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьНаСкладеИзЗаблокированных), ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных))
И РаспределениеЗапасов.СостояниеЗапаса В (ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии), ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка), ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииНеПодлежитРазблокировке), ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлению), ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой), ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюНеПодлежитРазблокировке))
ТОГДА РаспределениеЗапасов.Количество
ИНАЧЕ 0
КОНЕЦ) КАК ВРезерве
но у этого рег. сведений нет Периода, - даты, на какую срез (для решения этой проблемы я использовал РаспределениеЗапасов.заказнаотгрузку.дата<=&д2). И речь про то, чтобы получить именно то что осталось вне резервов - остатки "живых" (неотгруженных) заказов, которые не вошли в резервы. То, что можно посмотреть в СостоянииВыполнения в каждом конкретном заказе. Методом тыка я нашел эти остатки так (но, вероятно, это не точно):
....
среднее(ЗапасыИпотребностиОстатки.кобеспечениюОстаток +ЗапасыИпотребностиОстатки.РезервироватьнаскладеОстаток + ЗапасыИпотребностиОстатки.РезервироватьПоМереПоступленияОстаток) КАК ЗаказыПокупателей
ИЗ
РегистрСведений.РаспределениеЗапасов КАК РаспределениеЗапасов
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыИПотребности.Остатки(&д2
,
Склад ССЫЛКА Справочник.Склады
И Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)) КАК ЗапасыИпотребностиОстатки
ПО (РаспределениеЗапасов.Номенклатура = ЗапасыИпотребностиОстатки.Номенклатура)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот