Загрузка 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
- 18.02.2010
- #12
- 18.02.2010
- #13
- 18.03.2010
- #14
- 18.03.2010
- #15
- 18.03.2010
- #16
- 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С?