Модераторы: stron
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация Excel.Application в 1С 7.7, загрузка файла dbf с длинным именем 
:(
    Опции темы
SubZero
Дата 19.3.2010, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.6.2008

Репутация: нет
Всего: нет



На диске в различных каталогах находятся файлы dbf с длиной имени порядка 12-14 символов. Если длина имени не превышает 8 символов- файлы открываются нормально, если же больше - программа вылетает с ошибкой "Перед выполнением операции нужно открыть базу!" на строчках
    ДБФ.Первая(); 
и  Пока ДБФ.ВКонце() = 0 Цикл

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


Первоначальная версия процедур:
Код

Процедура ВыборФайла()
    
    КаталогЗагрузки = ""; 
    ФайлЗагрузки = "";
    Если ФС.ВыбратьФайл(1, ФайлЗагрузки, КаталогЗагрузки, "Выберите файл", "*.dbf|*.dbf", , ) = 1 Тогда
        ФайлЗагрузки = КаталогЗагрузки + ФайлЗагрузки;
    КонецЕсли;
    
КонецПроцедуры    

Процедура ПриВыбореИмениФайла()
    Поз=Найти(ФайлЗагрузки,".");
    Если (Поз=0) Или (Поз>8) Тогда
        ФайлЗагрузки=СокрП(Лев(СокрЛ(ФайлЗагрузки),12))+".DBF";
    Иначе    
        ФайлЗагрузки=СокрЛП(Лев(ФайлЗагрузки,Поз)+"DBF");
    КонецЕсли;    
КонецПроцедуры   


Процедура Сформировать() 

    ИмФайл=СокрЛП(ФайлЗагрузки);
    Док1 = СоздатьОбъект("Документ.РеестрСчетовВходящийЛПУ");   
    ДБФ = СоздатьОбъект("XBase");  
    ДБФ.ОткрытьФайл(ИмФайл,,1);
        Док1.Новый();
    ДБФ.Первая(); 
    Пока ДБФ.ВКонце() = 0 Цикл  
        Док1.НоваяСтрока();
        // и т.д.



Решил сделать возможной загрузку файлов и с длинными именами. Алгоритм следующий:
1) long = 0;
2) пытаемся открыть файл, если длина больше 8 символов Тогда
   а) усекаем имя до 8 символов;
   б) переименовываем файл на диске в короткое имя;
   в) присваиваем переменной long значение 1;
Иначе 
     ничего не делаем
Далее создаем объект типа XBase, создаем новый документ, открываем наш файл DBF и начинаем заполнять документ значениями полей файла. Если у нас был длинный файл (long=1), то после окончания всех действий вновь переименовываем файл (возвращаем ему исходное имя).


Код

Перем КороткоеИмяФайла,ПолноеИмяФайла;
Процедура ВыборФайла()
    
    КаталогЗагрузки = ""; 
    ФайлЗагрузки = "";
    Если ФС.ВыбратьФайл(0, ФайлЗагрузки, КаталогЗагрузки, "Выберите файл", "*.dbf|*.dbf", , ) = 1 Тогда
        ПолноеИмяФайла = КаталогЗагрузки + ФайлЗагрузки;
    КонецЕсли;
    
КонецПроцедуры    

