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

1. G_104675376381940917085 26.05.24 14:36 Сейчас в теме
Почему если я хочу продавать товаров больше чем на складе, у меня выдаёт такую ошибку? Если я хочу продать товаров 10, а на складе у меня всего 5,то выдаёт эту ошибку

Преобразование значения к типу Число не может быть выполнено
{Документ.РасходнаяНакладная.МодульОбъекта(196)}: Движение.Прибыль = СуммаДокумента - СуммаСебестоимости;


Процедура ОбработкаПроведения(Отказ, Режим)
	//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	// регистр Взаиморасчёты Приход
	Движения.Взаиморасчёты.Записывать = Истина;
	Движение = Движения.Взаиморасчёты.Добавить();
	Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
	Движение.Период = Дата;
	Движение.Контрагент = Клиент;
	Движение.Сумма = СуммаДокумента;
	
	// регистр ТоварыНаСкладах Расход
	Движения.ТоварыНаСкладах.Записывать = Истина;
	Для Каждого ТекСтрокаТовары Из Товары Цикл
		Движение = Движения.ТоварыНаСкладах.Добавить();
		Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
		Движение.Период = Дата;
		Движение.Номенклатура = ТекСтрокаТовары.Товар;
		Движение.Склад = Склад;
		Движение.Количество = ТекСтрокаТовары.Количество;
	КонецЦикла;
	
	
	
	Запрос1 = Новый Запрос;
	Запрос1.Текст = 
	"ВЫБРАТЬ
	|	РасходнаяНакладнаяТовары.Товар КАК Товар,
	|	СУММА(РасходнаяНакладнаяТовары.Количество) КАК Количество,
	|	РасходнаяНакладнаяТовары.Ссылка.Склад КАК Склад
	|ПОМЕСТИТЬ ВременнаяТабличнаяЧастьТовары
	|ИЗ
	|	Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
	|ГДЕ
	|	РасходнаяНакладнаяТовары.Ссылка = &Ссылка
	|
	|СГРУППИРОВАТЬ ПО
	|	РасходнаяНакладнаяТовары.Товар,
	|	РасходнаяНакладнаяТовары.Ссылка.Склад
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ВременнаяТабличнаяЧастьТовары.Товар КАК Товар,
	|	ВременнаяТабличнаяЧастьТовары.Товар.Представление КАК ТоварПредставление,
	|	ВременнаяТабличнаяЧастьТовары.Количество КАК Количество,
	|	ВременнаяТабличнаяЧастьТовары.Склад КАК Склад,
	|	ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
	|ИЗ
	|	ВременнаяТабличнаяЧастьТовары КАК ВременнаяТабличнаяЧастьТовары
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
	|				&Дата,
	|				(Номенклатура, Склад) В
	|					(ВЫБРАТЬ
	|						ВременнаяТабличнаяЧастьТовары.Товар КАК Товар,
	|						ВременнаяТабличнаяЧастьТовары.Склад КАК Склад
	|					ИЗ
	|						ВременнаяТабличнаяЧастьТовары КАК ВременнаяТабличнаяЧастьТовары)) КАК ТоварыНаСкладахОстатки
	|		ПО ВременнаяТабличнаяЧастьТовары.Товар = ТоварыНаСкладахОстатки.Номенклатура
	|			И ВременнаяТабличнаяЧастьТовары.Склад = ТоварыНаСкладахОстатки.Склад
	|
	|УПОРЯДОЧИТЬ ПО
	|	Товар,
	|	Склад";
	
	Запрос1.УстановитьПараметр("Склад", Склад);
	Запрос1.УстановитьПараметр("Ссылка", Ссылка); 
	Запрос1.УстановитьПараметр("Дата",Дата);
	
	РезультатЗапроса1 = Запрос1.Выполнить();
	
	Выборка = РезультатЗапроса1.Выбрать();
	Пока Выборка.Следующий() Цикл
		Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
			Сообщить("Не хватает товара " + Выборка.ТоварПредставление + " " + (Выборка.Количество - Выборка.КоличествоОстаток));
			Отказ = Истина;
		КонецЕсли;
		Если Отказ Тогда
			Продолжить;
		КонецЕсли;

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

Себестоимость инициируется и заполняется в этом блоке.
Если Отказ, тогда в этот блок не заходит и Себестоимость = Неопределено.
Соответственно
Движение.Прибыль = СуммаДокумента - Неопределено; выдаст такую ошибку.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. G_104675376381940917085 26.05.24 14:39 Сейчас в теме
(1) В отладчике я посмотрел, если я хочу продать больше товаров чем есть, то себестоимость этого товара будет 0, но почему тогда выдаёт эту ошибку
3. spacecraft 26.05.24 15:04 Сейчас в теме
(1)
Если НЕ Отказ Тогда

Себестоимость инициируется и заполняется в этом блоке.
Если Отказ, тогда в этот блок не заходит и Себестоимость = Неопределено.
Соответственно
Движение.Прибыль = СуммаДокумента - Неопределено; выдаст такую ошибку.
4. G_104675376381940917085 26.05.24 15:22 Сейчас в теме
Оставьте свое сообщение

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