Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
23 ноя 2024, 04:48

Доброе утро!Дайте пожалуйста дельный совет:)

Автор Лейсан, 30 ноя 2011, 09:36

0 Пользователей и 1 гость просматривают эту тему.

Лейсан

Я хочу сделать следующее:у меня есть дбф файл.В этом файле данные документа Счет на оплату покупателю.Из дбф-ки загружаю в табличную часть Товары.Товаров много.мне надо загрузить все.Получается мне надо проходить по дбф до тех пор пока номер документа значение N.Если значение не N,значит все загрузили по данному документу и переходим к следующему.У меня будет цикл в цикле.

вот моя функция загрузки счетов:


Функция загрузитьСчетаНаОплату()
      ДБФ = Новый XBase;
      ДБФ.ОткрытьФайл(ПутьКФайлу);
      ДБФ.Кодировка=КодировкаXBase.OEM;
      //Проверка на наличие записей
   Если ДБФ.КоличествоЗаписей() = 0 Тогда
      Сообщить("Файл данных пуст");
      ДБФ.ЗакрытьФайл();
      //Возврат                    
   КонецЕсли;
              //Переходим на первую строку файла
          
    ДБФ.Первая();
   
    Пока Истина Цикл

    //Запускаем цикл
   //Пока Истина Цикл
   ТекущийНомер=ДБФ.NUMBERD;
    Пока ТекущийНомер Цикл
      //Создадим новый документ
        Док = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
      
      //Заполним реквизиты
      Док.Номер=СокрЛП(ДБФ.NUMBERD);
      Док.Дата = СокрЛП(ДБФ.DATE);
      Док.Организация = Справочники.Организации.НайтиПоНаименованию(СокрЛП(ДБФ.ORG));
      Док.ВалютаДокумента =Справочники.Валюты.НайтиПоНаименованию(СокрЛП(ДБФ.VALD));
      Док.Контрагент=Справочники.Контрагенты.НайтиПоНаименованию(СокрЛП(ДБФ.KONTR));
       Док.СтруктурнаяЕдиница = Справочники.БанковскиеСчета.НайтиПоНаименованию(СокрЛП(ДБФ.NAMEBS));         
      ДоговорКонтрагента=Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
      ДоговорКонтрагента.Владелец = Док.Контрагент.Ссылка;
      ДоговорКонтрагента.Наименование = СокрЛП(ДБФ.NAMED);
       ДоговорКонтрагента.Номер = СокрЛП(ДБФ.NUMBER);
      ДоговорКонтрагента.ВидДоговора = Вычислить("Перечисления.ВидыДоговоровКонтрагентов."+СокрЛП(ДБФ.VID));
      ДоговорКонтрагента.Дата = СокрЛП(ДБФ.DATED);
      ДоговорКонтрагента.ВалютаВзаиморасчетов=Справочники.Валюты.НайтиПоНаименованию(СокрЛП(ДБФ.VAL));
       ДоговорКонтрагента.Организация =Справочники.Организации.НайтиПоНаименованию(СокрЛП(ДБФ.ORG));
      ДоговорКонтрагента.Записать();
      Док.ДоговорКонтрагента=ДоговорКонтрагента.Ссылка;
      Док.КратностьВзаиморасчетов=1;
       Банк= Справочники.Банки.СоздатьЭлемент();
       //Банк.КоррСчет=СокрЛП(ДБФ.KORS);
       //Банк.Код=СокрЛП(ДБФ.BIK);
       Банк.Наименование=СокрЛП(ДБФ.NAMEB);
       Банк.Записать();

      
       БанкСчет=Справочники.БанковскиеСчета.СоздатьЭлемент();
        БанкСчет.Владелец=Справочники.Организации.НайтиПоНаименованию(СокрЛП(ДБФ.ORG));
        БанкСчет.Банк=Справочники.Банки.НайтиПоКоду(ДБФ.BIK);
       БанкСчет.Наименование=СокрЛП(ДБФ.NAMEBS);
       БанкСчет.ВалютаДенежныхСредств=Справочники.Валюты.НайтиПоНаименованию(СокрЛП(ДБФ.VAL));
       //БанкСчет.НомерСчета=СокрЛП(ДБФ.COUNT);
       Банк.Записать();
       БанкСчет.Записать();
      
      //Заполним табличную часть "Товары"
       НоваяСтрока=Док.Товары.Добавить();
       НоваяСтрока.Номенклатура=Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(ДБФ.NOM));
       НоваяСтрока.ЕдиницаИзмерения= Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию(СокрЛП(ДБФ.ED));
         НоваяСтрока.Количество=СокрЛП(ДБФ.KOL);
       НоваяСтрока.Цена=СокрЛП(ДБФ.PRICE);
       НоваяСтрока.СтавкаНДС=СокрЛП(ДБФ.NDS);
       //НоваяСтрока.Записать();
       //НоваяСтрока.Сумма=НоваяСтрока.СуммаБезСкидок;
       //НоваяСтрока.СуммаНДС
       //НоваяСтрока.ЕдиницаИзмерения=Номенклатура.БазоваяЕдиницаИзмерения;
      
       //Заполним табличную часть "Оплачено"
       НоваяОплачено= Док.Оплата.Добавить();
       НоваяОплачено.ДатаОплаты=СокрЛП(ДБФ.DATEO);
       НоваяОплачено.Сумма=СокрЛП(ДБФ.SUM);
       НоваяОплачено.НомерДокумента=СокрЛП(ДБФ.NDOK);
            
       //Заполним табличную часть "Отгружено"
       НоваяОтгружено= Док.Отгрузка.Добавить();
       НоваяОтгружено.ДатаОтгрузки=СокрЛП(ДБФ.DATEOT);
       НоваяОтгружено.Номенклатура=Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(ДБФ.NOM));
       НоваяОтгружено.Количество=СокрЛП(ДБФ.KOL);
       НоваяОтгружено.Цена=СокрЛП(ДБФ.PRICE);
       НоваяОтгружено.Сумма=СокрЛП(ДБФ.SUMOT);
      
   Док.Записать();
   
   Если Не ДБФ.Следующая()Тогда
         Прервать;
      КонецЕсли;
      КонецЦикла;
   КонецЦикла;

has

А где проверка на текущий номер? Он, если я правильно понял, сейчас у Вас должен вобще создавать на каждую строку новый документ.
Вобще лучше все данные загрузить в таблицу значений, а в ней отбор по нужному номеру документа делать, создавать документ и загружать в табличную часть.

Лейсан

да.на каждую строку новый документ.
вот проверка на текущий номер
НомерДок=СокрЛП(ДБФ.NUMBERD);      
Если ТекНомер=НомерДок Тогда
Док.Номер=НомерДок;

sergejK74

Для простоты эксперимента так попробуй
Функция загрузитьСчетаНаОплату()
ДБФ = Новый XBase;
ДБФ.ОткрытьФайл(ПутьКФайлу);
ДБФ.Кодировка=КодировкаXBase.OEM;
//Проверка на наличие записей
Если ДБФ.КоличествоЗаписей() = 0 Тогда
Сообщить("Файл данных пуст");
ДБФ.ЗакрытьФайл();
//Возврат                   
КонецЕсли;
//Переходим на первую строку файла

ДБФ.Первая();
ПредыдущийНомер = 0; //!!!!!!!!!!!!!!!!!

Пока Истина Цикл

//Запускаем цикл
//Пока Истина Цикл
ТекущийНомер=ДБФ.NUMBERD;
//Пока ТекущийНомер Цикл   //!!!!!!!!!!!!!!
Если ТекущийНомер <> ПредыдущийНомер Тогда    //!!!!!!!!!!!!!!!!!!!
//Создадим новый документ

Док = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();

