СводныйОстаток() - получаю неверные данные?

1. mimos 09.07.10 11:25 Сейчас в теме
Господа, прошу советов и идей :)

Имеются 2 склада - Склад 1 и Склад 2

При списании товара со склада 1 проверяется остаток на нём и если товара недостаточно, проверяется остаток на складе 2.

Имеется функция глСписаниеОстатковТМЦ, немного подправленная


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

КонецЕсли;
Показать


Не могу отследить следующий глюк или мою оплошность - иногда,видимо, СводныйОстаток по Складу 1 получается неверный.
Пример:
На Складе 1 Товара "Игрушка" 15 штук
На Складе 1 Товара "Игрушка" 30 штук

Надо списать 20 штук товара "Игрушка"
В накладной указан склад 1
То есть со склада 1 должен списать 15 и со склада 2 должен списать 5

А реально со склада 1 может списать 20 штук и остаток уйдёт в минус.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Ёпрст 1065 09.07.10 11:45 Сейчас в теме
а завтра наименование склада поменяют и ппц всему алгоритму ?
3. Tatitutu 3844 09.07.10 11:46 Сейчас в теме
у тебя измерения регистра идут именно в такой последовательности

Фирма, Товар, Склад ?а не (фирма,склад,товар) Что за конфигурация ?

и на какой ты все время ищешь
СпрВремСклад.НайтиПоНаименованию();
4. Tatitutu 3844 09.07.10 11:49 Сейчас в теме
и почему в накладной у тебя указан изначально склад 1
перед формированием ее из заявки проверяешь что где и сколько
и делаешь сразу 2 накладные
одну на 1 склад, другую на 2
(как у тебя потом кладовщики видят , что откуда списалось - по факту ?) а документы у них для отчетности для отгрузки какие ?
5. Ёпрст 1065 09.07.10 11:49 Сейчас в теме
+1 да и нафига ветка Иначе в условии, при первых 2-х условий на меньше и больше или равно ?

А так, за поиск по наименованию в коде нужно увольнять без объяснения причины.
6. mimos 09.07.10 11:52 Сейчас в теме
Tatitutu пишет:

у тебя измерения регистра идут именно в такой последовательности



Фирма, Товар, Склад ?а не (фирма,склад,товар) Что за конфигурация ?



и на какой ты все время ищешь

СпрВремСклад.НайтиПоНаименованию();
Показать



ну да,в такой. ТиС 954

Ёпрст пишет:

а завтра наименование склада поменяют и ппц всему алгоритму ?

не,названия не поменяют

Ёпрст пишет:
+1 да и нафига ветка Иначе в условии, при первых 2-х условий на меньше и больше или равно ?

Иначе к другому условию относится же.

Tatitutu пишет:
и почему в накладной у тебя указан изначально склад 1
перед формированием ее из заявки проверяешь что где и сколько
и делаешь сразу 2 накладные
одну на 1 склад, другую на 2
(как у тебя потом кладовщики видят , что откуда списалось - по факту ?) а документы у них для отчетности для отгрузки какие ?


Нужно именно одной накладной.
Ну так для этого и делаются движения по двум складам,чтобы видеть что списалось.
7. Ёпрст 1065 09.07.10 12:04 Сейчас в теме
(6) вообще зачет списывать с разных складов в 1 накладной..

ну и бардак будет в учете..
8. Ёпрст 1065 09.07.10 12:06 Сейчас в теме
+7 ладно там, реквизит склад бы загнал в ТЧ дока, еще туда сюда, но автоматическое списание с разных складов... потом разгребать это всё кому-то придётся.

Да еще и с поиском по наименованию.. вообще жесть.
9. mimos 09.07.10 12:19 Сейчас в теме
Ёпрст пишет:

+7 ладно там, реквизит склад бы загнал в ТЧ дока, еще туда сюда, но автоматическое списание с разных складов... потом разгребать это всё кому-то придётся.



Да еще и с поиском по наименованию.. вообще жесть.



Да не,для отчётности им нужен склад 2,по которому не идёт движений с разных складов.

Ну так идейки есть почему могу остатки не верные получаться? :)
10. Tatitutu 3844 09.07.10 12:28 Сейчас в теме
(0) Пример точно правильный привел

Пример:
На Складе 1 Товара "Игрушка" 15 штук
На Складе 1 Товара "Игрушка" 30 штук

может
Пример:
На Складе 1 Товара "Игрушка" 15 штук
На Складе 2 Товара "Игрушка" 30 штук
11. mimos 09.07.10 12:30 Сейчас в теме
Tatitutu пишет:

(0) Пример точно правильный привел



Пример:

На Складе 1 Товара "Игрушка" 15 штук

На Складе 1 Товара "Игрушка" 30 штук



может

Пример:

На Складе 1 Товара "Игрушка" 15 штук

На Складе 2 Товара "Игрушка" 30 штук
Показать


Спасибо за исправления, Вы правы :)
12. Tatitutu 3844 09.07.10 12:37 Сейчас в теме
у тебя в коде
немного подправленная

полнейший бардак , про оптимизацию вообще молчу
объясни чем по твоему отличается в твоем контексте при проведении документа

ТекФирма, Конт.Фирма, Фирма
13. mimos 09.07.10 12:48 Сейчас в теме
Tatitutu,
Вы правы, Конт.Фирма и Фирма не отличаются.
14. Tatitutu 3844 09.07.10 12:51 Сейчас в теме
(13) а ТекФирма ?отличается
в документе есть реквизит типа Склад ?
15. mimos 09.07.10 12:58 Сейчас в теме
Tatitutu,
ну да,ТекФирма может и отличаться. в ней хранится текущая фирма из списка фирм.

