Реализация с дороботкой

SeverBap

Well-known member
18.09.2007
451
0
#1
подскажити (склероз) такая ситуация: есть документ Реализация в процедуре ПриЗаписи() дописал проверку на остатки (если не хватает товара на складе то делаем закупку у собственной фирмы автоматом), как сделать что бы если мы записываем документ реализация другие дополнительные не формировались??? ;)
 

puh14

Well-known member
11.07.2008
1 412
0
#2
СтатусВозврата(0);
Возврат;

после проверки. Она разумеется должна быть до формирования доп документов. А если ты имеешь в виду чтобы никто в это время не формировал другие расходные - то боюсь что в призаписи ты этого никкак не сделаешь.
 

SeverBap

Well-known member
18.09.2007
451
0
#3
Да нет же: хочу автоматом делать приход от другой фирмы недостоющее количество товара.
Это все делатется, но когда мы допустим делаем реализацию и тыкаем просто записать и сохраняем док реализация - у меня создает два дока на недостоющее количество товара... что не хорошо вот как эту ......ь обойти я незнаю. Круг замыкается на том что в обработке проведения другие документы проводить нельзя и в добавок дополнительные внешнии компаненты использовать нельзя! Я незнаю что делать у меня желание кинуть это делать или добрый дяденька поделится какой-нибудь идеей! (да кстати ручной метод формирования не прокатывает! - тоесть пытаемся провести а там количества необходимого нет выбивает ошибку и непроводится, тыкаем на кнопку купить у собственных фирм им не нравится) :maybe:
 

puh14

Well-known member
11.07.2008
1 412
0
#4
Ну раз два дока - значит и вызывается дважды. Код ПриЗаписи с разворотом по процедурам покажи
 

SeverBap

Well-known member
18.09.2007
451
0
#6
puh14 Вообщем там особо ничего нет кроме как
Код:
	Если Проведен()=0 Тогда
ПодготовитьДанныеДляПроведения();
КонецЕсли;
Сама процедура ПодготовитьДанныеДляПроведения():
Код:
Процедура ПодготовитьДанныеДляПроведения()
ВремРегистр=СоздатьОбъект("Регистры");
ТаблицаНедостатков=СоздатьОбъект("ТаблицаЗначений");
ВыгрузитьТабличнуюЧасть(ТаблицаНедостатков);
ОстаткиТМЦ=ВремРегистр.ОстаткиТМЦ;
ТаблицаНедостатков.НоваяКолонка("ЦенаПрод");
ТаблицаНедостатков.ВыбратьСтроки();
Пока ТаблицаНедостатков.ПолучитьСтроку()=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 Тогда
ОтменитьТранзакцию();
Возврат;
КонецЕсли;				
ЗафиксироватьТранзакцию();
КонецЕсли;
КонецЕсли;	
КонецПроцедуры
Так что самое простое это было бы кинуть эту процедуру на кнопку но как они сказали им некогда тыкать по кнопкам!
 

SeverBap

Well-known member
18.09.2007
451
0
#7
Короче исправил:
Код:
	Если Проведен()=0 Тогда
Записать();
ПараметрПроведения=0;
Если Вопрос("Провести документ?","Да+Нет")="Да" Тогда
ПодготовитьДанныеДляПроведения(ПараметрПроведения);
Если ПараметрПроведения=1 Тогда
Провести();
Форма.Закрыть(0);
СтатусВозврата(0);
Возврат;
КонецЕсли;	
КонецЕсли;
КонецЕсли;
Осталось только то что при проведении сумма в документах реализация и поступление стоит почему-то из документа реализация розничная!
 

puh14

Well-known member
11.07.2008
1 412
0
#8
Если я не ошибаюсь, то у тебя всё пляшет от цены. Цена берется из
Если глВернутьЦену(ТекТМЦ, РеализацияСобственнойФирме.ТипЦен, РеализацияСобственнойФирме.ДатаДок, ПЦена, ПЕдиницаЦены, ПВалютаЦены) = 1 Тогда
Главное тут это тип цены и единица измерения
а тип цен у тебя совпадает с реализацией (судя по всему для разных фирм цены хранятся всё равно одни и те же).

РеализацияСобственнойФирме.ТипЦен=ТипЦенРеализации;
вот он у тебя везде цены и соответственно и суммы проставит одни и те-же.
выход - завести отдельный тип цены, и заполнять его (например % от цены реализации).
 

SeverBap

Well-known member
18.09.2007
451
0
#9
все расскумекал, нужно было в некоторых местах указывать РеализацияСобственнойФирме.ТекущийДокумент(), и при начале заполнения доконца сформировать реквизиты шапки:
Код:
			РеализацияСобственнойФирме=Создатьобъект("Документ.Реализация");
РеализацияСобственнойФирме.Новый();	 
РеализацияСобственнойФирме.ДатаДок = ДатаДок;
РеализацияСобственнойФирме.АвтоВремяНачалоДня();
РеализацияСобственнойФирме.Фирма=ОптФирма;
РеализацияСобственнойФирме.Склад=ОптСклад;
РеализацияСобственнойФирме.Автор=глПользователь;
Если ПустоеЗначение(ПравилаПродажФирмам.Проект)=0 Тогда
РеализацияСобственнойФирме.Проект=ПравилаПродажФирмам.Проект;
КонецЕсли;	
РеализацияСобственнойФирме.Контрагент=ПравилаПродажФирмам.КонтрагентПосредн
ик;
Если ПустоеЗначение(ПравилаПродажФирмам.ДоговорПродажи)=1 Тогда
РеализацияСобственнойФирме.Договор=РеализацияСобственнойФирме.Контрагент.Ос
новнойДоговор;
Иначе
РеализацияСобственнойФирме.Договор=ПравилаПродажФирмам.ДоговорПродажи;
КонецЕсли;
РеализацияСобственнойФирме.ТипЦен=ТипЦенРеализации;
РеализацияСобственнойФирме.Валюта=ТипЦенРеализации.Валюта;
РеализацияСобственнойФирме.Курс=глКурсДляВалюты(ТипЦенРеализации.Валюта, РеализацияСобственнойФирме.ДатаДок);
РеализацияСобственнойФирме.УчитыватьНП=ТипЦенРеализации.ЦенаВклНП;
РеализацияСобственнойФирме.УчитыватьНДС=ТипЦенРеализации.ЦенаВклНДС;
РеализацияСобственнойФирме.СуммаВклНП=ТипЦенРеализации.ЦенаВклНП;
РеализацияСобственнойФирме.СуммаВклНДС=ТипЦенРеализации.ЦенаВклНДС;
// уникальные реквизиты шапки
РеализацияСобственнойФирме.КодОперации = глКО.Продажа;
РеализацияСобственнойФирме.ДатаОплаты  = ДатаДок; 
РеализацияСобственнойФирме.ЗагрузитьТабличнуюЧасть(ТаблицаНедостатков);
РеализацияСобственнойФирме.Записать();
впринципе пока работает все!
Скоро будет режим тестирования и после него выложу окончательный вариант! :eek:fftop: