Обработка

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

  1. 582324

    582324 Гость

    Добрый день! Помогите пожалуйста его правильно обработать! У меня есть файл выписки в котором данные поделены следующим образом: шапка, раздел д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

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

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

    vbs Well-Known Member

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

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

    Дайнеко Well-Known Member
    1C Team

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

    582324 Гость

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

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

    582324 Гость

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

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

    vbs Well-Known Member

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

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

    582324 Гость

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

    Дайнеко Well-Known Member
    1C Team

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

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

    582324 Гость

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

    Код ( (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 Гость

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

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

    vbs Well-Known Member

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

    582324 Гость

    Что еще за "яйца" ?

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


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

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