Контроль остатков
страницаКонтроль остатков
Общая методика контроля остатков при проведении документа заключается в следующем: сначала, не глядя ни на что, нужно записать движения документа, а затем, когда движения уже записаны, прочитать из базы данных остатки.
Если появились отрицательные остатки, значит, такой документ проводить нельзя. Нужно сообщить пользователю, каких материалов не хватает, и отменить проведение документа.
Если же отрицательных остатков не появилось, тогда можно смело проводить документ.
Полдела у вас уже сделано: вы формируете движения документа и записываете их. Единственное, что вам осталось, – в случае оперативного проведения проконтролировать, что получилось, и, если появились отрицательные остатки, отменить проведение документа.
Итак, сделайте заготовку. После цикла обхода результата запроса и перед концом процедуры напишите следующие строки (листинг 15.19).
**Листинг 15.**19. Фрагмент процедуры «ОбработкаПроведения()»
…
КонецЦикла;
Движения.Записать();
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
// Проверить отрицательные остатки.
КонецЕсли;
КонецПроцедуры
Сначала вы записываете движения в регистры.
Затем определяете режим проведения документа. При выполнении процедуры ОбработкаПроведения() вторым параметром (Режим) в нее передается режим проведения документа, и значение этой переменной сравнивается со значением системного перечисления РежимПроведенияДокумента. В случае оперативного проведения вы будете выполнять контроль остатков.
Теперь сделайте заготовку запроса для проверки отрицательных остатков.
Так как вам придется снова получать остатки только для той номенклатуры, которая в документе, укажите, что этот запрос будет использовать тот же самый менеджер временных таблиц МенеджерВТ (листинг 15.20).
**Листинг 15.**20. Фрагмент процедуры «ОбработкаПроведения()»
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
// Проверить отрицательные остатки.
Запрос3 = Новый Запрос;
Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос3.Текст = "";
КонецЕсли;
Установите курсор внутрь кавычек и откройте конструктор запроса. Подтвердите создание нового запроса.
Выберите таблицу ОстаткиМатериалов.Остаткии из нее два поля: Материал и КоличествоОстаток.
Задайте параметр Условие для этой таблицы (листинг 15.21).
**Листинг 15.**21. Условие виртуальной таблицы
Материал В (
ВЫБРАТЬ
НоменклатураДокумента.Номенклатура
ИЗ
НоменклатураДокумента)
И Склад = &Склад
То есть вы получаете итоги только для той номенклатуры, которая содержится в вашей временной таблице, и только по складу, который указан в документе.
Затем на закладке Условия перенесите в список условий поле КоличествоОстаток и укажите, что вас интересуют только отрицательные остатки (листинг 15.22).
**Листинг 15.**22. Условие запроса
ОстаткиМатериаловОстатки.КоличествоОстаток < 0
Нажмите ОК. Текст запроса будет выглядеть следующим образом (листинг 15.23).
**Листинг 15.**23. Текст запроса
// Проверить отрицательные остатки.
Запрос3 = Новый Запрос;
Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос3.Текст = "
|ВЫБРАТЬ
| ОстаткиМатериаловОстатки.Материал,
| ОстаткиМатериаловОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиМатериалов.Остатки( , Материал В (
| ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)
| И Склад = &Склад) КАК ОстаткиМатериаловОстатки
|ГДЕ
| ОстаткиМатериаловОстатки.КоличествоОстаток < 0";
Теперь осталось только установить параметр запроса, обойти результат запроса и вывести сообщения об отрицательных остатках (листинг 15.24).
**Листинг 15.**24. Фрагмент процедуры «ОбработкаПроведения()»
// Проверить отрицательные остатки
Запрос3 = Новый Запрос;
Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос3.Текст = "
|ВЫБРАТЬ
| ОстаткиМатериаловОстатки.Материал,
…
|ГДЕ
| ОстаткиМатериаловОстатки.КоличествоОстаток < 0";
Запрос3.УстановитьПараметр("Склад", Склад);
РезультатЗапроса = Запрос3.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток) + " единиц материала """ + ВыборкаДетальныеЗаписи.Материал + """";
Сообщение.Сообщить();
Отказ = Истина;
КонецЦикла;
При выполнении проверки в запрос в параметре Склад передается склад, указанный в документе.
Затем выполняется запрос для получения отрицательных остатков номенклатуры, содержащейся во временной таблице и на складе, указанном в параметре Склад.
После этого выборка записей запроса обходится в цикле, и, если есть такие записи, они выводятся в сообщениях пользователю.
При этом параметру Отказ процедуры проведения документа присваивается значение Истина, то есть документ не проводится, начатая транзакция отменяется и состояние данных, измененных в процессе проведения, возвращается в исходное, до начала проведения документа.