Почему не работает контроль отрицательных остатков?

1. user1069796 25.12.18 17:29 Сейчас в теме
Процедура ОбработкаПроведения(Отказ, Режим)

	// регистр ДвиженияТМЦ Расход
	Движения.ДвиженияТМЦ.Записывать = Истина;
	Движения.ДвиженияТМЦ.Очистить();
	Для Каждого ТекСтрокаТовары Из Товары Цикл
		Движение = Движения.ДвиженияТМЦ.Добавить();
		Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
		Движение.Период = Дата;
		Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
		Движение.Количество = ТекСтрокаТовары.Количество;
	КонецЦикла;

	Движения.Записать();
	
	Если Режим = РежимПроведенияДокумента.Оперативный Тогда
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ДвиженияТМЦОстатки.Номенклатура КАК Номенклатура,
		|	- ДвиженияТМЦОстатки.КоличествоОстаток КАК Количество
		|ИЗ
		|	РегистрНакопления.ДвиженияТМЦ.Остатки(
		|			,
		|			Номенклатура В
		|				(ВЫБРАТЬ
		|					ОтгрузкаТоваровТовары.Номенклатура КАК Номенклатура
		|				ИЗ
		|					Документ.ОтгрузкаТоваров.Товары КАК ОтгрузкаТоваровТовары
		|				ГДЕ
		|					ОтгрузкаТоваровТовары.Ссылка = &Ссылка)) КАК ДвиженияТМЦОстатки
		|ГДЕ
		|	ДвиженияТМЦОстатки.КоличествоОстаток < 0";
	
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если НЕ РезультатЗапроса.Пустой() Тогда
		
		Отказ = Истина;
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
				Сообщить("Недостаточно товара" + ВыборкаДетальныеЗаписи.Номенклатура + " в количестве " + ВыборкаДетальныеЗаписи.Количество);	
		КонецЦикла;
		
	КонецЕсли;
	
	КонецЕсли;
	
КонецПроцедуры
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. koln 25.12.18 17:43 Сейчас в теме
(1) Попробуйте в виртуальной таблице
РегистрНакопления.ДвиженияТМЦ.Остатки
добавить параметр "&МоментВремени" с видом Граница.Включая, чтоб учесть и движения проводимого документа.
2. DarkUser 25.12.18 17:32 Сейчас в теме
Скорее всего из-за того, что вы проводите документ "не оперативно" или используете ссылку документа вместо момента времени и границы.
SnowflakeM; +1 Ответить
4. killitch 30 26.12.18 09:01 Сейчас в теме
Записав движения в обработке проведения и в ней же проверяя остатки, запрос не видит вашей записи, т.к. транзакция еще не зафиксирована и данных движения документа в базе нет.
Посмотрите когда и как идет проверка остатков в типовых документах. И да, проверьте режим проведения документа.
5. lefthander 26.12.18 09:05 Сейчас в теме
(4)Одно время это было прогрессивное решение, сначала двигаем, затем проверяем остатки, если есть отрицательные остатки откатываем транзакцию.
Вот только в запросе нет момента времени на который проверяются остатки, :)
6. killitch 30 26.12.18 09:24 Сейчас в теме
Точно, как-то не акцентировал на этом внимание. Вот и товарищ Чистов с примерами:
Методика оперативного проведения и управляемые блокировки
lefthander; +1 Ответить
7. user1069796 26.12.18 11:49 Сейчас в теме
Процедура ОбработкаПроведения(Отказ, Режим)

	// регистр ТоварыНаСкладах Расход
	Движения.ТоварыНаСкладах.Записывать = Истина;
	Для Каждого ТекСтрокаТовары Из Товары Цикл
		Движение = Движения.ТоварыНаСкладах.Добавить();
		Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
		Движение.Период = Дата;
		Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
		Движение.Количество = ТекСтрокаТовары.Количество;
	КонецЦикла;
	
	Движения.Записать();
	
	Если Режим = РежимПроведенияДокумента.Оперативный Тогда
	
		Запрос = Новый Запрос;
		Запрос.Текст = 
			"ВЫБРАТЬ
			|	ТоварыНаСкладахОстатки.Номенклатура,
			|	-ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество
			|ИЗ
			|	РегистрНакопления.ТоварыНаСкладах.Остатки(
			|			,
			|			Номенклатура В
			|				(ВЫБРАТЬ
			|					РеализацияТоваровИУслугТовары.Номенклатура
			|				ИЗ
			|					Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
			|				ГДЕ
			|					РеализацияТоваровИУслугТовары.Ссылка = &Ссылка)) КАК ТоварыНаСкладахОстатки
			|ГДЕ
			|	ТоварыНаСкладахОстатки.КоличествоОстаток < 0";
		
		Запрос.УстановитьПараметр("Ссылка", Ссылка);
		
		РезультатЗапроса = Запрос.Выполнить();
		
		Если НЕ РезультатЗапроса.Пустой() Тогда
			
			Отказ = Истина;
		
		ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
		
			Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
				
				Сообщить("Недостаточно товара "+ВыборкаДетальныеЗаписи.Номенклатура+" в количестве "+ВыборкаДетальныеЗаписи.Количество);
				
			КонецЦикла;
		
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры
Показать


Сделал в Управляемых формах и всё работает без Момента времени и ГраницыВключая.

В чём разница ?
8. Dmitrij-2 45 01.01.19 11:49 Сейчас в теме
(7) разница в том, что в первом запросе у вас документ "отгрузка товаров", а во втором "реализация товаров и услуг"
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот