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

Тема в разделе "1C и всё что с ней связано", создана пользователем SeverBap, 12 фев 2010.

  1. SeverBap

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
    подскажити (склероз) такая ситуация: есть документ Реализация в процедуре ПриЗаписи() дописал проверку на остатки (если не хватает товара на складе то делаем закупку у собственной фирмы автоматом), как сделать что бы если мы записываем документ реализация другие дополнительные не формировались??? ;)
     
  2. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    СтатусВозврата(0);
    Возврат;

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

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
    Да нет же: хочу автоматом делать приход от другой фирмы недостоющее количество товара.
    Это все делатется, но когда мы допустим делаем реализацию и тыкаем просто записать и сохраняем док реализация - у меня создает два дока на недостоющее количество товара... что не хорошо вот как эту ......ь обойти я незнаю. Круг замыкается на том что в обработке проведения другие документы проводить нельзя и в добавок дополнительные внешнии компаненты использовать нельзя! Я незнаю что делать у меня желание кинуть это делать или добрый дяденька поделится какой-нибудь идеей! (да кстати ручной метод формирования не прокатывает! - тоесть пытаемся провести а там количества необходимого нет выбивает ошибку и непроводится, тыкаем на кнопку купить у собственных фирм им не нравится) :maybe:
     
  4. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Ну раз два дока - значит и вызывается дважды. Код ПриЗаписи с разворотом по процедурам покажи
     
  5. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Нельзя ли проверять, что один уже заведен?
     
  6. SeverBap

    SeverBap Well-Known Member

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

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
    Короче исправил:
    Код (Text):
        Если Проведен()=0 Тогда
    Записать();
    ПараметрПроведения=0;
    Если Вопрос("Провести документ?","Да+Нет")="Да" Тогда
    ПодготовитьДанныеДляПроведения(ПараметрПроведения);
    Если ПараметрПроведения=1 Тогда
    Провести();
    Форма.Закрыть(0);
    СтатусВозврата(0);
    Возврат;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    Осталось только то что при проведении сумма в документах реализация и поступление стоит почему-то из документа реализация розничная!
     
  8. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Если я не ошибаюсь, то у тебя всё пляшет от цены. Цена берется из
    Главное тут это тип цены и единица измерения
    а тип цен у тебя совпадает с реализацией (судя по всему для разных фирм цены хранятся всё равно одни и те же).

    вот он у тебя везде цены и соответственно и суммы проставит одни и те-же.
    выход - завести отдельный тип цены, и заполнять его (например % от цены реализации).
     
  9. SeverBap

    SeverBap Well-Known Member

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

Поделиться этой страницей