//Заполним реквизиты
Док.Номер=СокрЛП(ДБФ.NUMBERD);
Док.Дата = СокрЛП(ДБФ.DATE);
Док.Организация = Справочники.Организации.НайтиПоНаименованию(СокрЛП(ДБФ.ORG));
Док.ВалютаДокумента =Справочники.Валюты.НайтиПоНаименованию(СокрЛП(ДБФ.VALD));
Док.Контрагент=Справочники.Контрагенты.НайтиПоНаименованию(СокрЛП(ДБФ.KONTR));
Док.СтруктурнаяЕдиница = Справочники.БанковскиеСчета.НайтиПоНаименованию(СокрЛП(ДБФ.NAMEBS));         
ДоговорКонтрагента=Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
ДоговорКонтрагента.Владелец = Док.Контрагент.Ссылка;
ДоговорКонтрагента.Наименование = СокрЛП(ДБФ.NAMED);
ДоговорКонтрагента.Номер = СокрЛП(ДБФ.NUMBER);
ДоговорКонтрагента.ВидДоговора = Вычислить("Перечисления.ВидыДоговоровКонтрагентов."+СокрЛП(ДБФ.VID));
ДоговорКонтрагента.Дата = СокрЛП(ДБФ.DATED);
ДоговорКонтрагента.ВалютаВзаиморасчетов=Справочники.Валюты.НайтиПоНаименованию(СокрЛП(ДБФ.VAL));
ДоговорКонтрагента.Организация =Справочники.Организации.НайтиПоНаименованию(СокрЛП(ДБФ.ORG));
ДоговорКонтрагента.Записать();
Док.ДоговорКонтрагента=ДоговорКонтрагента.Ссылка;
Док.КратностьВзаиморасчетов=1;
Банк= Справочники.Банки.СоздатьЭлемент();
//Банк.КоррСчет=СокрЛП(ДБФ.KORS);
//Банк.Код=СокрЛП(ДБФ.BIK);
Банк.Наименование=СокрЛП(ДБФ.NAMEB);
Банк.Записать();


БанкСчет=Справочники.БанковскиеСчета.СоздатьЭлемент();
БанкСчет.Владелец=Справочники.Организации.НайтиПоНаименованию(СокрЛП(ДБФ.ORG));
БанкСчет.Банк=Справочники.Банки.НайтиПоКоду(ДБФ.BIK);
БанкСчет.Наименование=СокрЛП(ДБФ.NAMEBS);
БанкСчет.ВалютаДенежныхСредств=Справочники.Валюты.НайтиПоНаименованию(СокрЛП(ДБФ.VAL));
//БанкСчет.НомерСчета=СокрЛП(ДБФ.COUNT);
Банк.Записать();
БанкСчет.Записать();
КонецЕсли;   //!!!!!!!!!!!!!!!!!!!!
//Заполним табличную часть "Товары"
НоваяСтрока=Док.Товары.Добавить();
НоваяСтрока.Номенклатура=Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(ДБФ.NOM));
НоваяСтрока.ЕдиницаИзмерения= Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию(СокрЛП(ДБФ.ED));
НоваяСтрока.Количество=СокрЛП(ДБФ.KOL);
НоваяСтрока.Цена=СокрЛП(ДБФ.PRICE);
НоваяСтрока.СтавкаНДС=СокрЛП(ДБФ.NDS);
//НоваяСтрока.Записать();
//НоваяСтрока.Сумма=НоваяСтрока.СуммаБезСкидок;
//НоваяСтрока.СуммаНДС
//НоваяСтрока.ЕдиницаИзмерения=Номенклатура.БазоваяЕдиницаИзмерения;

//Заполним табличную часть "Оплачено"
НоваяОплачено= Док.Оплата.Добавить();
НоваяОплачено.ДатаОплаты=СокрЛП(ДБФ.DATEO);
НоваяОплачено.Сумма=СокрЛП(ДБФ.SUM);
НоваяОплачено.НомерДокумента=СокрЛП(ДБФ.NDOK);

//Заполним табличную часть "Отгружено"
НоваяОтгружено= Док.Отгрузка.Добавить();
НоваяОтгружено.ДатаОтгрузки=СокрЛП(ДБФ.DATEOT);
НоваяОтгружено.Номенклатура=Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(ДБФ.NOM));
НоваяОтгружено.Количество=СокрЛП(ДБФ.KOL);
НоваяОтгружено.Цена=СокрЛП(ДБФ.PRICE);
НоваяОтгружено.Сумма=СокрЛП(ДБФ.SUMOT);

Если (ПредыдущийНомер<>ТекущийНомер) и (ПредыдущийНомер<>0)  тогда  //!!!!!!
Док.Записать();   //!!!!!!!!!!!!!!!!!
КонецЕсли;     //!!!!!!!!!

Если Не ДБФ.Следующая()Тогда
Прервать;
КонецЕсли;
//КонецЦикла; //!!!!!!!!!!!!!
ПредыдущийНомер = ТекущийНомер;  //!!!!!!!!!!!!!
КонецЦикла;
Кнопочка Спасибо - слева!

