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

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

В программе необходимо загружать DBF-файлы с длиной имени больше 8 символов. Если длина <=8 символам - все нормально, если же больше - программа вылетает с ошибками:

ДБФ.Первая(); : Перед выполнением операции нужно открыть базу! Пока ДБФ.ВКонце() = 0 Цикл : Перед выполнением операции нужно открыть базу!

При этом я принудительно обрезаю имя файла до первых 8 символов - но все равно не помогает! Никак не могу понять свою ошибку(

  • 16.02.2010
  • #2

А зачем имя обрезать?

Разве длинные имена XBase не открывает? В любом случае имя DOS это не первые 8 символов имени. Там более сложно. Подробностей не расскажу, потому что не знаю

BBDragon
  • 16.02.2010
  • #3

А зачем имя обрезать?

Разве длинные имена XBase не открывает? В любом случае имя DOS это не первые 8 символов имени. Там более сложно. Подробностей не расскажу, потому что не знаю

Вообще-то не открывает) Есть тема про переименовывание файлов DBF: link removed

Пробовал делать аналогичным образом - тоже не получается(

  • 16.02.2010
  • #4

Если допустимо переименовать файл перед открытием, то тем или иным способом его переименовать можно, а потом уже открывать

Какой способ переименования пробуешь?

BBDragon
  • 16.02.2010
  • #5

Если допустимо переименовать файл перед открытием, то тем или иным способом его переименовать можно, а потом уже открывать

Какой способ переименования пробуешь?

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

1) открыть файл; 2) переименовать его имя до 8 символов; 3) дальнейшая обработка

  • 16.02.2010
  • #6

Или WinApi - поиск по getshortpathname

  • 16.02.2010
  • #7

Честно говоря, я и не подозревал, что так просто можно получить короткое имя Это все меняет Я бы так и сделал

Кстати, переименование еще может и не прокатить, если проблема не только в имени, но и в пути Получить короткое имя - лучшее решение

BBDragon
  • 16.02.2010
  • #8

Спасибо за помощь! Но у меня ошибка в строчке:

То же самое и по указанной Вами ссылке

  • 16.02.2010
  • #9

если язык нормально поддерживает декларации из виндозных либ. там еще указание есть насчет CharSet, похоже, из-за русских символов что-то может глючить. если не поможет - таки переименовывать.

Добавлено: и можно настроить, что система короткие имена не поддерживает. возможно, из-за этого и не получается

BBDragon
  • 16.02.2010
  • #10

если язык нормально поддерживает декларации из виндозных либ. там еще указание есть насчет CharSet, похоже, из-за русских символов что-то может глючить. если не поможет - таки переименовывать.

Добавлено: и можно настроить, что система короткие имена не поддерживает. возможно, из-за этого и не получается

К сожалению данный метод тоже не подходит, ибо функция GetShortPathName 1С 7.7 незнакома(

Ради интереса попробовал переименовать уже закрытый файл в файл с длиной имени более 8 символов.

[codebox] ДБФ.ЗакрытьФайл(); //закрываем наш обработанный DBF-файл ФС.УстТекКаталог(СокрЛП("D:")); Результат = ""; Результат = ФС.НайтиПервыйФайл("reestr.DBF"); Если Результат<>"" Тогда ФС.ПереименоватьФайл(СокрЛП(КаталогЗагрузки)+"\"+ Результат,СокрЛП (КаталогЗагрузки)+"\R91000" + Результат,1); КонецЕсли; [/codebox]

Программа находит файл "D:\reestr.DBF" и переименовывает его в "D:\R91000reestr.dbf". Теперь необходимо сделать следующее:

1) позволить пользователю выбрать файл; 2) обрезать его имя до первых 8 символов; 3) обработать и закрыть; 4) переименовать полученный файл так как нужно.

Имя исходного файла значения не имеет, главное, чтобы это был DBF-файл (все необходимые параметры берутся из данных самого файла). Пробовал обрезать имя файла, переименовывать его - все тщетно! Ну никак не получается это сделать(

  • 16.02.2010
  • #11
BBDragon
  • 18.02.2010
  • #12
  • 18.02.2010
  • #13
BBDragon
  • 18.03.2010
  • #14
vitfil
  • 18.03.2010
  • #15
  • 18.03.2010
  • #16
BBDragon
  • 19.03.2010
  • #17

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

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

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

[codebox] Процедура ВыборФайла()

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

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

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

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

[codebox] Перем КороткоеИмяФайла,ПолноеИмяФайла; Процедура ВыборФайла()

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

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

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

В новом варианте обработка файлов с длинными именами все равно невозможна, программа вылетает с теми же ошибками. Подскажите, возможно ли реализовать мою задумку в 1С?

📎📎📎📎📎📎📎📎📎📎