Обработка

  • Автор темы 582324
  • Дата начала
5

582324

Добрый день! Помогите пожалуйста его правильно обработать! У меня есть файл выписки в котором данные поделены следующим образом: шапка, раздел дeбeтa и кредита. Сложность с обработкой дeбeтa и кредита так как они в файле используют одно и тоже поле "Amount", которое в первой части файла содержит информацию о дeбeтoвых операциях, а во второй части о кредитовых операциях.

Вот что у меня пока получилось (фрагмент кода):....

Код:
КоличествоДокументовНаТранзакцию=Константа.КоличествоДокументовНаТранзакцию;
Для Ном = НомСтр По Текст.КоличествоСтрок() Цикл

Стр = Текст.ПолучитьСтроку(Ном); 
Статус("Обработано... "+Окр(Ном/Текст.КоличествоСтрок()*100,2)+"%");

//***накопление информации о платежном документа***//
//Сред(Стр,2,14) = "DebetDocuments"
//Сред(Стр,2,15) = "CreditDocuments"
Если Сред(Стр,2,6) = "OpDate" Тогда	// дата документа
ДатДок=Дата(Сред(Стр,9,10));
ИначеЕсли Сред(Стр,2,14) = "DocumentNumber" Тогда // номер документа 
НомДок=Число(Сред(Стр,16));
ИначеЕсли Сред(Стр,2,8) = "OperType" Тогда // операции 
НомОпер=Сред(Стр,12,СтрДлина(Стр)-12);
ИначеЕсли Сред(Стр,2,3) = "UNN" Тогда // УНН контрагента 
УНН=Сред(Стр,6,9);
ИначеЕсли Сред(Стр,2,7) = "NameBIC" Тогда // Наименование корреспондента 
НаимКонтр=Сред(Стр,10,СтрДлина(Стр)-10);
ИначеЕсли Сред(Стр,2,6) = "Ground" Тогда
НазнПлат="";
ИначеЕсли Сред(Стр,2,3) = "BIC" Тогда // Код банка 
КодБанка=Сред(Стр,12,3); 
ИначеЕсли Сред(Стр,2,3) = "Account" Тогда // Расчетный счет 
РасчСчет=Сред(Стр,10,13); // Расчетный счет
//ИначеЕсли Сред(Стр,2,6) = "Amount=" Тогда // Списано со счета 
//	Расход=Число(Сред(Стр,8));
//ИначеЕсли Сред(Стр,2,6) = "Amount=" Тогда // поступило на счет 
//	Приход=Число(Сред(Стр,8));
ВводСтроки(ДатДок,НомДок,НомОпер,УНН,НаимКонтр,НазнПлат,КодБанка,РасчСчет,Расход,Приход
,НазнПлат);

Если Счетчик=КоличествоДокументовНаТранзакцию Тогда
Если ИтоговаяВыписка.Выбран()=1 Тогда
ИтоговаяВыписка.Записать();
Если ИтоговаяВыписка.РСчет.НеВыполнятьКонтроль=1 Тогда
ИтоговаяВыписка.Провести();
КонецЕсли;
КонецЕсли;
ЗафиксироватьТранзакцию();	  
НачатьТранзакцию(); 
Счетчик=1;
КонецЕсли;	

КонецЕсли;

Если Лев(Стр,1)="/Statements" Тогда // дошли до последней строки выписки //Выписка.Записать();
КонецЕсли;
КонецЦикла;
 
V

vbs

Лучше бы фрагмент входного файла привел. Тогда и разобраться будет легко
 
5

582324

Вот фрагмент файла:


PHP:
- <Statements>
<Type>ВЫПИСКА</Type> 
<UNN>500133956</UNN> 
- <Statement>
<Account>30115896678014</Account> 
<Date>25.04.12</Date> 
<Time>21:57:06</Time> 
<Name>"Рога и Копыта" ПРЕДСТАВИТЕЛЬСТВО</Name> 
<BIC>153004989</BIC> 
<CurrCode>954</CurrCode> 
<CurrCodeISO>BYR</CurrCodeISO> 
<OpeningBalance>500000000</OpeningBalance> 
<OpeningBalanceNat>500000000</OpeningBalanceNat> 
<DatePrevious>20.04.2012</DatePrevious> 
<ClosingBalance>214860418</ClosingBalance> 
<ClosingBalanceNat>214860418</ClosingBalanceNat> 
<DateClosing>25.04.2012</DateClosing> 
- <DebetDocuments>
<DocumentsNet>3</DocumentsNet> 
<Turnover>167415828</Turnover> 
<DebetTurnoverNat>169325828</DebetTurnoverNat> 
- <Document>
<DocumentNumber>1407</DocumentNumber> 
<DocumentType>1</DocumentType> 
<OpDate>25.04.2012</OpDate> 
<Time>12:30:05</Time> 
<OperType>01</OperType> 
<Amount>168372200</Amount> 
<AmountNat>168372200</AmountNat> 
- <Beneficiar>
<Account>3011748746013</Account> 
<BIC>153001739</BIC> 
<UNN>100122521</UNN> 
<NameBIC>ОАО 'БАНК' Г.МИНСК</NameBIC> 
<Name>Рога и Копыта Г. МИНСК</Name> 
<Ground>САЛЬДО СУБСЧЕТА СОГЛАСНО ПРИКАЗАРога и Копыта 111 ОТ 14.04.2011Г.</Ground> 
</Beneficiar>
</Document>

<CreditDocuments>
<DocumentsNet>323</DocumentsNet> 
<Turnover>2158122246</Turnover> 
<CreditTurnoverNat>2158122246</CreditTurnoverNat> 
- <Document>
<DocumentNumber>325</DocumentNumber> 
<DocumentType>1</DocumentType> 
<OpDate>25.04.2012</OpDate> 
<Time>09:21:10</Time> 
<OperType>01</OperType> 
<Amount>171000</Amount> 
<AmountNat>171000</AmountNat> 
- <Payer>
<Account>3012600001115</Account> 
<BIC>153111742</BIC>
<UNN>511568851</UNN> 
<UNN3 /> 
<NameBIC>ОАО 'ПРОМБАНК' Г.МИНСК</NameBIC> 
<Name>ГТЧУП "ФОРТ-2"</Name> 
<Ground>НА ПРОИЗВОДСТВЕ И ПРОФЗАБОЛЕВАНИЙ С З/ПЛАТЫ ЗА 1-УЮ ПОЛ. АПРЕЛЯ 2012Г .</Ground> 
</Payer>
</Document>
 
V

vbs

Тогда, вроде, несложно.
Ведь я так понял, что надо Amount отнести либо в приход, либо в расход.
Зацепляемся за строчку, например,
CreditTurnoverNat - тогда это кредитовый оборот
DebetTurnoverNat - признак д е б е т а

PS. А этих изобрететелей псевдоанглийских терминов - к стенке. Д е б е т по-английски пишется debit
 
Д

Дайнеко

* По содержанию, это XML-файл (как бы он не обзывался). Красиво было бы читать его соответствующими средствами. Но для скорого решения можно и как текст.
* Совсем зря приплели тразакцию. В чем такая острая нужда?
* А проводить зачем? Почти всегда документ требует проверки и корректировки.
* Фрагмент мутноватый:
Если ИтоговаяВыписка.Выбран()=1 Тогда
ИтоговаяВыписка.Записать();
Если ИтоговаяВыписка.РСчет.НеВыполнятьКонтроль=1 Тогда
ИтоговаяВыписка.Провести();
КонецЕсли;
КонецЕсли;
Может наоборот: Если НЕ Выбран(), Записать?
* Судя по всему, это - обработка. Создает документ и записывает. Да еще и много доков за один прием. Может лучше сделать ее процедурой в документе "Итоговая выписка". А на форме кнопку "Импорт".
* В конце о конце. Зачем ловить эту концовку Лев(Стр,1)="/Statements" ? Достаточно просто окончания файла. Только провоцировать лишнюю ошибку, что Вы и сделали - условие неправильное.
 
5

