В отличие от типового механизма заполнения документа "Корректировка назначения" учитывается количество товара на всех складах. То есть если товар заказали со склада 1, а назначение закрепили на складе 2, тогда товар останется зарезервированным, и его можно будет переместить под обеспечение заказа.
Проверено на релизе Управление торговлей, редакция 11 (11.5.9.131).
Платформа: 8.3.22.1672.
Обработку можно использовать как внешний файл или подключить через систему доп. обработок как регламентное задание.
При работе в режиме регламентного задания, при наличии ошибок выполнения пользователю, от имени которого выполняется задание, будет создано напоминание с информацией об ошибке.
На релизе УТ НИЖЕ 11.5.9 работать НЕ БУДЕТ.
Запрос по излишкам товара:
"ВЫБРАТЬ
| Остатки.Назначение КАК Назначение,
| Остатки.Номенклатура КАК Номенклатура,
| СУММА(Остатки.ВНаличииОстаток) - СУММА(Остатки.КОбеспечениюОстаток) - СУММА(Остатки.РезервироватьНаСкладеОстаток) КАК Освободить
|ПОМЕСТИТЬ НазначенияКОтмене
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(
| ,
| Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И Склад ССЫЛКА Справочник.Склады) КАК Остатки
|
|СГРУППИРОВАТЬ ПО
| Остатки.Назначение,
| Остатки.Номенклатура
|
|ИМЕЮЩИЕ
| СУММА(Остатки.ВНаличииОстаток) - СУММА(Остатки.КОбеспечениюОстаток) - СУММА(Остатки.РезервироватьНаСкладеОстаток) > 0
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Остатки.Назначение КАК Назначение,
| Остатки.Номенклатура КАК Номенклатура,
| СУММА(Остатки.КОбеспечениюОстаток) + СУММА(Остатки.РезервироватьНаСкладеОстаток) КАК Заказано,
| СУММА(Остатки.ВНаличииОстаток) - СУММА(Остатки.КОбеспечениюОстаток) - СУММА(Остатки.РезервироватьНаСкладеОстаток) КАК Склад,
| НазначенияКОтмене.Освободить КАК Освободить
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(
| ,
| Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И Склад ССЫЛКА Справочник.Склады) КАК Остатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ НазначенияКОтмене КАК НазначенияКОтмене
| ПО Остатки.Номенклатура = НазначенияКОтмене.Номенклатура
| И Остатки.Назначение = НазначенияКОтмене.Назначение
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
| ПО (ЗаказКлиентаТовары.Ссылка.Назначение = Остатки.Назначение)
| И (ЗаказКлиентаТовары.Обособленно)
| И (ЗаказКлиентаТовары.Номенклатура = Остатки.Номенклатура)
|
|СГРУППИРОВАТЬ ПО
| Остатки.Номенклатура,
| Остатки.Назначение,
| НазначенияКОтмене.Освободить
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| НазначенияКОтмене.Назначение.Заказ.Организация КАК Организация,
| Остатки.Назначение КАК Назначение,
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Склад КАК Склад,
| СУММА(Остатки.КОбеспечениюОстаток) + СУММА(Остатки.РезервироватьНаСкладеОстаток) КАК Заказано,
| СУММА(Остатки.ВНаличииОстаток) - СУММА(Остатки.КОбеспечениюОстаток) - СУММА(Остатки.РезервироватьНаСкладеОстаток) КАК Разница,
| ВЫБОР
| КОГДА Остатки.Склад = ЗаказКлиентаТовары.Склад
| ТОГДА 1
| КОГДА Остатки.Склад = ЗаказКлиентаТовары.Ссылка.Склад
| ТОГДА 2
| ИНАЧЕ 3
| КОНЕЦ КАК ПорядокСКлада,
| НазначенияКОтмене.Освободить КАК Освободить
|ИЗ
| РегистрНакопления.ЗапасыИПотребности.Остатки(
| ,
| Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| И Склад ССЫЛКА Справочник.Склады) КАК Остатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ НазначенияКОтмене КАК НазначенияКОтмене
| ПО Остатки.Номенклатура = НазначенияКОтмене.Номенклатура
| И Остатки.Назначение = НазначенияКОтмене.Назначение
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
| ПО (ЗаказКлиентаТовары.Ссылка.Назначение = Остатки.Назначение)
| И (ЗаказКлиентаТовары.Обособленно)
| И (ЗаказКлиентаТовары.Номенклатура = Остатки.Номенклатура)
|
|СГРУППИРОВАТЬ ПО
| Остатки.Номенклатура,
| Остатки.Назначение,
| Остатки.Склад,
| ЗаказКлиентаТовары.Склад,
| ВЫБОР
| КОГДА Остатки.Склад = ЗаказКлиентаТовары.Склад
| ТОГДА 1
| КОГДА Остатки.Склад = ЗаказКлиентаТовары.Ссылка.Склад
| ТОГДА 2
| ИНАЧЕ 3
| КОНЕЦ,
| НазначенияКОтмене.Назначение.Заказ.Организация,
| НазначенияКОтмене.Освободить
|
|УПОРЯДОЧИТЬ ПО
| ПорядокСКлада
|ИТОГИ
| СУММА(Разница),
| СУММА(Освободить)
|ПО
| Организация,
| Назначение,
| Номенклатура"
Второй запрос в пакете - для отображения информации на форме обработки в пользовательском режиме.
Процедура снятия лишних резервов:
Процедура СнятьЛишниеНазначения(РезультатЗапроса) Экспорт
ВыборкаОрганизации = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Организация");
Пока ВыборкаОрганизации.Следующий() Цикл
ВыборкаНазначения = ВыборкаОрганизации.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Назначение");
ДокКорНаз = Документы.КорректировкаНазначенияТоваров.СоздатьДокумент();
ДокКорНаз.Дата = ТекущаяДата();
ДокКорНаз.Комментарий = "Автоматическая отмена избыточных резервов";
ДокКорНаз.Организация = ВыборкаОрганизации.Организация;
ДокКорНаз.ВидОперации = Перечисления.ВидыОперацийКорректировкиНазначения.СнятьРезервПоМногимНазначениям;
ДокКорНаз.Автор = ПараметрыСеанса.АвторизованныйПользователь;
ДокКорНаз.Ответственный = ПараметрыСеанса.АвторизованныйПользователь;
Пока ВыборкаНазначения.Следующий() Цикл //снять сверх свободного остатка
ВыборкаНом = ВыборкаНазначения.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Номенклатура");
Пока ВыборкаНом.Следующий() Цикл
ВсегоПоТовару = ВыборкаНом.Освободить;
Выборка = ВыборкаНом.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Разница > 0 Тогда
СтрДок = ДокКорНаз.Товары.Добавить();
Освободить = Мин(Выборка.Освободить,Выборка.Разница);
СтрДок.Количество = Освободить;
СтрДок.КоличествоУпаковок = Освободить;
СтрДок.Номенклатура = Выборка.Номенклатура;
СтрДок.Склад = Выборка.Склад;
СтрДок.ИсходноеНазначение = Выборка.Назначение;
СтрДок.ИсходныйЗаказ = Выборка.Назначение.Заказ;
ВсегоПоТовару = ВсегоПоТовару - Освободить;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Ошибки = "";
Ошибка = Не ДокКорНаз.ПроверитьЗаполнение();
Если Не Ошибка Тогда
Попытка
ДокКорНаз.Записать(РежимЗаписиДокумента.Проведение);
Ошибки = "Проведен документ "+ДокКорНаз;
Исключение
//ДокКорНаз.Записать(РежимЗаписиДокумента.Запись);
Ошибки = ПолучитьСообщенияПользователю(Истина);
Ошибка = Истина;
КонецПопытки;
Иначе
Ошибки = ПолучитьСообщенияПользователю(Истина);
КонецЕсли;
Если ТипЗнч(Ошибки) = Тип("ФиксированныйМассив") Тогда
Для Каждого Сообщение Из Ошибки Цикл
ОповеститьОРезультате(Сообщение.Текст, Ошибка);
КонецЦикла;
Иначе
ОповеститьОРезультате(Ошибки, Ошибка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры