7.7 Загрузка DBF-файлов с длиной имени больше 8 символов (1С 7.7)

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем BBDragon, 19 мар 2010.

  1. TopicStarter Overlay
    BBDragon
    Offline

    BBDragon Опытный в 1С

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

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


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

    Код:
    Процедура ВыборФайла()
    
    КаталогЗагрузки = ""; 
    ФайлЗагрузки = "";
    Если ФС.ВыбратьФайл(1, ФайлЗагрузки, КаталогЗагрузки, "Выберите файл", "*.dbf|*.dbf", , ) = 1 Тогда
    ФайлЗагрузки = КаталогЗагрузки + ФайлЗагрузки;
    КонецЕсли;
    
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/конецпроцедуры')">КонецПроцедуры	</span>
    
    Процедура ПриВыбореИмениФайла()
    Поз=Найти(ФайлЗагрузки,".");
    Если (Поз=0) Или (Поз>8) Тогда
    ФайлЗагрузки=СокрП(Лев(СокрЛ(ФайлЗагрузки),12))+".DBF";
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/иначе')">	Иначе	</span>
    ФайлЗагрузки=СокрЛП(Лев(ФайлЗагрузки,Поз)+"DBF");
    КонецЕсли;	
    КонецПроцедуры   
    
    
    Процедура Сформировать() 
    
    ИмФайл=СокрЛП(ФайлЗагрузки);
    Док1 = СоздатьОбъект("Документ.РеестрСчетовВходящийЛПУ");   
    ДБФ = СоздатьОбъект("XBase");  
    ДБФ.ОткрытьФайл(ИмФайл,,1);
    Док1.Новый();
    ДБФ.Первая(); 
    Пока ДБФ.ВКонце() = 0 Цикл  
    Док1.НоваяСтрока();
    // и т.д.
    
    

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


    Код:
    Перем КороткоеИмяФайла,ПолноеИмяФайла;
    Процедура ВыборФайла()
    
    КаталогЗагрузки = ""; 
    ФайлЗагрузки = "";
    Если ФС.ВыбратьФайл(0, ФайлЗагрузки, КаталогЗагрузки, "Выберите файл", "*.dbf|*.dbf", , ) = 1 Тогда
    ПолноеИмяФайла = КаталогЗагрузки + ФайлЗагрузки;
    КонецЕсли;
    
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/конецпроцедуры')">КонецПроцедуры	</span>
    
    Процедура ПриВыбореИмениФайла() 
    long=0;
    Поз=Найти(ФайлЗагрузки,".");
    Если (Поз>8) Тогда // длинное имя файла
    КороткоеИмяФайла=СокрП(Лев(СокрЛ(ФайлЗагрузки),8))+".DBF";;
    long = 1;
    ФС.УстТекКаталог(КаталогЗагрузки);
    Результат = ""; 
    Результат = ФС.НайтиПервыйФайл(ФайлЗагрузки);
    Если Результат<>"" Тогда
    ФС.ПереименоватьФайл(СокрЛП(КаталогЗагрузки)+"\"+ Результат,СокрЛП (КаталогЗагрузки)+"\" + КороткоеИмяФайла,1);//теперь наш файл называется R91000.dbf		
    КонецЕсли;
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/иначе')">	Иначе	</span>
    КороткоеИмяФайла=СокрЛП(Лев(ФайлЗагрузки,Поз)+"DBF");
    КонецЕсли;	
    КонецПроцедуры   
    
    Процедура Сформировать()
    ИмФайл=СокрЛП(КороткоеИмяФайла);
    Док1 = СоздатьОбъект("Документ.РеестрСчетовВходящийЛПУ");   
    ДБФ = СоздатьОбъект("XBase");  
    ФС.УстТекКаталог(КаталогЗагрузки);
    ДБФ.ОткрытьФайл(ИмФайл,,1);
    Док1.Новый();
    ДБФ.Первая(); 
    Пока ДБФ.ВКонце() = 0 Цикл  
    Док1.НоваяСтрока();
    //и т.д.
    
    
    В новом варианте обработка файлов с длинными именами все равно невозможна, программа вылетает с теми же ошибками. Подскажите, возможно ли реализовать мою задумку в 1С?
  2. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Я бы делал по другому алгоритму.
    1. Получаем нужный файл
    2. Запоминаем его имя
    3. Переименовываем во временное имя
    4. Обрабатываем
    5. Обратно переименовываем.

    P.S. в приведенном примере очень сложно ориентироваться. Оформи в виде обработки и выложи на форуме.
  3. TopicStarter Overlay
    BBDragon
    Offline

    BBDragon Опытный в 1С

    Регистрация:
    11 мар 2010
    Сообщения:
    183
    Симпатии:
    2
    Баллы:
    29
    Я делаю практически то же самое, но не работает. Подсказали, что нужно воспользоваться Excel.Application в 1С. DBF-файлы с длинными именами Excel прекрасно открывает, если явно указать расширение .DBF. Так что засел за изучение данного средства :)
  4. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Не стоит привязывать конфигурацию к внешним обстоятельствам - это дополнительный источник "непредсказуемых" проблем. К тому же встроенными средствами это делается быстрее (а если их действительно несколько сотен......)
  5. TopicStarter Overlay
    BBDragon
    Offline

    BBDragon Опытный в 1С

    Регистрация:
    11 мар 2010
    Сообщения:
    183
    Симпатии:
    2
    Баллы:
    29
    Был бы рад воспользоваться встроенными средствами, но, как мне объяснили, в моем случае это невозможно :unsure:
  6. eviloid
    Offline

    eviloid Опытный в 1С

    Регистрация:
    15 май 2008
    Сообщения:
    103
    Симпатии:
    0
    Баллы:
    26
    попробуйте так:

    Код:
    Функция ПолучитьКороткийПутьКФайлу(ДлинныйПуть)
    ФСО = СоздатьОбъект("Scripting.FileSystemObject");
    Файл = ФСО.GetFile(ДлинныйПуть);
    КороткийПуть = Файл.ShortPath;
    Файл = "";
    ФСО = "";
    
    Возврат КороткийПуть;
    КонецФункции
    
    
    ДБФ.ОткрытьФайл(ПолучитьКороткийПутьКФайлу(ИмФайл),,1);
    
    
    
  7. TopicStarter Overlay
    BBDragon
    Offline

    BBDragon Опытный в 1С

    Регистрация:
    11 мар 2010
    Сообщения:
    183
    Симпатии:
    2
    Баллы:
    29
    Попробовал - вылетает с теми же ошибками, что и у меня были, вдобавок еще и ругается на длинное имя файла("Длина имени файла превысила 8 символов!"). Само имя он не меняет, оставляет как было

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