Общий подход к решению проблемы: при недостатке товара (для проведения документов перемещения и заявок покупателя) создать документ оприходования с временем на 1 секунду ранее того документа, который не проводится. Если таких товаров в документе несколько, они помещаются в один документ оприходования. Все оприходованные товары, необходимые для проведения документов, собираются вместе в документе списания, помещаемого в конец последнего дня, по которому проходило восстановление последовательности. Документ списания остается не проведенным, после окончания работы обработки его нужно провести. Для исключения возможных ошибок его проведения создается документ снятия резервов товара, если в свободном остатке нет нужного количества товара для списания. В анализ не включаются ситуации, когда не проводится документ реализации, поскольку при недостатке товара, уже отгруженного покупателю, могут возникнуть проблемы при его списании. Однако включить документ реализации в анализ несложно, добавив проверку на вид документа в строке 653:
ИначеЕсли (Вид = "ЗаявкаПокупателя") или
(Вид = "ПеремещениеТМЦ") или
(Вид = "Реализация") Тогда
Дополнительно проверяется:
- Сторнирование проблемного документа. Если он сторнирован, то для этого документа и документа «Сторно» отменяется проведение.
- Снятие товара с резерва. При восстановлении последовательно нередко возникает ситуация перераспределения резервов между покупателями, поэтому указанное количество товара для снятия с резерва может превышать количество зарезервированного товара на данный момент. Документ снятия с резерва исправляется путем уменьшения снимаемого с резерва количества до нужного уровня. Если оставшееся количество – нуль, строка удаляется. Если не остается строк, – документ не проводится.
Процесс восстановления отражается в таблице, в каждой строке указывается документ, который был проведен после исправления ситуации. Протокол восстановления можно получить кнопкой «Печать». Обработка работает в монопольном и не монопольном режиме.
Необходимы небольшие добавления в главном модуле. Объявляем глобальную переменную, в которую будут попадать данные об ошибках:
Перем глСообщениеОбОшибке Экспорт; //текст последней ошибки
В процедуру глНеПроводить(Конт,Сообщение) Экспорт добавляем строку
глСообщениеОбОшибке = Сообщение;
В тексте главного модуля при использовании процедуры глНеПроводить в текст сообщения добавляем код номенклатуры (по нему будет определяться номенклатура), например, так:
глНеПроводить(Конт,"На складе нет нужного свободного количества ТМЦ "+СокрЛП(ТекНоменклатура.Код)+" "+ТекНоменклатура.Наименование
+". "+РазделительСтрок+" Всего осталось "+Строка(ОстатокНаСкладе)+" "+ТекНоменклатура.БазоваяЕдиница
+?(РезервНаСкладе <> 0 ,". "+РазделительСтрок+" Зарезервировано по выписанным Заявкам "+Строка(РезервНаСкладе) +" "+ТекНоменклатура.БазоваяЕдиница,"")
+"."+РазделительСтрок+"Требуемое количество "+Строка(ТаблНоменклатуры.Количество)+" "+ТекНоменклатура.БазоваяЕдиница);