Да,есть. из реализации списывается товар.
16. Tatitutu 3844 09.07.10 13:03 Сейчас в теме
тогда весь код в студию ,без ....
17. mimos 09.07.10 13:11 Сейчас в теме
Функция глСписаниеОстатковТМЦ(Конт,ТаблНоменклатуры,СписокПараметров, ВремОстаткиТМЦ, ВремРезервыТМЦ = "") Экспорт
	
	Перем КонтрольОстатков, КонтрольРезервов;
	
	СпрВремСклад=СоздатьОбъект("Справочник.Склады");
	
	РегОстатки 		    = Конт.Регистр.ОстаткиТМЦ;
	
	Фирма  			    = СписокПараметров.Получить("Фирма");
	ФирмаДляОстатковТМЦ = СписокПараметров.Получить("ФирмаДляОстатковТМЦ");
	Склад			    = СписокПараметров.Получить("Склад");
	ТекДок			    = СписокПараметров.Получить("ТекДок");
	Договор			    = СписокПараметров.Получить("Договор");
	КодОперации		    = СписокПараметров.Получить("КодОперации");  

	ВнутреннееПеремещение = ?(((КодОперации = глКО.Перемещение) или (КодОперации = глКО.ПередачаВРозницу) 
								или (КодОперации = глКО.ВозвратИзРозницы)),1,0); 
	
	КонтрольРезервов = 0;   
	Если Константа.КонтрольОтрицательныхОстатков = Перечисление.СпособыКонтроляОстатковТМЦ.НеКонтролировать Тогда 
		КонтрольОстатков = 0; 
	Иначе
		КонтрольОстатков = 1; 
		Если глПолучитьПолномочие("РазрешитьПродаватьРезерв") = 0 Тогда
			КонтрольРезервов = 1;
		КонецЕсли;
	
	КонецЕсли;           
	
	Если (Склад.РозничныйСклад = 1) Тогда
		// розничный склад будем контролировать всегда, поскольку там идет 
		// учет в разрезе цен и работа задним числом сильно затруднена.
		КонтрольОстатков=1;
	КонецЕсли;
	
	ТаблНоменклатуры.ВыбратьСтроки();
	Пока ТаблНоменклатуры.ПолучитьСтроку()=1 Цикл                        
		
		ТекНоменклатура = ТаблНоменклатуры.Номенклатура;
		
		Если (ТекНоменклатура.ВидНоменклатуры 	= Перечисление.ВидыНоменклатуры.Услуга)
		 или (ТекНоменклатура.ВидНоменклатуры 	= Перечисление.ВидыНоменклатуры.Работа)
		 или (ТаблНоменклатуры.Количество 	= 0) Тогда
			Продолжить;
		КонецЕсли;     
		
	    Цена = ТаблНоменклатуры.ЦенаПрод;
		
		РезервНаСкладе = 0;
		РезервПоФирме  = 0;
		Если (ТипЗначенияСтр(ВремРезервыТМЦ) = "Регистр")
		и    (КонтрольРезервов = 1) 
		Тогда                      
			Если ПустоеЗначение(ФирмаДляОстатковТМЦ) = 1 Тогда // Фильтр по фирме не нужен
				
				РезервНаСкладе = ВремРезервыТМЦ.СводныйОстаток(,ТекНоменклатура,Склад,,,"Количество"); 
			    
				Если (ВнутреннееПеремещение   = 0) Тогда                                 
					
					// для внутренних перемещений не конролируем резерв по фирму в целом 
					// (поскольку он на самом деле не изменится)
					РезервПоФирме  = ВремРезервыТМЦ.СводныйОстаток(,ТекНоменклатура,,,,"Количество"); 
				КонецЕсли;
				
				Если (ПустоеЗначение(Договор) = 0) Тогда
					
					// вычтем резервы, котрые сделал наш же покупатель
					РезервНаСкладе = РезервНаСкладе - 
					                 ВремРезервыТМЦ.СводныйОстаток(,ТекНоменклатура,Склад,Договор,,"Количество");
					Если (ВнутреннееПеремещение   = 0) Тогда				
						РезервПоФирме  = РезервПоФирме  - 
						             ВремРезервыТМЦ.СводныйОстаток(,ТекНоменклатура,     ,Договор,,"Количество");
					КонецЕсли;  	
				КонецЕсли;  
				
			ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "СписокЗначений" Тогда // Нужны сводные остатки по нескольким фирмам
				
				СчетчикЦикла = 0;
				Для СчетчикЦикла = 1 По ФирмаДляОстатковТМЦ.РазмерСписка() Цикл
					
					ТекФирма = ФирмаДляОстатковТМЦ.ПолучитьЗначение(СчетчикЦикла);
					РезервНаСкладе = РезервНаСкладе + 
					                 ВремРезервыТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,Склад,,,"Количество"); 
					Если (ВнутреннееПеремещение   = 0) Тогда
						РезервПоФирме  = РезервПоФирме + 
						                 ВремРезервыТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,,,,"Количество"); 
					КонецЕсли;
					Если (ПустоеЗначение(Договор) = 0) Тогда
						
						// вычтем резервы, котрые сделал наш же покупатель
						РезервНаСкладе = РезервНаСкладе - 
						                 ВремРезервыТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,Склад,Договор,,"Количество"); 
						Если (ВнутреннееПеремещение   = 0) Тогда				
							РезервПоФирме  = РезервПоФирме  - 
							                 ВремРезервыТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,     ,Договор,,"Количество");
						КонецЕсли;  	
					КонецЕсли;  
					
				КонецЦикла;
				
			ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда  // нужны сводные остатки только по одной фирме
				
				РезервНаСкладе = ВремРезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,Склад,,,"Количество"); 
				Если (ВнутреннееПеремещение   = 0) Тогда
					РезервПоФирме  = ВремРезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,,,,"Количество"); 
				КонецЕсли;
				Если (ПустоеЗначение(Договор) = 0) Тогда
					// вычтем резервы, котрые сделал наш же покупатель
					РезервНаСкладе = РезервНаСкладе - 
					                 ВремРезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,Склад,Договор,,"Количество"); 
					Если (ВнутреннееПеремещение   = 0) Тогда				
						РезервПоФирме  = РезервПоФирме  - 
						                 ВремРезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,,Договор,,"Количество");
					КонецЕсли;  	
				КонецЕсли;  
			КонецЕсли;
		КонецЕсли;                                                                        
		    
		ОстатокНаСкладе = 0; 
		ОстатокПоФирме  = 0;
		ОстатокНаСкладеЦ = 0;

		Если КонтрольОстатков = 1 Тогда
			
			// остаток на складе
			Если ПустоеЗначение(ФирмаДляОстатковТМЦ) = 1 Тогда
				
				ОстатокНаСкладе = ВремОстаткиТМЦ.СводныйОстаток(,ТекНоменклатура,Склад,,"Количество"); 
				Если (ВнутреннееПеремещение = 0) Тогда
					ОстатокПоФирме = ВремОстаткиТМЦ.СводныйОстаток(,ТекНоменклатура,,,"Количество");
				КонецЕсли;	
				Если Склад.РозничныйСклад = 1 Тогда
					ОстатокНаСкладеЦ = ВремОстаткиТМЦ.СводныйОстаток(,ТекНоменклатура,Склад,Цена,"Количество");
				КонецЕсли;                                                                              
				
			ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда
				
				ОстатокНаСкладе = ВремОстаткиТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,Склад,,"Количество"); 
				Если (ВнутреннееПеремещение = 0) Тогда
					ОстатокПоФирме = ВремОстаткиТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,,,"Количество");
				КонецЕсли;	
				Если Склад.РозничныйСклад = 1 Тогда
					ОстатокНаСкладеЦ = ВремОстаткиТМЦ.Остаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,Склад,Цена,"Количество");
				КонецЕсли;
				
			ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "СписокЗначений" Тогда 
				
				СчетчикЦикла = 0;
				Для СчетчикЦикла = 1 По ФирмаДляОстатковТМЦ.РазмерСписка() Цикл
					ТекФирма = ФирмаДляОстатковТМЦ.ПолучитьЗначение(СчетчикЦикла);
					Если СокрЛП(Склад.Наименование)="Склад 1" Тогда
					ОстатокНаСкладе = ОстатокНаСкладе + 
					                  ВремОстаткиТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,,,"Количество"); 
					Иначе
					ОстатокНаСкладе = ОстатокНаСкладе + 
					                  ВремОстаткиТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,Склад,,"Количество"); 			
					КонецЕсли;
					Если (ВнутреннееПеремещение = 0) Тогда
						ОстатокПоФирме = ОстатокПоФирме + 
						                 ВремОстаткиТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,,,"Количество");
					КонецЕсли;	
					Если Склад.РозничныйСклад = 1 Тогда
						ОстатокНаСкладеЦ = ОстатокНаСкладеЦ + 
						                   ВремОстаткиТМЦ.Остаток(ТекФирма,ТекНоменклатура,Склад,Цена,"Количество");
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
		Иначе
			ОстатокНаСкладе = ТаблНоменклатуры.Количество;
			ОстатокПоФирме  = ТаблНоменклатуры.Количество;
		КонецЕсли; // КонтрольОстатков = 1 
		
		// проверка резерва на складе
		Если (ОстатокНаСкладе - РезервНаСкладе) < ТаблНоменклатуры.Количество Тогда
			глНеПроводить(Конт,"На складе нет нужного свободного количества ТМЦ "+ТекНоменклатура.Наименование
			+?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(ТекНоменклатура.Артикул), "")
			+". "+РазделительСтрок+"    Всего осталось "+Строка(ОстатокНаСкладе)+" "+ТекНоменклатура.БазоваяЕдиница
			+?(РезервНаСкладе <> 0 ,". "+РазделительСтрок+"    Зарезервировано по выписанным Заявкам "+Строка(РезервНаСкладе) +" "+ТекНоменклатура.БазоваяЕдиница,"")
			+"."+РазделительСтрок+"Требуемое количество "+Строка(ТаблНоменклатуры.Количество)+" "+ТекНоменклатура.БазоваяЕдиница);
			Возврат (0);
		КонецЕсли;                 
		
		// а также по фирме в целом
		Если (ВнутреннееПеремещение   = 0) Тогда                                 
			Если (ОстатокПоФирме - РезервПоФирме) < ТаблНоменклатуры.Количество Тогда
				глНеПроводить(Конт,"На фирме в целом нет нужного свободного количества ТМЦ "+ТекНоменклатура.Наименование
				+?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(ТекНоменклатура.Артикул), "")
				+". "+РазделительСтрок+"    Всего осталось "+Строка(ОстатокПоФирме)+" "+ТекНоменклатура.БазоваяЕдиница
				+?(РезервПоФирме<>0,". "+РазделительСтрок+"    Зарезервировано по выписанным Заявкам "+Строка(РезервПоФирме) +" "+ТекНоменклатура.БазоваяЕдиница,"")
				+"."+РазделительСтрок+"Требуемое количество "+Строка(ТаблНоменклатуры.Количество)+" "+ТекНоменклатура.БазоваяЕдиница);
				Возврат (0);
			КонецЕсли;
		КонецЕсли;                 
		
		// проверка цены реализации для розничного склада
		Если (Склад.РозничныйСклад = 1) Тогда   
			Если (ОстатокНаСкладеЦ) < ТаблНоменклатуры.Количество Тогда    
				глНеПроводить(Конт,"На розничном складе нет ТМЦ "+ТекНоменклатура.Наименование
				+?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(ТекНоменклатура.Артикул), "")
				+" по указанной цене "+глФРМ(Цена)+" "+глРубли
				+". "+РазделительСтрок+"    Всего осталось по указанной цене "+Строка(ОстатокНаСкладеЦ)+" "+ТекНоменклатура.БазоваяЕдиница
				+"."+РазделительСтрок+"Требуемое количество "+Строка(ТаблНоменклатуры.Количество)+" "+ТекНоменклатура.БазоваяЕдиница);
				Возврат (0);
			КонецЕсли;                         
		КонецЕсли;
		
		Если СокрЛП(Склад.Наименование)="Склад 1" Тогда
			ОстатокНал=0;
			ОстатокБезНал=0;
			СпрВремСклад.НайтиПоНаименованию("Склад 1",0,1);
			ОстатокНал = ВремОстаткиТМЦ.СводныйОстаток(Конт.Фирма,ТекНоменклатура,СпрВремСклад.ТекущийЭлемент(),,"Количество");
			СпрВремСклад.НайтиПоНаименованию("Склад 2",0,1);
			ОстатокБезНал = ВремОстаткиТМЦ.СводныйОстаток(Конт.Фирма,ТекНоменклатура,СпрВремСклад.ТекущийЭлемент(),,"Количество");
			
			Если (ОстатокНал<ТаблНоменклатуры.Количество) Тогда
				СписатьКолСБезнала=ТаблНоменклатуры.Количество-ОстатокНал;
				Если ОстатокНал<>0 Тогда
					РегОстатки.Фирма			= Фирма;
					СпрВремСклад.НайтиПоНаименованию("Склад 1",0,1);
					РегОстатки.Склад			= СпрВремСклад.ТекущийЭлемент();
					РегОстатки.Номенклатура		= ТекНоменклатура;
					РегОстатки.Количество		= ОстатокНал;
					РегОстатки.ЦенаПрод		= Цена;
					РегОстатки.Внутреннее		= ВнутреннееПеремещение;
					РегОстатки.ДвижениеРасходВыполнить();
				КонецЕсли;
				РегОстатки.Фирма			= Фирма;
				СпрВремСклад.НайтиПоНаименованию("Склад 2",0,1);
				РегОстатки.Склад			= СпрВремСклад.ТекущийЭлемент();
				РегОстатки.Номенклатура		= ТекНоменклатура;
				РегОстатки.Количество		= СписатьКолСБезнала;
				РегОстатки.ЦенаПрод		= Цена;
				РегОстатки.Внутреннее		= ВнутреннееПеремещение;
				РегОстатки.ДвижениеРасходВыполнить();
				
			ИначеЕсли (ОстатокНал>=ТаблНоменклатуры.Количество) Тогда
				РегОстатки.Фирма			= Фирма;
				СпрВремСклад.НайтиПоНаименованию("Склад 1",0,1);
				РегОстатки.Склад			= СпрВремСклад.ТекущийЭлемент();
				РегОстатки.Номенклатура		= ТекНоменклатура;
				РегОстатки.Количество		= ТаблНоменклатуры.Количество;
				РегОстатки.ЦенаПрод		= Цена;
				РегОстатки.Внутреннее		= ВнутреннееПеремещение;
				РегОстатки.ДвижениеРасходВыполнить();
			КонецЕсли;
			
		Иначе
			// измерения
			РегОстатки.Фирма			= Фирма;
			РегОстатки.Склад			= Склад;
			РегОстатки.Номенклатура		= ТекНоменклатура;
			//ресурсы
			РегОстатки.Количество		= ТаблНоменклатуры.Количество;
			РегОстатки.ЦенаПрод		= Цена;
			
			//реквизиты
			РегОстатки.Внутреннее		= ВнутреннееПеремещение;
			
			РегОстатки.ДвижениеРасходВыполнить();
		КонецЕсли;
		
		
	КонецЦикла;
	
	Возврат (1);
	