582324

Ведь я так понял, что надо Amount отнести либо в приход, либо в расход.
Зацепляемся за строчку, например,
CreditTurnoverNat - тогда это кредитовый оборот
DebetTurnoverNat - признак д е б е т а
Да вы правильно поняли, но поля "CreditTurnoverNat и DebetTurnoverNat" содержат итоговые суммы по д е б е т у и кредиту, эти поля показывают итоги из полей "Amount" в соответствующих разделах "DebetDocuments и CreditDocuments". А мне необходимо получать суммы из полей "Amount" и определять если оно относится к д е б е т у то тогда это (Расход), а если к кредиту то (Приход).

Если у вас есть решение этого вопроса пожалуйста приведите фрагмент кода как бы вы это реализовали на моем примере... Заранее спасибо!
 
5

582324

* Судя по всему, это - обработка. Создает документ и записывает. Да еще и много доков за один прием. Может лучше сделать ее процедурой в документе "Итоговая выписка". А на форме кнопку "Импорт".
* В конце о конце. Зачем ловить эту концовку Лев(Стр,1)="/Statements" ? Достаточно просто окончания файла. Только провоцировать лишнюю ошибку, что Вы и сделали - условие неправильное.
Да вы правильно поняли, но это фрагмент кода из процедуры по загрузки выписки, сам процедура через ИначеЕсли реализует загрузки разных файлов для разных банков, моя задача "привинтить" к этой процедуре еще одну загрузку файла для другого банка.

А конец и в правду не нужно ловить - спасибо за подсказку.
 
V

vbs

Если у вас есть решение этого вопроса пожалуйста приведите фрагмент кода как бы вы это реализовали на моем примере... Заранее спасибо!

Да что тут сложного ? Заводишь два флажка "ПризнакД е б е т а" и "Признак кредита". Ими и оперируешь.
Первый флажок = 1 значит, приход, обработал, сбросил в 0, ну и т.п.
 
5

582324

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

Код:
ИначеЕсли ВыбБанк="ТорБанк(UNN3)" Тогда	
//***Загрузка для ОАО "БелПромСтройБанк(UNN3)***// 
Пропустить=0; // пропустить загрузку выписки

//***Получить заголовок выписки***//

НомСтр=1;
Для Ном = 1 По Текст.КоличествоСтрок() Цикл 
НомСтр=Ном;
Стр = Текст.ПолучитьСтроку(Ном); 
Статус("Обработано... "+Окр(Ном/Текст.КоличествоСтрок()*100,2)+"%");

//***накопление информации о выписке***//

Если Сред(Стр,2,5)="Date>" Тогда	 // дата выписки 
ДатаВыписки=Дата(Сред(Стр,7,8));
Продолжить;
КонецЕсли;		  
Если Сред(Стр,2,7)="Account" Тогда // рассчетный счет
СчетКлиента=Сред(Стр,10,13);
Продолжить;
КонецЕсли;		  
Если Сред(Стр,2,17)="ClosingBalanceNat" Тогда // входящий остаток
ВхОстаток =Число(Сред(Стр,20)); 
Если ВыпискаВводилась(ДатаВыписки,СчетКлиента)=1 Тогда 
// был отказ от загрузки 
Пропустить=1;
Возврат;
КонецЕсли;
Прервать;
КонецЕсли;		  
КонецЦикла;

//***Продолжить загрузку***

НачатьТранзакцию(); 
Счетчик=0;
КоличествоДокументовНаТранзакцию=Константа.КоличествоДокументовНаТранзакцию;
Для Ном = НомСтр По Текст.КоличествоСтрок() Цикл

Стр = Текст.ПолучитьСтроку(Ном); 
Статус("Обработано... "+Окр(Ном/Текст.КоличествоСтрок()*100,2)+"%");	 

//***накопление информации о платежном документа***//

Признак=0; //0 это расход (д*цензура*), а 1 приход (кредит)
Если Сред(Стр,2,14) = "DebetDocuments" Тогда
Признак =0; 
ИначеЕсли Сред(Стр,2,15) = "CreditDocuments" Тогда
Признак =1; 
ИначеЕсли Сред(Стр,2,14) = "DocumentNumber" Тогда // номер документа 
НомДок=Число(Сред(Стр,17));
ИначеЕсли Сред(Стр,2,6) = "OpDate" Тогда	// дата документа
ДатДок=Дата(Сред(Стр,9,10));
ИначеЕсли Сред(Стр,2,8) = "OperType" Тогда // операция 
НомОпер="";
ИначеЕсли Сред(Стр,2,3) = "BIC" Тогда // код банка 
КодБанка=Сред(Стр,12,3); 
ИначеЕсли Сред(Стр,2,3) = "UNN" Тогда // УНН контрагента
УНН=Сред(Стр,6,9);
ИначеЕсли Сред(Стр,2,4) = "UNN3" Тогда // УНН3 контрагента за которого производится оплата 
РегистрационныйНомер=Сред(Стр,6,9);
ИначеЕсли Сред(Стр,2,7) = "NameBIC" Тогда // наименование корреспондента 
НаимКонтр=Сред(Стр,10,СтрДлина(Стр)-10);
ИначеЕсли Сред(Стр,2,6) = "Ground" Тогда // назначение платежа
НазнПлат=Сред(Стр,9,СтрДлина(Стр)-9);
ИначеЕсли Сред(Стр,2,3) = "Account" Тогда // расчетный счет 
РасчСчет=Сред(Стр,10,13);
ИначеЕсли Сред(Стр,2,9) = "AmountNat" Тогда //Расход или Приход в зависимости от выбранного признака (0 или 1)
Если Признак=0 Тогда // списано со счета 
Расход=Число(Сред(Стр,12,СтрДлина(Стр)-12));
Приход=0;
ИначеЕсли Признак=1 Тогда // поступление на счет
Пиход=Число(Сред(Стр,12,СтрДлина(Стр)-12));
Расход=0;
КонецЕсли;					
КонецЕсли;
Если Сред(Стр,2,9) = "/Document" Тогда //обозначение конца одной строки
КонецЕсли;
ВводСтроки(ДатДок,НомДок,НомОпер,УНН,НаимКонтр,НазнПлат,КодБанка,РасчСчет,Расход
,Приход,НазнПлат); //ввод строки в 1С

Если Счетчик=КоличествоДокументовНаТранзакцию Тогда
Если ИтоговаяВыписка.Выбран()=1 Тогда
ИтоговаяВыписка.Записать();
Если ИтоговаяВыписка.РСчет.НеВыполнятьКонтроль=1 Тогда
ИтоговаяВыписка.Провести();
КонецЕсли;
КонецЕсли;
ЗафиксироватьТранзакцию();	  
НачатьТранзакцию(); 
Счетчик=1;
КонецЕсли;	
КонецЦикла;
Если ИтоговаяВыписка.Выбран()=1 Тогда
ИтоговаяВыписка.Записать();
Если ИтоговаяВыписка.РСчет.НеВыполнятьКонтроль=1 Тогда
ИтоговаяВыписка.Провести();
КонецЕсли;
КонецЕсли;
ЗафиксироватьТранзакцию();
 
5

582324

Теперь у меня вопрос как лучше реализовать следующую идею: Если указан "UNN3" (УНН3 контрагента за которого производится оплата) тогда необходимое найти его в контрагентах и провести оплату по нему, если "UNN3" отсутствует то произвести оплату по контрагенту с "UNN" указанным в документе

Если есть идеи то лучше сразу с фрагментом кода... Спасибо заранее!
 
V

vbs

Боюсь даже советовать, вдруг идея опять не подойдет ?
Хотя решение не сложнее колумбова яйца ;)
 
5

582324

Боюсь даже советовать, вдруг идея опять не подойдет ?
Хотя решение не сложнее колумбова яйца :p
Что еще за "яйца" ?

можно фрагмент кода... ;)


Добавлено: Загуглил "колумбова яйца" - синоним "простой выход из затруднительной ситуации". А теперь если можно покажите решение этого вопроса :D
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!