Доработка реализации

1. SeverBaP 5 13.02.10 14:56 Сейчас в теме
Каждый день мы сталкиваемся с проблемой недостачи товара на складе нашей фирме при реализации товара, часто недостоющее количество имеется на складе собственной фирмы - поэтому в ТиС приходится делать "Продажа собственной фирме". Решили дописать реализацию: ввели дополнительный справочник для правил продаж собственным фирмам (ППСФ). При оформлении документа реализация розничная необходимо было сначало проверить наличие товара на складе у себя (программно), потом если недостаточно количества обротится к ППСФ и посмотреть на складе собственной фирмы. Если есть то оформляем реализацию и поступление на наш склад для дальнейшей розничной реализации. При написании возникли проблемы с определением в какой момент нужно сделать проверку и доприходывание недостающего товара на склад от собственной фирмы - в обработке проведения документа нельзя создать и провести документы созданные для этих целей, а в процедуре ПриЗаписи() - есть вероятность сделать ненужное доприходывание товаров.
Вдобавок при реализации создании необходимых документов в самих документах расчитывает неверно в чем ошибка я незнаю.
Вот код:
	ВремРегистр=СоздатьОбъект("Регистры");
	ТаблицаНедостатков=СоздатьОбъект("ТаблицаЗначений");
	ВыгрузитьТабличнуюЧасть(ТаблицаНедостатков);
	ОстаткиТМЦ=ВремРегистр.ОстаткиТМЦ;
	ТаблицаНедостатков.НоваяКолонка("ЦенаПрод");
	ТаблицаНедостатков.ВыбратьСтроки();
	Пока ТаблицаНедостатков.ПолучитьСтроку()=1 Цикл
		Если (ТаблицаНедостатков.Номенклатура.ВидНоменклатуры=Перечисление.ВидыНоменклатуры.Услуга) 
		Или (ТаблицаНедостатков.Номенклатура.ВидНоменклатуры=Перечисление.ВидыНоменклатуры.Работа) Тогда
			ТаблицаНедостатков.УдалитьСтроку();
			Продолжить;
		КонецЕсли;	
		ОстатокНоменклатуры=ОстаткиТМЦ.СводныйОстаток(Фирма,ТаблицаНедостатков.Номенклатура,Склад,,"Количество");
		Если ОстатокНоменклатуры<ТаблицаНедостатков.Количество Тогда
			ТаблицаНедостатков.Количество=ТаблицаНедостатков.Количество-ОстатокНоменклатуры;
		Иначе
			ТаблицаНедостатков.УдалитьСтроку();
			Продолжить;
		КонецЕсли;	
	КонецЦикла;	
	Если ТаблицаНедостатков.КоличествоСтрок()<>0 Тогда
		ПравилаПродажФирмам=СоздатьОбъект("Справочник.ПланыОбмена");
		Если ПравилаПродажФирмам.НайтиПоРеквизиту("ФирмаПокупатель",Фирма,1)=1 Тогда
			ОптФирма=ПравилаПродажФирмам.ФирмаПоставщик;
			ОптСклад=ПравилаПродажФирмам.СкладПоставщика;
			ТипЦенРеализации=ПравилаПродажФирмам.ТипЦенРеализации;
		Иначе
			СтатусВозврата(0);
			Возврат;
		КонецЕсли;	
		Параметры=СоздатьОбъект("СписокЗначений");
		Параметры.ДобавитьЗначение(ТекущийДокумент(),"ТекДок");
		Параметры.ДобавитьЗначение(Склад,		"Склад");
		Параметры.ДобавитьЗначение(Фирма,		"Фирма");
		Параметры.ДобавитьЗначение(ОптФирма,"ФирмаДляОстатковТМЦ");
		Параметры.ДобавитьЗначение("",	"Контрагент");
		Параметры.ДобавитьЗначение("",		"Договор");
		ОстаткиВсе=ВремРегистр.ОстаткиТМЦ;
		ВремРезервыТМЦ=ВремРегистр.РезервыТМЦ;
		РезПроверки = ПроверкаОстатковТМЦНаОпте	(Контекст,ТаблицаНедостатков,Параметры, ОстаткиВсе, ОптСклад, ВремРезервыТМЦ);
		Если РезПроверки <>0 Тогда
			//ТаблицаНедостатков.ВыбратьСтроки();
			//Пока ТаблицаНедостатков.ПолучитьСтроку()=1 Цикл
			//	
			//КонецЦикла;	
			НачатьТранзакцию();
			РеализацияСобственнойФирме=Создатьобъект("Документ.Реализация");
			РеализацияСобственнойФирме.Новый();      
			РеализацияСобственнойФирме.ДатаДок = ДатаДок;
			РеализацияСобственнойФирме.АвтоВремяНачалоДня();
			РеализацияСобственнойФирме.Фирма=ОптФирма;
			РеализацияСобственнойФирме.Склад=ОптСклад;
			РеализацияСобственнойФирме.Контрагент=ПравилаПродажФирмам.КонтрагентПосредник;
			Если ПустоеЗначение(ПравилаПродажФирмам.ДоговорПродажи)=1 Тогда
				РеализацияСобственнойФирме.Договор=РеализацияСобственнойФирме.Контрагент.ОсновнойДоговор;
			Иначе
				РеализацияСобственнойФирме.Договор=ПравилаПродажФирмам.ДоговорПродажи;
			КонецЕсли;
			РеализацияСобственнойФирме.ТипЦен=ТипЦенРеализации;
			РеализацияСобственнойФирме.Валюта=ТипЦенРеализации.Валюта;
			РеализацияСобственнойФирме.УчитыватьНП=ТипЦенРеализации.ЦенаВклНП;
			РеализацияСобственнойФирме.УчитыватьНДС=ТипЦенРеализации.ЦенаВклНДС;
			// уникальные реквизиты шапки
			РеализацияСобственнойФирме.КодОперации = глКО.Продажа;
			РеализацияСобственнойФирме.ДатаОплаты   = ДатаДок; 
			РеализацияСобственнойФирме.ЗагрузитьТабличнуюЧасть(ТаблицаНедостатков);
			//**************************
			
			// Цикл по всем товарам в документе
			РеализацияСобственнойФирме.ВыбратьСтроки();
			Пока РеализацияСобственнойФирме.ПолучитьСтроку() = 1 Цикл
				
				ТекТМЦ = РеализацияСобственнойФирме.Номенклатура;
				
				// Получаем цену
				ПЦена         = 0;
				ПЕдиницаКонт  = РеализацияСобственнойФирме.Единица;
				ПЕдиницаЦены  = ПЕдиницаКонт;                          
				ПВалютаЦены   = ТипЦенРеализации.Валюта; 
				ПЦенаВклНП    = ТипЦенРеализации.ЦенаВклНП; 
				ПЦенаВклНДС   = ТипЦенРеализации.ЦенаВклНДС;
				
				Если глВернутьЦену(ТекТМЦ, РеализацияСобственнойФирме.ТипЦен, РеализацияСобственнойФирме.ДатаДок, ПЦена, ПЕдиницаЦены, ПВалютаЦены) = 1 Тогда
					
					// Приводим к одной единице (если в документе она есть)
					Если ПЕдиницаЦены.Коэффициент  <>  РеализацияСобственнойФирме.Коэффициент Тогда
						Если ПЕдиницаЦены.Коэффициент <> 0  Тогда
							ПЦена = (ПЦена * РеализацияСобственнойФирме.Коэффициент) / ПЕдиницаЦены.Коэффициент;
						КонецЕсли;
					КонецЕсли;
					
					глПересчитатьЦенуВДокументе(РеализацияСобственнойФирме, РеализацияСобственнойФирме.УчитыватьНП, РеализацияСобственнойФирме.УчитыватьНДС, ПЦена, ПВалютаЦены, ПЦенаВклНП, ПЦенаВклНДС);
				Иначе
					РеализацияСобственнойФирме.Цена = 0;
				КонецЕсли;  
				
				
			КонецЦикла;
			глПересчетТаблЧасти(РеализацияСобственнойФирме,"Цена");
			РеализацияСобственнойФирме.Комментарий = "Продажа собственной фирме";
			РеализацияСобственнойФирме.Записать();
			РеализацияСобственнойФирме.Провести();
			Если РеализацияСобственнойФирме.Проведен() = 0 Тогда
				ОтменитьТранзакцию();
				Возврат;
			КонецЕсли;                    
			ТаблицаНедостатков.Очистить();
			РеализацияСобственнойФирме.ВыгрузитьТабличнуюЧасть(ТаблицаНедостатков);
			ДокПоступление=Создатьобъект("Документ.ПоступлениеТМЦ");
			ДокПоступление.Новый();
			ДокПоступление.ДатаДок = ДатаДок;
			Ч=0;	М=0;	С=0;
			РеализацияСобственнойФирме.ПолучитьВремя(Ч,М,С);
			ДокПоступление.ПолучитьВремя(Ч,М+1,С);
			// идентичные реквизиты шапки
			СкопироватьРеквизитыШапки(РеализацияСобственнойФирме, ДокПоступление);
			// отличающиеся реквизиты шапки
			ДокПоступление.Фирма = Фирма;    
			ДокПоступление.УстановитьНовыйНомер(Фирма.ЮрЛицо.ПрефиксНомеровДокументов);
			ДокПоступление.Контрагент = ПравилаПродажФирмам.КонтрагентПосредник;
			Если ПустоеЗначение(ПравилаПродажФирмам.ДоговорПродажи)=1 Тогда
				ДокПоступление.Договор=ДокПоступление.Контрагент.ОсновнойДоговор;
			Иначе
				ДокПоступление.Договор=ПравилаПродажФирмам.ДоговорПродажи;
			КонецЕсли;
			ДокПоступление.Склад = Склад;
			// уникальные реквизиты шапки
			ДокПоступление.КодОперации = глКО.Закупка;
			ДокПоступление.ДатаОплаты   = ДатаДок; 
			// табличная часть
			РегПартии = СоздатьОбъект("Регистр.ПартииНаличие");
			ТабПартий = СоздатьОбъект("ТаблицаЗначений");
			ДокПоступление.ВыгрузитьТабличнуюЧасть(ТабПартий);   
			ТабПартий.НоваяКолонка("ГТД", "Справочник.ГТД");
			ТабПартий.НоваяКолонка("СтранаПроисхождения", "Справочник.ОКСМ");
			ТабПартий.НоваяКолонка("Свойство", "Справочник.ЗначенияСвойств");
			РеализацияСобственнойФирме.ВыбратьСтроки();
			ТабДвижений = СоздатьОбъект("ТаблицаЗначений");
			ТабДвижений.НоваяКолонка("НомСтроки", "Число", 19, 3);
			ТабДвижений.НоваяКолонка("Количество", "Число", 19, 3);
			ТабДвижений.НоваяКолонка("ГТД", "Справочник.ГТД");
			ТабДвижений.НоваяКолонка("СтранаПроисхождения", "Справочник.ОКСМ");
			ТабДвижений.НоваяКолонка("Свойство", "Справочник.ЗначенияСвойств");
			РегПартии.ВыбратьДвиженияДокумента(РеализацияСобственнойФирме.ТекущийДокумент());
			Пока РегПартии.ПолучитьДвижение()=1 Цикл   
				ТабДвижений.НоваяСтрока();  
				ТабДвижений.НомСтроки = РегПартии.НомерСтроки();
				ТабДвижений.Количество = РегПартии.Количество;
				ТабДвижений.ГТД = РегПартии.Партия.ГТД;
				ТабДвижений.СтранаПроисхождения = РегПартии.Партия.СтранаПроисхождения;
				ТабДвижений.Свойство = РегПартии.Партия.Свойство;
			КонецЦикла;
			ТабДвижений.Свернуть("НомСтроки, ГТД, СтранаПроисхождения, Свойство", "Количество");  
			Пока РеализацияСобственнойФирме.ПолучитьСтроку() = 1 Цикл                           
				// Посчитаем количество строк по данной строке документа в таблице движений
				КолСтрок = 0;                                                              
				ТабДвижений.ВыбратьСтроки();
				Пока ТабДвижений.ПолучитьСтроку() = 1 Цикл
					Если ТабДвижений.НомСтроки = РеализацияСобственнойФирме.НомерСтроки Тогда
						КолСтрок = КолСтрок + 1;
					КонецЕсли;
				КонецЦикла;
				
				// Если в таблице движений больше одной строки, то придется разбивать
				// по ГТД и стране происхождения
				Если КолСтрок > 1 Тогда       
					ОстСумма = РеализацияСобственнойФирме.Сумма;
					ОстНДС 	 = РеализацияСобственнойФирме.СуммаНДС;
					ОстНП 	 = РеализацияСобственнойФирме.СуммаНП;
					Для к = 1 по ТабДвижений.КоличествоСтрок() Цикл   
						ТабДвижений.ПолучитьСтрокуПоНомеру(к);
						Если ТабДвижений.НомСтроки <> РеализацияСобственнойФирме.НомерСтроки Тогда
							Продолжить;
						КонецЕсли;
						ТабПартий.НоваяСтрока();
						ТабПартий.Номенклатура = РеализацияСобственнойФирме.Номенклатура;
						ТабПартий.Количество = ТабДвижений.Количество;                 
						ТабПартий.Единица = РеализацияСобственнойФирме.Единица;
						ТабПартий.Коэффициент = РеализацияСобственнойФирме.Коэффициент;
						ТабПартий.Цена = РеализацияСобственнойФирме.Цена;
						ТабПартий.Сумма = ?(к = ТабДвижений.КоличествоСтрок(), ОстСумма, 
						РеализацияСобственнойФирме.Сумма * ТабДвижений.Количество/(РеализацияСобственнойФирме.Количество*РеализацияСобственнойФирме.Коэффициент));
						ТабПартий.СуммаНДС = ?(к = ТабДвижений.КоличествоСтрок(), ОстНДС, 
						РеализацияСобственнойФирме.СуммаНДС * ТабДвижений.Количество/(РеализацияСобственнойФирме.Количество*РеализацияСобственнойФирме.Коэффициент));
						ТабПартий.СуммаНП = ?(к = ТабДвижений.КоличествоСтрок(), ОстНП, 
						РеализацияСобственнойФирме.СуммаНП * ТабДвижений.Количество/(РеализацияСобственнойФирме.Количество*РеализацияСобственнойФирме.Коэффициент));
						ТабПартий.СтавкаНДС = РеализацияСобственнойФирме.СтавкаНДС;
						ТабПартий.СтавкаНП = РеализацияСобственнойФирме.СтавкаНП;  
						ТабПартий.ГТД = ТабДвижений.ГТД;
						ТабПартий.СтранаПроисхождения = ТабДвижений.СтранаПроисхождения;
						ТабПартий.Свойство = ТабДвижений.Свойство;
						ОстСумма = ОстСумма - ТабПартий.Сумма;
						ОстНДС 	 = ОстНДС - ТабПартий.СуммаНДС;
						ОстНП 	 = ОстНП - ТабПартий.СуммаНП;
					КонецЦикла;
				Иначе                           
					// Если в таблице движений только одна сторока или меньше можно
					// копировать строку документа реализации без изменений
					ТабПартий.НоваяСтрока();
					ТабПартий.Номенклатура = РеализацияСобственнойФирме.Номенклатура;
					ТабПартий.Количество = РеализацияСобственнойФирме.Количество;                 
					ТабПартий.Единица = РеализацияСобственнойФирме.Единица;
					ТабПартий.Коэффициент = РеализацияСобственнойФирме.Коэффициент;
					ТабПартий.Цена = РеализацияСобственнойФирме.Цена;
					ТабПартий.СтавкаНДС = РеализацияСобственнойФирме.СтавкаНДС;
					ТабПартий.СтавкаНП = РеализацияСобственнойФирме.СтавкаНП;  
					ТабПартий.Сумма = РеализацияСобственнойФирме.Сумма;
					ТабПартий.СуммаНДС = РеализацияСобственнойФирме.СуммаНДС;
					ТабПартий.СуммаНП  = РеализацияСобственнойФирме.СуммаНП;             
					
					// Если строка в таблице движений есть, надо запомнимть ГТД и 
					// страну происхождения для формирования партии
					ТабДвижений.ВыбратьСтроки();
					Пока ТабДвижений.ПолучитьСтроку() = 1 Цикл
						Если ТабДвижений.НомСтроки <> РеализацияСобственнойФирме.НомерСтроки Тогда
							Продолжить;
						КонецЕсли;
						ТабПартий.ГТД = ТабДвижений.ГТД;
						ТабПартий.СтранаПроисхождения = ТабДвижений.СтранаПроисхождения;
						ТабПартий.Свойство = ТабДвижений.Свойство;
					КонецЦикла;
				КонецЕсли;
			КонецЦикла;   
			
			ТабПартий.Свернуть("Номенклатура, Количество, Цена, Единица, Коэффициент, СтавкаНДС, СтавкаНП, ГТД, СтранаПроисхождения, Свойство",
			"Сумма, СуммаНДС, СуммаНП, Партия");
			СпрПартий = СоздатьОбъект("Справочник.Партии");
			ТабПартий.ВыбратьСтроки();
			Пока ТабПартий.ПолучитьСтроку() = 1 Цикл
				Попытка  
					СпрПартий.ИспользоватьВладельца(ТабПартий.Номенклатура);
					СпрПартий.Новый();
					СпрПартий.ГТД = ТабПартий.ГТД;
					СпрПартий.СтранаПроисхождения = ТабПартий.СтранаПроисхождения;
					СпрПартий.Свойство= ТабПартий.Свойство;
					СпрПартий.Записать();
					ТабПартий.Партия = СпрПартий.ТекущийЭлемент();
				Исключение
					Сообщить(ОписаниеОшибки());
					ОтменитьТранзакцию();
					Возврат;
				КонецПопытки;
			КонецЦикла;
			
			ДокПоступление.ЗагрузитьТабличнуюЧасть(ТабПартий);   
			ДокПоступление.Записать();
			
			ДокПоступление.ВыбратьСтроки();  
			ДокПоступление.НомерДокВходящий = РеализацияСобственнойФирме.НомерДок;
			ДокПоступление.ДатаДокВходящий  = РеализацияСобственнойФирме.ДатаДок;
			Пока ДокПоступление.ПолучитьСтроку() = 1 Цикл
				ДокПоступление.ВидТМЦ = Перечисление.ВидыТМЦ.Товар;
			КонецЦикла;
			
			ДокПоступление.Комментарий = "Продажа собственной фирме";
			ДокПоступление.Записать();
			
			ДокПоступление.Провести(1);
			Если ДокПоступление.Проведен() = 0 Тогда
				ОтменитьТранзакцию();
				Возврат;
			КонецЕсли;                
			ЗафиксироватьТранзакцию();
		КонецЕсли;
	КонецЕсли;