Процедура ПриВыбореИмениФайла() 
    long=0;
    Поз=Найти(ФайлЗагрузки,".");
    Если (Поз>8) Тогда // длинное имя файла
        КороткоеИмяФайла=СокрП(Лев(СокрЛ(ФайлЗагрузки),8))+".DBF";;
        long = 1;
        ФС.УстТекКаталог(КаталогЗагрузки);
        Результат = ""; 
        Результат = ФС.НайтиПервыйФайл(ФайлЗагрузки);
        Если Результат<>"" Тогда
            ФС.ПереименоватьФайл(СокрЛП(КаталогЗагрузки)+"\"+ Результат,СокрЛП (КаталогЗагрузки)+"\" + КороткоеИмяФайла,1);//теперь наш файл называется R91000.dbf        
        КонецЕсли;
    Иначе    
        КороткоеИмяФайла=СокрЛП(Лев(ФайлЗагрузки,Поз)+"DBF");
    КонецЕсли;    
КонецПроцедуры   

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


Гуру подсказали, что необходимо использовать Excel.Application, так что думаю засесть за его изучение. Никто не сталкивался с подобным?
PM MAIL   Вверх
Zero
Дата 20.3.2010, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 15
Всего: 24



Цитата(SubZero @  19.3.2010,  15:36 Найти цитируемый пост)
Гуру подсказали, что необходимо использовать Excel.Application, так что думаю засесть за его изучение.

Начни изучение отсюда:
http://forum.vingrad.ru/articles/topic-141...y1065326/0.html
Может быть, многие вопросы отпадут smile 
PM MAIL ICQ   Вверх
SubZero
  Дата 24.3.2010, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.6.2008

Репутация: нет
Всего: нет



Zero, спасибо большое!

Мне все-таки удалось решить проблему загрузки файлов DBF с длинными именами, причем без использования Excel.Application!

Код

Перем Выб,long, НовИмяФайла, ДлинноеИмяФайла;
Процедура ВыборФайла()
     ФайлЗагрузки = "";
     КаталогЗагрузки="";
     long=0;
     Если ФС.ВыбратьФайл(0, ФайлЗагрузки, КаталогЗагрузки, "Выберите файл",
     "Файлы баз данных (*.dbf)|*.dbf", , ) = 1 Тогда
            Если СтрДлина(ФайлЗагрузки) > 12  тогда
          long=1;         
          ДлиноеИмяФайла=ФайлЗагрузки;
                  ЗначИмени = Лев(Строка(ФайлЗагрузки),8);   // получаем первые 8 символов из имени
                  Расш = Прав(Строка(ФайлЗагрузки),3);  
                  НовИмяФайла = ЗначИмени + "." + Расш;
                  Фс.ПереименоватьФайл(ФайлЗагрузки,НовИмяФайла,1);
                  Выб = НовИмяФайла;
          Иначе
                  Выб =  ФайлЗагрузки; 
          КонецЕсли; 
    КонецЕсли;    
КонецПроцедуры


Процедура Сформировать() 

    
    ИмФайл=СокрЛП(Выб);
    Док1 = СоздатьОбъект("Документ.РеестрСчетовВходящийЛПУ");   
    ДБФ = СоздатьОбъект("XBase");  
    ДБФ.ОткрытьФайл(КаталогЗагрузки + "\" + Выб);
    Док1.Новый();
    ДБФ.Первая(); 
    Пока ДБФ.ВКонце() = 0 Цикл  
        Док1.НоваяСтрока();
            
         и т.д. (обрабатываем документ)
         ......
    ДБФ.ЗакрытьФайл();  
    Если long=1 Тогда   
        Фс.ПереименоватьФайл(НовИмяФайла,ФайлЗагрузки,1);
    КонецЕсли;
КонецПроцедуры


Так что моя гипотеза была не такой уж безумной smile

P.S. С помощью Excel.Application также удается делать загрузку, вот только я не понял как узнать количество строк в файле (чтобы правильно организовать цикл)? Хотелось бы сделать вариант и с использованием Экселя smile
PM MAIL   Вверх
SaschaL
Дата 24.3.2010, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 880
Регистрация: 13.12.2006
Где: Челябинская обл г .Нязепетровcк

Репутация: 8
Всего: 9



Я же и говорил что проблемы с загрузкой из *.dbf нет, надо просто гибко подойти к этому
PM MAIL ICQ   Вверх
korund2010
Дата 26.3.2010, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 2.2.2010

Репутация: нет
Всего: нет



По поводу определения числа строк

 //Определяю размеры входного файла
Функция ПрочитатьСписокПолейВходногоФайла()
    Если НачальнаяСтрока<=0 Тогда    // не задано число строк                                
        НачальнаяСтрока = 1;
    КонецЕсли;
    Если КонечнаяСтрока<=0 Тогда            // не задано число строк                             
        КонечнаяСтрока = 1; 
        Для НомСтр=1 по ЧислоСтрокExcelФайла Цикл
            Если ПустаяСтрока(ВходExcel.Sheets(SheetOfBook).Cells(КонечнаяСтрока,1).Value)=0 Тогда
                КонечнаяСтрока = КонечнаяСтрока + 1;
                
   и т.д

где  ЧислоСтрокExcelФайла - предварительно задается числом заведомо большим. чем ожидается
     ВходExcel = СоздатьОбъект("Excel.Application");
        SheetOfBook - номер страницы книги Excel
PM MAIL   Вверх
Zero
Дата 27.3.2010, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 15
Всего: 24



Цитата(SubZero @  24.3.2010,  08:45 Найти цитируемый пост)
вот только я не понял как узнать количество строк в файле (чтобы правильно организовать цикл)?

Код

  // Чтобы знать размер листа, т.е. количество строк и количество
  // столбцов, мы активируем его последнюю непустую ячейку
  Эксель.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

  // Определим количество строк и столбцов в текущем листе
  x := Эксель.ActiveCell.Row;
  y := Эксель.ActiveCell.Column-1+Эксель.Selection.Columns.Count;

PM MAIL ICQ   Вверх
SubZero
Дата 29.3.2010, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.6.2008

Репутация: нет
Всего: нет



SaschaL, спасибо огромное за решение моей проблемы стандартными средствами!  smile 

korund2010Zero, огромное спасибо за помощь в освоении Excel.Application smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "1C: Предприятие, SAP, ERP и учётные системы"
stron

Запрещается!

1. Обсуждение крэков, кейгенов и других подобных программ

Пробуйте искать сами или обращайтесь в приват к участникам форума.

Темы с подобными вещами будут немедленно удаляться, а нарушители - получать предупреждения.

Также запрещается обсуждение проблем работы этих программ (что куда вписать, куда что скопировать и т.п...)

2. Давать ссылки на взломанные продукты

  • Пожалуйста, пользуйтесь поиском перед тем, как задать вопрос - возможно ответ уже есть на форуме.
  • Название темы должно отражать её суть
  • Действия модераторов можно обсудить здесь

С уважением, stron, Pegas.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | 1C: Предприятие, SAP, ERP и учётные системы | Следующая тема »


 




[ Время генерации скрипта: 0.0835 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.