КонецФункции // глСписаниеОстатковТМЦ()
Показать
18. Tatitutu 3844 09.07.10 13:27 Сейчас в теме
(0) Извини меня... или сегодня пятница или я устал от жару
откуда ты эту функцию скопипастил ? из глобального модуля ?
еще раз извини , но честно не врубаюсь
что там делает код "движения регистров"?
19. mimos 09.07.10 13:31 Сейчас в теме
ага,она в глобальнике. через неё движения делаются.
20. Ёпрст 1065 09.07.10 15:46 Сейчас в теме
У тебя ошибка в коде :

ты смотришь останки, только если прилетел список значений с фирмами, это раз

Второе, и самое главное- ты берешь остаток без учета склада (т.е по всем складам), если наименование склада - "Склад1"...
	Если СокрЛП(Склад.Наименование)="Склад 1" Тогда
						ОстатокНаСкладе = ОстатокНаСкладе +
						ВремОстаткиТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,,,"Количество");
					Иначе
						ОстатокНаСкладе = ОстатокНаСкладе +
						ВремОстаткиТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,Склад,,"Количество");          
					КонецЕсли;


вот и списывает всегда тебе в минус с этого склада и на второй склад ему по-боку.
21. mimos 09.07.10 17:18 Сейчас в теме
Ёпрст пишет:

У тебя ошибка в коде :

ты смотришь останки, только если прилетел список значений с фирмами, это раз

Второе, и самое главное- ты берешь остаток без учета склада (т.е по всем складам), если наименование склада - "Склад1"...


там несколько фирм было,но сейчас там остатки на одной,так что всегда список прилетает.

Если выбран Склад 1, то остатки можно получать с обоих складов.
А если выбран Склад 2,то остатки видны только по складу 2
22. Ёпрст 1065 12.07.10 12:06 Сейчас в теме
Гыыыы..

>>>При списании товара со склада 1 проверяется остаток на нём и если товара недостаточно, проверяется остаток на складе 2.

Вот это условие у тебя никогда не проверяется.
Если склад = Склад1, то смотришь всегда по ВСЕМ складам...
вот и в минус летишь по складу 1.
23. mimos 12.07.10 15:20 Сейчас в теме
Ёпрст пишет:

Гыыыы..

>>>При списании товара со склада 1 проверяется остаток на нём и если товара недостаточно, проверяется остаток на складе 2.

Вот это условие у тебя никогда не проверяется.
Если склад = Склад1, то смотришь всегда по ВСЕМ складам...
вот и в минус летишь по складу 1.


смотри, сначала проверяю общее кол-во на обоих складах:
Если КонтрольОстатков = 1 Тогда
...
Если СокрЛП(Склад.Наименование)="Склад 1" Тогда

ОстатокНаСкладе = ОстатокНаСкладе + 
					                  ВремОстаткиТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,,,"Количество");

...
Показать

если на обоих складах в сумме товара меньше,чем требуется,то выдаётся сообщение о нехватке товара.

уже после этой проверки получаю остатки по каждому складу
СпрВремСклад.НайтиПоНаименованию("Склад 1",0,1);
ОстатокНал = ВремОстаткиТМЦ.СводныйОстаток(Конт.Фирма,ТекНоменклатура,СпрВремСклад.ТекущийЭлемент(),,"Количество");
СпрВремСклад.НайтиПоНаименованию("Склад 2",0,1);
ОстатокБезНал = ВремОстаткиТМЦ.СводныйОстаток(Конт.Фирма,ТекНоменклатура,СпрВремСклад.ТекущийЭлемент(),,"Количество");


И дальше провереряю на требуемое кол-во товара;хватает-списываем,не хватает - часть товара списываю с другого склада

Может я не вижу чего увидел ты :) ткни пальцем пожалуйста тогда :)
Оставьте свое сообщение

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