Обработка

Тема в разделе "1C и всё что с ней связано", создана пользователем 582324, 30 апр 2012.

  1. 582324

    582324 Гость

    Репутация:
    0
    Добрый день! Помогите пожалуйста его правильно обработать! У меня есть файл выписки в котором данные поделены следующим образом: шапка, раздел д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" Тогда // дошли до последней строки выписки //Выписка.Записать();
    КонецЕсли;
    КонецЦикла;
     
  2. vbs

    vbs Well-Known Member

    Репутация:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Лучше бы фрагмент входного файла привел. Тогда и разобраться будет легко
     
  3. 582324

    582324 Гость

    Репутация:
    0
    Вот фрагмент файла:


    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>
     
  4. vbs

    vbs Well-Known Member

    Репутация:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Тогда, вроде, несложно.
    Ведь я так понял, что надо Amount отнести либо в приход, либо в расход.
    Зацепляемся за строчку, например,
    CreditTurnoverNat - тогда это кредитовый оборот
    DebetTurnoverNat - признак д е б е т а

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

    Дайнеко Well-Known Member

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

    582324 Гость

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

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

    582324 Гость

    Репутация:
    0
    Да вы правильно поняли, но это фрагмент кода из процедуры по загрузки выписки, сам процедура через ИначеЕсли реализует загрузки разных файлов для разных банков, моя задача "привинтить" к этой процедуре еще одну загрузку файла для другого банка.

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

    vbs Well-Known Member

    Репутация:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Если у вас есть решение этого вопроса пожалуйста приведите фрагмент кода как бы вы это реализовали на моем примере... Заранее спасибо!

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

    582324 Гость

    Репутация:
    0
    Идея с флажками не подходит (
     
  10. Дайнеко

    Дайнеко Well-Known Member

    Репутация:
    0
    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Во как!
    Может, в смысле, сама не подходит.

    Хорошо бы объяснить, чем она так не мила.
     
  11. 582324

    582324 Гость

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

    Код:
    ИначеЕсли ВыбБанк="ТорБанк(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 Тогда
    ИтоговаяВыписка.Провести();
    КонецЕсли;
    КонецЕсли;
    ЗафиксироватьТранзакцию();
     
  12. 582324

    582324 Гость

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

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

    vbs Well-Known Member

    Репутация:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Боюсь даже советовать, вдруг идея опять не подойдет ?
    Хотя решение не сложнее колумбова яйца ;)
     
  14. 582324

    582324 Гость

    Репутация:
    0
    Что еще за "яйца" ?

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


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

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