Показать

Подскажите как сделать это если простое нажатие по кнопке доукомплектовать ТМЦ со складов собственых фирм не приемлемо.
Может кто-то это чудо делал для себя????
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. vip 13.02.10 15:12 Сейчас в теме
Не нужно загаживать ресурс таким количеством кода.
И так уже загажено.
Неужели искренне считаешь, что кто-то будет расковыривать твою кучу?
3. SeverBaP 5 13.02.10 15:13 Сейчас в теме
думаю нет. Что мне делать?
4. artbear 1568 13.02.10 16:38 Сейчас в теме
Найди того, кто сделает бесплатно или за бабло, если сам не можешь.
5. SeverBaP 5 13.02.10 19:05 Сейчас в теме
Очень оригенально! Спросил как обойти один момент ...
6. SeverBaP 5 14.02.10 16:15 Сейчас в теме
Думаю как-то вот так:
	Если Проведен()=0 Тогда
		Записать();
		ПараметрПроведения=0;
		Если Вопрос("Провести документ?","Да+Нет")="Да" Тогда
			ПодготовитьДанныеДляПроведения(ПараметрПроведения);
		    Если ПараметрПроведения=1 Тогда
				Провести();
				Форма.Закрыть(0);
				СтатусВозврата(0);
				Возврат;
			КонецЕсли;	
		КонецЕсли;
	КонецЕсли;	
Показать
Оставьте свое сообщение

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