Лейсан

не корректно получается...предыдущий номер не записывается...записывается только  текущий...

Klyacksa


    ..................
    ДБФ.Первая();
    ПредыдущийНомер = 0;
    Док=Неопределено;

    Пока Истина Цикл
       
        ТекущийНомер=ДБФ.NUMBERD;
        Если ТекущийНомер <> ПредыдущийНомер Тогда   
            // записываем предыдущий документ
            Если Док<>Неопределено тогда
                  Док.Записать();
            КонецЕсли;

            // переходим к следующему
            Док = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
           
            //Заполним реквизиты
            Док.Номер=СокрЛП(ДБФ.NUMBERD);
     .........
        КонецЕсли;     
            //Заполним табличную часть "Товары"
            НоваяСтрока=Док.Товары.Добавить();
            НоваяСтрока.Номенклатура=Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(ДБФ.NOM));
     .........
            НоваяОтгружено.Сумма=СокрЛП(ДБФ.SUMOT);
           
            Если Не ДБФ.Следующая()Тогда
                Прервать;
            КонецЕсли;
        ПредыдущийНомер = ТекущийНомер; 
    КонецЦикла;

    // записываем последний док
    Если Док<>Неопределено тогда
        Док.Записать();
    КонецЕсли;
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Лейсан

 При каждой новой загрузке из дбф файла,необходимо чтобы старые записи обходились,а новые записывались.Я к если добавила условие...но похоже опять где то косяк...

