8.х Ввод документа на основании

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем pashsho, 4 фев 2011.

  1. TopicStarter Overlay
    pashsho
    Offline

    pashsho

    Регистрация:
    21 дек 2010
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Есть обработка загружающая документы РеализацияТоваровИУслуг, надо чтобы на основании создавался документ ПлатежноеТребованиеВыставленное, как реализовать данную задачу, пробовал настроить в конфигурации для ручного ввода на основании с помощью конструктора, суммадокумента берется, а список документов для оплаты незаполняет , соответственно при проведении ругается на несоответствие суммы. В процедуру после создания документа, добавил создание ПлатежноеТребованиеВыставленное, но получается что все реквизиты надо заполнять заново, да еще и ругается что неподходит договор по условиям какого-то отбора. Подскажите как правильно реализовать автоматическое создание требования. Спасибо.

    обработка

    Код:
    Процедура  Загрузить(Файл) 
    
    ЧтениеXML = Новый ЧтениеXML; 
    ЧтениеXML.ОткрытьФайл(Файл); //ПутьКФайлу - Путь к загружаемому XML-документу указан в переменной
    ПостроительDOM = Новый ПостроительDOM; 
    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML); 
    ВыражениеXPath = ДокументDOM.СоздатьВыражениеXPath("/DOCUMENTS/DOC", Новый РазыменовательПространствИменDOM(ДокументDOM)); 
    РезультатXPath = ВыражениеXPath.Вычислить(ДокументDOM); 
    УзелDOM = РезультатXPath.ПолучитьСледующий(); 
    
    Пока УзелDOM <> Неопределено Цикл 
    
    
    
    Для каждого Атрибута из УзелDOM.Атрибуты Цикл 
    //Сообщить(Атрибута.Имя + " = " + Атрибута.Значение); 
    Если Атрибута.Имя = "IDWBILL" Тогда 
    
    НомерДок=Атрибута.Значение;
    
    КонецЕсли;
    
    КонецЦикла; 
    
    Для каждого Узла из УзелDOM.ДочерниеУзлы Цикл 
    //Сообщить(Узла.ИмяУзла); 
    //здесь читаются 
    
    //CREATED = 25-01-2011 08:06:57
    //IDWBILL = 2499786
    
    
    Если Узла.ИмяУзла = "HEAD" Тогда 
    
    Для каждого Атрибута из Узла.Атрибуты Цикл 
    //Сообщить(Атрибута.Имя + " = " + Атрибута.Значение); 
    //здесь читаются
    //BUHG = Кошелева И.И.
    //DOVEREN = 
    //KTO = Кузьмичева
    //OTPUSK = Ключевская Л.В.
    //POST = 98004
    //SHIFTMAN = Иноземцев А.П.
    //SKLAD = 04070
    //SKLAD_POST = 98004
    //TRANSPORT = 3873СТ63
    //TTN = 
    //WAYBILL_DATE = 25-01-2011
    //WAYBILL_NUM = 10058
    Если Атрибута.Имя = "WAYBILL_DATE" Тогда
    ДатаДок=Атрибута.Значение;
    ИначеЕсли Атрибута.Имя = "SKLAD" Тогда
    СкладВаза=Сред(Атрибута.Значение,0,2);
    Если СкладВаза="04"  Тогда
    //Скп
    КодКонтрагентаВаза="050000623";
    ИначеЕсли СкладВаза="29" Тогда
    //ГЦЗЧ
    КодКонтрагентаВаза="400000525";
    
    ИначеЕсли СкладВаза="39" Тогда
    //ОПП
    КодКонтрагентаВаза="400000526";
    
    КонецЕсли;
    ИначеЕсли Атрибута.Имя="WAYBILL_NUM" Тогда
    
    Номер=СокрЛП(Атрибута.Значение);
    Склад=Сред(Номер,0,1);
    ПризнакУдаления=Сред(Номер,7);
    
    
    ИщемДок = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Номер,(СтрЗаменить(ДатаДок, "-", "."))+" 0:00:00");
    
    Если ИщемДок = Документы.РеализацияТоваровУслуг.ПустаяСсылка() Тогда
    Документ = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    Дата = СтрЗаменить(ДатаДок, "-", ".");
    Документ.Дата = Дата+" 0:00:00";
    Документ.Номер = Номер;
    Сообщить("------ Загружается документ:" + Документ + "------" );
    Документ.ОтражатьВНалоговомУчете = Истина;
    Документ.ВидОперации=Перечисления.ВидыОперацийРеализацияТоваров.ПродажаКомиссия;
    Документ.Организация=Справочники.Организации.НайтиПоКоду("000000001");
    Документ.ТипЦен=Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("АВТОВАЗ");
    Документ.УчитыватьНДС = Истина;
    Документ.КурсВзаиморасчетов=1;
    Документ.Контрагент=Справочники.Контрагенты.НайтиПоКоду(КодКонтрагентаВаза);
    Документ.ДоговорКонтрагента=Справочники.Контрагенты.НайтиПоКоду(КодКонтрагентаВаза).ОсновнойДоговорКонтрагента;
    Документ.СчетУчетаРасчетовСКонтрагентом=ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01");
    Документ.СчетУчетаРасчетовПоАвансам=ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.02");
    Документ.ВалютаДокумента=Справочники.Валюты.НайтиПоКоду("643");
    Если Склад="1" Тогда
    // 1 Иноземцев 000000006
    Документ.Склад=Справочники.Склады.НайтиПоКоду("000000006");
    ИначеЕсли Склад="2" Тогда
    // 2 Прохоров    000000022 
    Документ.Склад=Справочники.Склады.НайтиПоКоду("00000022");
    Иначе     //3 Сухов 000000029
    Документ.Склад=Справочники.Склады.НайтиПоКоду("000000029");
    
    КонецЕсли;
    Документ.Ответственный=Справочники.Пользователи.НайтиПоНаименованию("Жилина Ирина Ивановна");
    Документ.Грузоотправитель=Справочники.Контрагенты.НайтиПоКоду("000000001");
    Документ.Грузополучатель=Справочники.Контрагенты.НайтиПоКоду(КодКонтрагентаВаза);
    Документ.Комментарий=НомерДок;
    
    
    //Если
    //ПризнакУдаления="УДАЛЕНО"
    //Тогда
    //КонецЕсли;
    //Возврат;
    Иначе
    Документ = ИщемДок.ПолучитьОбъект();
    
    Сообщить("Документ ---" + Документ + " --- уже существует");
    
    КонецЕсли;
    
    
    КонецЕсли;
    //WITHLABELS = 1
    
    КонецЦикла; 
    
    Для каждого ДочернегоУзла из Узла.ПервыйДочерний.ДочерниеУзлы Цикл 
    //Сообщить(ДочернегоУзла.ИмяУзла + " = " + ДочернегоУзла.ТекстовоеСодержимое); 
    //Здесь читаются
    //NCTRT = 176068
    //DCTRT = 13-11-2010
    //SPFC_MONTH = 1
    
    КонецЦикла; 
    
    ИначеЕсли Узла.ИмяУзла = "BODY" Тогда
    Если ИщемДок = Документы.РеализацияТоваровУслуг.ПустаяСсылка() Тогда
    
    Если Документ.Товары.Количество() > 0 Тогда
    Документ.Товары.Очистить();
    КонецЕсли;
    
    
    Для каждого ДочернегоУзла из Узла.ДочерниеУзлы Цикл 
    Строка = Документ.Товары.Добавить();
    
    Для каждого Атрибута из ДочернегоУзла.Атрибуты Цикл 
    //Сообщить(Атрибута.Имя + " = " + Атрибута.Значение); 
    
    //EI = 13
    //IDSPFC = 13668381
    //NAME = СОЕД-ЛЬ ПАНЕЛЕЙ ВЕРХНИЙ ЛЕВЫЙ
    //NDET = 11180620124100
    //PRICE = 12.42
    //QUANTITY = 1350.00
    
    
    Если Атрибута.Имя = "NAME" Тогда
    
    НаименованиеДетали = Атрибута.Значение;
    
    ИначеЕсли  Атрибута.Имя = "NDET" Тогда
    НомерДетали  = Атрибута.Значение;
    
    ИначеЕсли Атрибута.Имя = "PRICE" Тогда
    Строка.Цена =  Атрибута.Значение;
    
    ИначеЕсли  Атрибута.Имя = "QUANTITY" Тогда
    Строка.Количество = Атрибута.Значение;
    
    
    
    
    Строка.Номенклатура = ВыгрузитьТовар(НомерДетали,НаименованиеДетали);
    
    
    ОбработкаТабличныхЧастей.ПриИзмененииНоменклатурыТабЧасти(Строка, Документ);
    ОбработкаТабличныхЧастей.ЗаполнитьНомерГТДИСтрануПроисхождения(Строка, Ложь, Документ.Организация, Документ.Дата);
    Документ.ЗаполнитьСчетаУчетаВСтрокеТабЧасти(Строка, "Товары", Истина, Документ.ОтражатьВНалоговомУчете);
    // Рассчитываем реквизиты табличной части.
    СчетБУ = Строка.СчетДоходовБУ;
    СчетНУ = Строка.СчетДоходовНУ;
    ОбработкаТабличныхЧастей.ЗаполнитьСтавкуНДСТабЧасти(Строка,Документ);
    ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка, Документ);
    ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(Строка, Документ);
    
    
    КонецЕсли;
    
    КонецЦикла; 
    
    
    КонецЦикла; 
    
    КонецЕсли; 
    
    КонецЕсли;     
    
    КонецЦикла; 
    
    
    УзелDOM = РезультатXPath.ПолучитьСледующий(); 
    
    
    
    Если ПризнакУдаления="УДАЛЕНО"  Тогда
    Сообщить("Документ ---" + Номер + " --- является удаленным! Пропущен!");
    
    Иначе
    
    Попытка
    
    
    
    Документ.Записать(РежимЗаписиДокумента.Проведение);
    // Документ.Записать();
    
    Исключение
    Сообщить("Невозможно провести документ.");
    КонецПопытки;
    
    ДокументНаОсновании=Документы.ПлатежноеТребованиеВыставленное.СоздатьДокумент();
    
    ДокументНаОсновании.Организация=Справочники.Организации.НайтиПоКоду("000000001");
    ДокументНаОсновании.ОтражатьВНалоговомУчете=Истина;
    ДокументНаОсновании.ДоговорКонтрагента=Справочники.Контрагенты.НайтиПоКоду(КодКонтрагентаВаза).ОсновнойДоговорКонтрагента;
    ДокументНаОсновании.СчетУчетаРасчетовСКонтрагентом=ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01");
    ДокументНаОсновании.СчетУчетаРасчетовПоАвансам=ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.02");
    ДокументНаОсновании.Номер = Номер;
    ДокументНаОсновании.Контрагент=Справочники.Контрагенты.НайтиПоКоду(КодКонтрагентаВаза);
    ДокументНаОсновании.Дата = Документ.Дата;
    ДокументНаОсновании.СуммаДокумента = Документ.СуммаДокумента;
    ДокументНаОсновании.СчетБанк=ПланыСчетов.Хозрасчетный.НайтиПоКоду("51");
    ДокументНаОсновании.СчетОрганизации=Справочники.Организации.НайтиПоКоду("000000001").ОсновнойБанковскийСчет;
    ДокументНаОсновании.СчетКонтрагента=Справочники.Контрагенты.НайтиПоКоду(КодКонтрагентаВаза).ОсновнойБанковскийСчет;
    
    Попытка
    ДокументНаОсновании.Записать(РежимЗаписиДокумента.Проведение);
    
    // Документ.Записать();
    
    Исключение
    Сообщить("Невозможно провести документ платежное требование выставленное.");
    КонецПопытки;
    
    КонецЕсли;
    
    КонецЦикла;
    Сообщить("--- Операция завершена ---");
    КонецПроцедуры
    
    
    
    
    
  2. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    В типовых у документа ПлатежноеТребованиеВыставленное есть реквизит ДокументОснование. А Вы его тут не заполняете.
  3. TopicStarter Overlay
    pashsho
    Offline

    pashsho

    Регистрация:
    21 дек 2010
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Код:
    Документ.Записать(РежимЗаписиДокумента.Проведение); 
    // Документ.Записать(); 
    
    Исключение 
    Сообщить("Невозможно провести документ."); 
    КонецПопытки; 
    Если ИщемДок = Документы.РеализацияТоваровУслуг.ПустаяСсылка() Тогда    
    ДокументНаОсновании=Документы.ПлатежноеТребованиеВыставленное.СоздатьДокумент(); 
    ДокументНаОсновании.Дата=Документ.Дата; 
    ДокументНаОсновании.Номер=Документ.Номер; 
    ДокументНаОсновании.Заполнить(Документ.Ссылка); 
    ДокументНаОсновании.Записать(); 
    ДокументНаОсновании.ПолучитьФорму().Открыть(); 
    
    Иначе             
    
    КонецЕсли; 
    



    Но договор так и неберет, пишет "У контрагента нет договоров соответсвующих условиям выбора. Добавьте новый договор" , при ручном вводе на основании, таких проблем нет. Как быть?

    При попытке добавить выдает:

    {Справочник.ДоговорыКонтрагентов.Форма.ФормаЭлемента(285)}: Индекс находится за границами массива
    ВидДоговора = СписокПеречисления[0].Значение;
  4. TopicStarter Overlay
    pashsho
    Offline

    pashsho

    Регистрация:
    21 дек 2010
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    в документ платежное требование с помощью констрктора добавлено

    Код:
    Процедура ОбработкаЗаполнения(Основание)
    //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    Если ТипЗнч(Основание) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
    // Заполнение шапки
    ВалютаДокумента = Основание.ВалютаДокумента;
    ВидОперации = Основание.ВидОперации;
    Комментарий = Основание.Комментарий;
    Контрагент = Основание.Контрагент;
    СчетКонтрагента = Основание.Контрагент.ОсновнойБанковскийСчет;
    ДоговорКонтрагента = Основание.Контрагент.ОсновнойДоговорКонтрагента;
    Организация = Основание.Организация;
    СчетОрганизации = Основание.Организация.ОсновнойБанковскийСчет;
    Ответственный = Основание.Ответственный;
    ОтражатьВНалоговомУчете = Основание.ОтражатьВНалоговомУчете;
    РучнаяКорректировка = Основание.РучнаяКорректировка;
    СуммаДокумента = Основание.СуммаДокумента;
    СчетУчетаРасчетовПоАвансам = Основание.СчетУчетаРасчетовПоАвансам;
    СчетУчетаРасчетовСКонтрагентом = Основание.СчетУчетаРасчетовСКонтрагентом;
    СчетБанк = Основание.СчетУчетаРасчетовСКонтрагентом;
    КонецЕсли;
    //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
    КонецПроцедуры
    
    

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