584 документа
← К списку

Контроль остатков

страница

Контроль остатков

Общая методика контроля остатков при проведении документа заключается в следующем: сначала, не глядя ни на что, нужно записать движения документа, а затем, когда движения уже записаны, прочитать из базы данных остатки.

Если появились отрицательные остатки, значит, такой документ проводить нельзя. Нужно сообщить пользователю, каких материалов не хватает, и отменить проведение документа.

Если же отрицательных остатков не появилось, тогда можно смело проводить документ.

Полдела у вас уже сделано: вы формируете движения документа и записываете их. Единственное, что вам осталось, – в случае оперативного проведения проконтролировать, что получилось, и, если появились отрицательные остатки, отменить проведение документа.

Итак, сделайте заготовку. После цикла обхода результата запроса и перед концом процедуры напишите следующие строки (листинг 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.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Сообщение = Новый СообщениеПользователю();

Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток) + " единиц материала """ + ВыборкаДетальныеЗаписи.Материал + """";

Сообщение.Сообщить();

Отказ = Истина;

 

КонецЦикла;

При выполнении проверки в запрос в параметре Склад передается склад, указанный в документе.

Затем выполняется запрос для получения отрицательных остатков номенклатуры, содержащейся во временной таблице и на складе, указанном в параметре Склад.

После этого выборка записей запроса обходится в цикле, и, если есть такие записи, они выводятся в сообщениях пользователю.

При этом параметру Отказ процедуры проведения документа присваивается значение Истина, то есть документ не проводится, начатая транзакция отменяется и состояние данных, измененных в процессе проведения, возвращается в исходное, до начала проведения документа.