Функция загрузитьСчетаНаОплату()
      ДБФ = Новый XBase;
      ДБФ.ОткрытьФайл(ПутьКФайлу);
      ДБФ.Кодировка=КодировкаXBase.OEM;
      //Проверка на наличие записей
   Если ДБФ.КоличествоЗаписей() = 0 Тогда
      Сообщить("Файл данных пуст");
      ДБФ.ЗакрытьФайл();
      //Возврат                    
   КонецЕсли;
        //Переходим на первую строку файла
      ДокСчет=Документы.СчетНаОплатуПокупателю;    
    ДБФ.Первая();
    ПредыдущийНомер = 0;
   Док=Неопределено;
   
    Пока Истина Цикл

    //Создадим новый документ
         
      ТекущийНомер=ДБФ.NUMBERD;
      Если ТекущийНомер <> ПредыдущийНомер И  ДокСчет.НайтиПоНомеру(ТекущийНомер)=ДокСчет.ПустаяСсылка() Тогда
         
         //записываем предыдущий документ
      Если Док<>Неопределено тогда
         Док.Записать();
      КонецЕсли;   

        //переходим к следующему документу
        Док = ДокСчет.СоздатьДокумент();
      Док.Номер= ТекущийНомер;
      Док.Дата = СокрЛП(ДБФ.DATE);
      Док.Организация = Справочники.Организации.НайтиПоНаименованию(СокрЛП(ДБФ.ORG));
      Док.ВалютаДокумента =Справочники.Валюты.НайтиПоНаименованию(СокрЛП(ДБФ.VALD));
      Док.Контрагент=Справочники.Контрагенты.НайтиПоНаименованию(СокрЛП(ДБФ.KONTR));
       Док.СтруктурнаяЕдиница = Справочники.БанковскиеСчета.НайтиПоНаименованию(СокрЛП(ДБФ.NAMEBS));         
      ДоговорКонтрагента=Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
      ДоговорКонтрагента.Владелец = Док.Контрагент.Ссылка;
      ДоговорКонтрагента.Наименование = СокрЛП(ДБФ.NAMED);
       ДоговорКонтрагента.Номер = СокрЛП(ДБФ.NUMBER);
      ДоговорКонтрагента.ВидДоговора = Вычислить("Перечисления.ВидыДоговоровКонтрагентов."+СокрЛП(ДБФ.VID));
      ДоговорКонтрагента.Дата = СокрЛП(ДБФ.DATED);
      ДоговорКонтрагента.ВалютаВзаиморасчетов=Справочники.Валюты.НайтиПоНаименованию(СокрЛП(ДБФ.VAL));
       ДоговорКонтрагента.Организация =Справочники.Организации.НайтиПоНаименованию(СокрЛП(ДБФ.ORG));
      ДоговорКонтрагента.Записать();
      Док.ДоговорКонтрагента=ДоговорКонтрагента.Ссылка;
      Док.КратностьВзаиморасчетов=1;
       Банк= Справочники.Банки.СоздатьЭлемент();
       //Банк.КоррСчет=СокрЛП(ДБФ.KORS);
       //Банк.Код=СокрЛП(ДБФ.BIK);
       Банк.Наименование=СокрЛП(ДБФ.NAMEB);
       Банк.Записать();

      
       БанкСчет=Справочники.БанковскиеСчета.СоздатьЭлемент();
        БанкСчет.Владелец=Справочники.Организации.НайтиПоНаименованию(СокрЛП(ДБФ.ORG));
        БанкСчет.Банк=Справочники.Банки.НайтиПоКоду(ДБФ.BIK);
       БанкСчет.Наименование=СокрЛП(ДБФ.NAMEBS);
       БанкСчет.ВалютаДенежныхСредств=Справочники.Валюты.НайтиПоНаименованию(СокрЛП(ДБФ.VAL));
       //БанкСчет.НомерСчета=СокрЛП(ДБФ.COUNT);
       Банк.Записать();
       БанкСчет.Записать();
    КонецЕсли;
   //Заполним табличную часть "Товары"

       НоваяСтрока=Док.Товары.Добавить();
       НоваяСтрока.Номенклатура=Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(ДБФ.NOM));
       НоваяСтрока.ЕдиницаИзмерения= Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию(СокрЛП(ДБФ.ED));
         НоваяСтрока.Количество=СокрЛП(ДБФ.KOL);
       НоваяСтрока.Цена=СокрЛП(ДБФ.PRICE);
       НоваяСтрока.СтавкаНДС=СокрЛП(ДБФ.NDS);
      
   //Заполним табличную часть "Оплачено"
       НоваяОплачено= Док.Оплата.Добавить();
       НоваяОплачено.ДатаОплаты=СокрЛП(ДБФ.DATEO);
       НоваяОплачено.Сумма=СокрЛП(ДБФ.SUM);
       НоваяОплачено.НомерДокумента=СокрЛП(ДБФ.NDOK);
            
   //Заполним табличную часть "Отгружено"
       НоваяОтгружено= Док.Отгрузка.Добавить();
       НоваяОтгружено.ДатаОтгрузки=СокрЛП(ДБФ.DATEOT);
       НоваяОтгружено.Номенклатура=Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(ДБФ.NOM));
       НоваяОтгружено.Количество=СокрЛП(ДБФ.KOL);
       НоваяОтгружено.Цена=СокрЛП(ДБФ.PRICE);
       НоваяОтгружено.Сумма=СокрЛП(ДБФ.SUMOT);
      
   Если Не ДБФ.Следующая()Тогда
         Прервать;
      КонецЕсли;
      ПредыдущийНомер = ТекущийНомер;
   КонецЦикла;
   
   //записываем последний док
   Если Док<>Неопределено тогда
      Док.Записать();
   КонецЕсли;   

         
   КонецФункции

Klyacksa

Так что за косяк-то? что не работает?
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Лейсан

вот здесь по идее  Если ТекущийНомер <> ПредыдущийНомер И  ДокСчет.НайтиПоНомеру(ТекущийНомер)=ДокСчет.ПустаяСсылка() Тогда  должен обходиться документ с номером который уже записан..а он пытается заново записаться...

Klyacksa

Если такого документа нет, то записываем предыдущий (который у нас в Док находится), и создаем новый.
А вот если документ с номером ТекущийНомер уже есть, то лучше написать так:
      ТекущийНомер=ДБФ.NUMBERD;
      Если ТекущийНомер <> ПредыдущийНомер Тогда
         
            //записываем предыдущий документ
            Если Док<>Неопределено тогда
                  Док.Записать();
            КонецЕсли;   

            Если ДокСчет.НайтиПоНомеру(ТекущийНомер)=ДокСчет.ПустаяСсылка() тогда
                 //переходим к следующему документу
                 Док = ДокСчет.СоздатьДокумент();
                 Док.Номер= ТекущийНомер;
                 ........ // дальше все, что относится к новому
            иначе
                 Док=ДокСчет.НайтиПоНомеру(ТекущийНомер);
            конецЕсли;
    КонецЕсли;
..... // и далее по тексту

xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск