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

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

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

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

Лейсан

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

    //Создадим новый документ
         
      ТекущийНомер=ДБФ.NUMBERD;
     Дата=ДБФ.DATE;
      Если ТекущийНомер <> ПредыдущийНомер  Тогда
         
         //записываем предыдущий документ
      Если Док<>Неопределено тогда
         Док.Записать();
      КонецЕсли;   
     
    Если ДокСчет.НайтиПоНомеру(ТекущийНомер,Дата)=ДокСчет.ПустаяСсылка() тогда
        //переходим к следующему документу
      Док = ДокСчет.СоздатьДокумент();
      Док.Номер= СокрЛП(ДБФ.NUMBERD);
      Док.Дата = Дата;
      Док.Организация = Справочники.Организации.НайтиПоНаименованию(СокрЛП(ДБФ.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

Так правильно, потому что у Вас в алгоритме  если новый док, то он заполняется, а если найденный - то добавляются строки, которые в файле. Если хотите не дублировать - значит если попадаем в старый файл, нужно перед добавлением строки смотреть - была ли уже такая строка или нет. Но тут встает вопрос - что делать со старыми строками? Если в доке есть строка, которой нет в файле, ее нужно убрать? а если наоборот? есть строка в файле, а в доке нет? тогда добавить? а если в доке две строки по 1 шт товара, а в файле одна строка, и количество - 2 шт? тогда что?
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

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

Лейсан

Если в файле дбф появляются новые строки,их пишем,если уже такие строки есть,не пишем..

Klyacksa

Что значит "Такие строки"? по чем соответствие? Далее пример для поиска соответствия только по Номенклатуре, и если такая же строка по Номенклатуре найдена, то она перезаполняется данными файла, если не найдена - добавляется новая. То есть, если в доке в строке количество=5, а в файле=3, то новое значение будет 3.

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

      НовыйДокумент=Истина;

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

       НоваяСтрока.ЕдиницаИзмерения= Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию(СокрЛП(ДБФ.ED));
       НоваяСтрока.Количество=СокрЛП(ДБФ.KOL);
       НоваяСтрока.Цена=СокрЛП(ДБФ.PRICE);
       НоваяСтрока.СтавкаНДС=СокрЛП(ДБФ.NDS);
       
   //Заполним табличную часть "Оплачено"
       НоваяОплачено= Док.Оплата.Добавить();
 
       ................
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

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

Теги:

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

Рейтинг@Mail.ru

Поиск