Обработка

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

  1. 582324

    582324 Гость

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

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

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

    Стр = Текст.ПолучитьСтроку(Ном);
    Статус("Обработано... "+Окр(Ном/Текст.КоличествоСтрок()*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
    1C Team

    Репутация:
    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
    1C Team

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

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

    582324 Гость

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

    Код ( (Unknown Language)):
    ИначеЕсли ВыбБанк="ТорБанк(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
     
Загрузка...

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