Фс выбратьфайл обрезает имя файла
Скорее всего с обработкой расширения перемудрили. копипаст до смены папки может помочь, ну или переход на более адекватные наименования файлов.
ACTPOHOM
Ответ: CS5/CS5.5 - Save As обрезает имена файлов
попробуйте не подключать расширение, не знаю как виндовс, на маке это возможно.
splxgf
Ответ: CS5/CS5.5 - Save As обрезает имена файлов
Не знаю как в cs5, а в старых версия был выбор типа диалога, системный или адобовский. Можно переключить на системный.
vadim_k
Участник
Ответ: CS5/CS5.5 - Save As обрезает имена файлов
Спасибо за помощь всем откликнувшимся.
1. Конечно, можно предварительно копировать содержимое поля File Name, но весь опыт работы с другими пакетами говорит о том, что так быть не должно, Save As выполняется практически на автомате и терять время на лишнюю операцию не хочется. А самое главное, есть вероятность прозевать эту самую лишнюю операцию и остаться с "обрезанным" именем файла. Я, например, использую имена файлов для подписи иллюстраций в верстке.
2. Не подключать расширение - возможность эта, к сожалению, в Windows-версии Photoshop отсутствует - может, действительно, отсюда все беды?
3. Действительно, в CS3 в окне Save As есть кнопка переключения Adobe dialog/OS dialog (проверил в InDesign, Photoshop`а уже нет), которая пропала в CS5.
По всей вероятности, таки придется возвращаться к Photoshop CS3. Там, кстати, тоже есть свои неудобства - если в поле File Name записать имя по моему примеру, но без расширения, то расширение в итоговом файле и не появлялось, хотя формат записываемых данных был выбран. Вот почему приходилось расширение набивать руками явным образом. Думаю так: при наличии в имени файла нескольких точек Photoshop CS3 вообще игнорирует необходимость добавления расширения, а Photoshop CS5 считает расширением текст, находящийся правее самой правой точки, выбрасывает его из имени и подставляет при записи файла расширение в соответствии с выбранным форматом сохраняемых данных (в моем примере .tif). Самое обидное, что в других приложениях CS5, например, в том же InDesign, такой проблемы с именами нет и в помине.
Еще раз спасибо за помощь
В программе необходимо загружать DBF-файлы с длиной имени больше 8 символов. Если длина <=8 символам - все нормально, если же больше - программа вылетает с ошибками:
ДБФ.Первая(); : Перед выполнением операции нужно открыть базу!
Пока ДБФ.ВКонце() = 0 Цикл : Перед выполнением операции нужно открыть базу!
При этом я принудительно обрезаю имя файла до первых 8 символов - но все равно не помогает! Никак не могу понять свою ошибку(
Код ( (Unknown Language)):
Процедура ВыборФайла()
КаталогЗагрузки = "";
ФайлЗагрузки = "";
Если ФС.ВыбратьФайл(1, ФайлЗагрузки, КаталогЗагрузки, "Выберите файл", "*.dbf|*.dbf", , ) = 1 Тогда
ФайлЗагрузки = КаталогЗагрузки + ФайлЗагрузки;
КонецЕсли;
Процедура ПриВыбореИмениФайла()
Поз=Найти(ФайлЗагрузки,".");
Если (Поз=0) Или (Поз>8) Тогда
ФайлЗагрузки=СокрП(Лев(СокрЛ(ФайлЗагрузки),12))+".DBF";
Иначе
ФайлЗагрузки=СокрЛП(Лев(ФайлЗагрузки,Поз)+"DBF");
КонецЕсли;
КонецПроцедуры
Помощь в написании контрольных, курсовых и дипломных работ здесь
Доступ к полям длиной более 255 символов баз DBF
При чтении строкового поля базы DBF длиной более 255 символов получаем неверные данные. Все.
Загрузка Dbf файлов
Такая проблема, при загрузке пачки документов, попался "битый", и на нём загрузка вылетает вот с.
Ошибка при имени dbf файла более 8 символов ( MSDASQL.1 )
Всем доброго времени суток :) Цель функции: Найти *.dbf файлы в директории, присоединиться к ним в.
Преобразовать строки длиной больше 10 символов
С клавиатуры вводим число n типа int. Затем вводим n строк. Если в строке больше 10 символов, то.
А зачем имя обрезать?
Разве длинные имена XBase не открывает?
В любом случае имя DOS это не первые 8 символов имени. Там более сложно. Подробностей не расскажу, потому что не знаю
А зачем имя обрезать?
Разве длинные имена XBase не открывает?
В любом случае имя DOS это не первые 8 символов имени. Там более сложно. Подробностей не расскажу, потому что не знаю
Пробовал делать аналогичным образом - тоже не получается(
Если допустимо переименовать файл перед открытием, то тем или иным способом его переименовать можно, а потом уже открывать
Какой способ переименования пробуешь?
Если допустимо переименовать файл перед открытием, то тем или иным способом его переименовать можно, а потом уже открывать
Какой способ переименования пробуешь?
1) открыть файл;
2) переименовать его имя до 8 символов;
3) дальнейшая обработка
в 1с 8.1 примерно так
Или WinApi - поиск по getshortpathname
1) открыть файл;2) переименовать его имя до 8 символов; переименовать можно ДО открытия, Вам же сказали.
т.е. правильно мыслить в таком направлении:
1) дать пользователю выбрать файл.
2) переименовать в 8.3-формат или получить короткое имя из длинного (как написано выше)
3) открыть и сделать нужную обработку
Честно говоря, я и не подозревал, что так просто можно получить короткое имя
Это все меняет
Я бы так и сделал
Кстати, переименование еще может и не прокатить, если проблема не только в имени, но и в пути
Получить короткое имя - лучшее решение
в 1с 8.1 примерно так
Спасибо за помощь! Но у меня ошибка в строчке:
То же самое и по указанной Вами ссылке
Добавлено:переименовать можно ДО открытия, Вам же сказали.
т.е. правильно мыслить в таком направлении:
1) дать пользователю выбрать файл.
2) переименовать в 8.3-формат или получить короткое имя из длинного (как написано выше)
3) открыть и сделать нужную обработку Я неправильно выразился, имелось в виду дать возможность выбрать пользователю файл (пункт №1 у вас)
Добавлено: и можно настроить, что система короткие имена не поддерживает. возможно, из-за этого и не получается
Добавлено: и можно настроить, что система короткие имена не поддерживает. возможно, из-за этого и не получается
К сожалению данный метод тоже не подходит, ибо функция 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-файл (все необходимые параметры берутся из данных самого файла). Пробовал обрезать имя файла, переименовывать его - все тщетно! Ну никак не получается это сделать(
OKEN, спасибо огромное за помощь! Я тоже заметил эту ошибку, но потом почему-то забыл про нее.. Сейчас временно оставил этот пункт, ибо возникли более важные задачи. Попозже я еще к нему вернусь Да, при таком типе диалога еще нужны права на изменение файла. Наконец-то разделался с другими делами и появилась возможность заняться этим вопросом. Пробую диалог типа <открыть> - файл все равно не открывается( Вся проблема в том, что файлы которые необходимо обрабатывать имеют формат DBF, но длина имени составляет порядка 12-14 символов. Неужели нет никакой возможности открыть их без предварительного переименовывания? Для какого банана, извиняюсь, переименовывать?При длинном пути надо брать либо в кавычки имя файла, либо, ИмяФайла = Лев(ДлинноеИмяФайла,7)+" Еще раз убедился, что старая привычка (имя файла латиницей и не более 8 символов) позволяет избежать массы проблем.
Наследство DOS 6.2 все еще живо в народных сердцах Для какого банана, извиняюсь, переименовывать?
При длинном пути надо брать либо в кавычки имя файла, либо, ИмяФайла = Лев(ДлинноеИмяФайла,7)+"
Поясню подробней. На диске в различных каталогах находятся файлы dbf с длиной имени порядка 12-14 символов. Если длина имени не превышает 8 символов- файлы открываются нормально, если же больше - программа вылетает с ошибкой "Перед выполнением операции нужно открыть базу!" на строчках
ДБФ.Первая();
и Пока ДБФ.ВКонце() = 0 Цикл
Хотелось бы программно переименовывать длинные имена до 8 символов, обрабатывать данные, а затем возвращать исходное имя файлам. В противном случае остается только вручную переименовывать файлы, что весьма неудобно, ибо их несколько сотен и каждый день появляются новые.
Первоначальная версия процедур:
[codebox]
Процедура ВыборФайла()
КаталогЗагрузки = "";
ФайлЗагрузки = "";
Если ФС.ВыбратьФайл(1, ФайлЗагрузки, КаталогЗагрузки, "Выберите файл", "*.dbf|*.dbf", , ) = 1 Тогда
ФайлЗагрузки = КаталогЗагрузки + ФайлЗагрузки;
КонецЕсли;
Процедура ПриВыбореИмениФайла()
Поз=Найти(ФайлЗагрузки,".");
Если (Поз=0) Или (Поз>8) Тогда
ФайлЗагрузки=СокрП(Лев(СокрЛ(ФайлЗагрузки),12))+".DBF";
Иначе
ФайлЗагрузки=СокрЛП(Лев(ФайлЗагрузки,Поз)+"DBF");
КонецЕсли;
КонецПроцедуры
Решил сделать возможной загрузку файлов и с длинными именами. Алгоритм следующий:
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С?
Для работы с файлами в системе используется специальный агрегатный тип данных — ФС . Механизм работы с файлами предназначен для обеспечения возможности манипулирования файлами непосредственно из встроенного языка программы 1С:Предприятия.
Контекст работы с Файлами
Во всех программных модулях для работы с файлами следует использовать методы объекта типа «ФС». По умолчанию в системе всегда доступен уже существующий объект с именем ФС (англоязычный синоним — FS ) (имя существующего объекта совпадает с названием типа данных), к которому можно непосредственно применять методы объекта ФС. Кроме того, можно создать произвольное число объектов типа «ФС» при помощи функции СоздатьОбъект. Чтобы вызвать метод объекта, имя метода (с указанием необходимых параметров) пишется через точку после имени объекта.
Англоязычный синоним ключевого слова ФС — FS .
* Здесь приведены примеры различных способов вызова методов объекта «ФС».
Методы объекта «ФС»
ВыбратьФайл
Открывает окно диалога выбора/сохранения файла.
ВыбратьФайл(<ТипДиалога>, <ИмяФайла>, <ИмяНачКаталога>, <3аголовокОкна>, <Фильтр>,
Англоязычный синоним:
Числовое выражение, значение которого определяет тип открываемого диалога. Допустимые значения: 0 — диалог типа «открыть», 1 — диалог типа «сохранить».
Имя переменной, содержащей строковое значение с именем файла. В эту же переменную система возвращает имя выбранного файла.
Имя переменной, содержащей строковое значение с именем начального каталога. В эту же переменную система возвращает имя выбранного каталога.
Строковое выражение, с помощью которого можно задать заголовок открываемого окна.
Строковое выражение, с помощью которого можно задать список фильтров отбора файлов. Фильтр состоит из двух частей, разделенных сиволом "" (вертикальная черта): строки представления, которая отображается в окне выбора файла, и непосредственно строки маски. В строке маски можно использовать символ "*", что означает наличие любого числа произвольных символов. Символ "?" в строке маски означает наличие одного произвольного символа. Одновременно можно задавать несколько фильтров в виде списка, в качестве разделителей используется символ "|" (вертикальная черта). Например, список из двух фильтров:
Строковое выражение, с помощью которого можно задать расширение файла по умолчанию, которое используется системой при записи файла.
Необязательный параметр. Числовое выражение, значение которого задает время ожидания системы (в секундах) на отклик пользователя.
Возвращаемое значение:
Число: 0 — если в окне диалога нажата кнопка «Отмена»; 1 — если в окне диалога нажата кнопка «ОК», при этом в переменную < ИмяФайла > возвращается выбранное имя файла, а в переменную < ИмяНачКаталога > возвращается имя выбранного каталога; -1 (минус единица) — закончилось время < Таймаут > ожидания отклика пользователя.
Метод ВыбратьФайл открывает окно диалога выбора/сохранения файла.
* В данном примере приведена процедура вызова диалога выбора файла.
Если ФС.ВыбратьФайл(0, ИмяВыбрФайла, ИмяПути, "Выберите файл",
ВыбратьФайлКартинки
Открывает окно диалога выбора/сохранения файла картинки.
ВыбратьФайлКартинки(<ТипДиалога>, <ИмяФайла>, <ИмяНачКаталога>, <3аголовокОкна>,
Англоязычный синоним:
Числовое выражение, значение которого определяет тип открываемого диалога. Допустимые значения: 0 — диалог типа «открыть», 1 — диалог типа «сохранить».
Имя переменной, содержащей строковое значение с именем файла. В эту же переменную система возвращает имя выбранного файла.
Имя переменной, содержащей строковое значение с именем начального каталога. В эту же переменную система возвращает имя выбранного каталога.
Строковое выражение, с помощью которого можно задать заголовок открываемого окна.
Строковое выражение, с помощью которого можно задать расширение файла по умолчанию, которое используется системой при записи файла.
Необязательный параметр. Числовое выражение, значение которого задает время ожидания системы (в секундах) на отклик пользователя.
Возвращаемое значение:
Число: 0 — если в окне диалога нажата кнопка «Отмена»; 1 — если в окне диалога нажата кнопка «ОК», при этом в переменную < ИмяФайла > возвращается выбранное имя файла, а в переменную < ИмяНачКаталога > возвращается имя выбранного каталога; -1 (минус единица) — закончилось время < Таймаут > ожидания отклика пользователя.
Метод ВыбратьФайлКартинки открывает окно диалога (с возможностью предварительного просмотра) выбора/сохранения файла картинки.
* В данном примере приведена процедура вызова диалога выбора файла картинки.
// Фото — Объект типа "Картинка"
// Выбор файла с просмотром
Если ФС.ВыбратьФайлКартинки(0, ИмяВыбрФайла, ИмяПути,
ВыбратьКаталог
Открывает окно диалога выбора каталога.
ВыбратьКаталог(<ИмяКаталога>, <3аголовок>, <Таймаут>)
Англоязычный синоним:
Se lect Directory
Имя переменной, содержащей строковое значение с именем начального каталога. В эту же переменную система возвращает имя выбранного каталога.
Строковое выражение, с помощью которого можно задать заголовок открываемого окна.
Необязательный параметр. Числовое выражение, значение которого задает время ожидания системы (в секундах) на отклик пользователя.
Возвращаемое значение:
Число: 0 — если в окне диалога нажата кнопка «Отмена»; 1 — если в окне диалога нажата кнопка «ОК», при этом в переменную < ИмяНачКаталога > возвращается имя выбранного каталога; -1 (минус единица) — закончилось время < Таймаут > ожидания отклика пользователя.
Метод ВыбратьКаталог открывает окно диалога выбора каталога.
* В данном примере приведена процедура вызова диалога выбора каталога.
Если ФС.ВыбратьКаталог(ИмяПути, "Выберите каталог", 10) = 1 Тогда
СуществуетФайл
Проверяет существование файла.
Англоязычный синоним:
Строковое выражение с именем файла.
Возвращаемое значение:
Число: 1 — файл существует; 0 — не существует.
Метод СуществуетФайл проверяет существование файла.
Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
Сообщить("Файл " + ИмяФайла + " — существует");
КопироватьФайл
КопироватьФайл(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>, <ФлагОтказаПерезаписи>)
Англоязычный синоним:
Строковое выражение с именем файла источника.
Строковое выражение с именем файла приемника.
Числовое выражение: 0 — при существовании файла приемника заменяет его на копируемый; 1 — при существовании файла приемника копирования не производится.
Метод КопироватьФайл копирует файл-источник в файл-приемник.
* В данном примере приведена процедура копирования файла.
ФС.КопироватьФайл(ИмяВыбрФайла, ФПриемник, 1);
УдалитьФайл
Англоязычный синоним:
Строковое выражение с именем удаляемого файла.
Метод УдалитьФайл удаляет указанный файл.
* В данном примере приведена процедура удаления файла.
ПереименоватьФайл
ПереименоватьФайл(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>, <ФлагПерезаписи>)
Англоязычный синоним:
Строковое выражение с именем файла источника.
Строковое выражение с требуемым именем файла.
Числовое выражение: 0 — запрещает перемещение файла между дисками и при существовании файла приемника копирования не производится; 1 — разрешает перемещение файла (только для файлов) между дисками и при существовании файла приемника замещает его на копируемый.
Метод ПереименоватьФайл выполняет переименование (перемещение) указанного файла.
* В данном примере приведена процедура переименования файла.
ФС.ПереименоватьФайл(Результат, ФПриемник, 1);
НайтиПервыйФайл
Открывает выборку файлов по заданной маске и находит первый файл.
Англоязычный синоним:
Строковое выражение с маской имен файлов. В строке маски можно использовать символ "*", что означает наличие любого числа произвольных символов. Символ "?" в строке маски означает наличие одного произвольного символа.
Возвращаемое значение:
Строка с именем найденного файла.
Метод НайтиПервыйФайл находит первый файл и открывает выборку файлов по заданной маске.
Замечание. Методы НайтиПервыйФайл и НайтиСледующийФайл возвращают имена файлов в той же последовательности, как это делает команда Dir операционной системы MS DOS, т. е. если задана маска "*.*"для некорневого каталога, первым возвращаемым значением будет "." — обозначающая ссылку на текущий каталог. Имя следующего файла будет ".." — обозначающее ссылку на каталог уровнем выше. При получении следующих файлов возвращаемым значением будет имя найденного файла.
* В данном примере приведена процедура открытия выборки файлов по заданной маске.
См. также: НайтиСледующийФайл
НайтиСледующийФайл
Находит следующий файл по открытой выборке файлов.
Англоязычный синоним:
Возвращаемое значение:
Строка с именем найденного файла.
Метод НайтиСледующийФайл находит следующий файл по открытой выборке файлов.
* В данном примере приведена процедура взятия следующего файла выборки файлов.
См. также: НайтиПервыйФайл
АтрибутыФайла
Возвращает атрибуты файла.
АтрибутыФайла(<ИмяФайла>, <РазмерФайла> , <АтрибутыФайла>, <ВремяСоздания>,
<ВремяПоследнДоступа>, <ВремяПоследнЗаписи>, <РасширенноеИмяФайла>)
Англоязычный синоним:
Строковое выражение с именем файла.
Возвращаемое Числовое значение размера файла в байтах.
Возвращаемое строковое значение длиной 9 символов, в котором закодированы атрибуты файла. Символы могут принимать значения "0" или "1":
Первый символ: если "1" — файл только для чтения;
Второй символ: если "1" — скрытый файл;
Третий символ: если "1" — системный файл;
Четвертый символ: если "1" — каталог;
Пятый символ: если "1" — архивный файл;
Шестой символ: если "1" — обычный файл (все другие атрибуты не установлены);
Седьмой символ: если "1" — временный файл;
Восьмой символ: если " 1" — файл, сжатый каким-либо архиватором;
Девятый символ: если "1" — нет доступа к файлу.
Для проверки атрибута можно применять выражение:
где кодАтрибута — 1/2/4/16/32.
это выражение возвращает 1 или 0, в зависимости от того, установлен атрибут или нет.
Возвращаемое строковое значение, содержащее дату и время создания файла.
Возвращаемое строковое значение, содержащее дату и время последнего доступа к файлу.
Возвращаемое строковое значение, содержащее дату и время последней записи файла.
Возвращаемое строковое значение, содержащее полное имя файла.
Метод АтрибутыФайла считывает атрибуты файла и записывает их значения в передаваемые параметры.
* В данном примере приведена процедура считывания атрибутов файла.,
ФС.АтрибутыФайла(ИмяВыбрФайла, A, B, C, D, E, F);
СоздатьКаталог
Создает новый каталог файлов.
Англоязычный синоним:
Строковое выражение с именем создаваемого каталога.
Метод СоздатьКаталог создает новый каталог файлов.
* В данном примере приведена процедура создания нового каталога файлов.
УдалитьКаталог
Удаляет каталог файлов.
Англоязычный синоним:
< ИмяКат > Строковое выражение с именем удаляемого каталога файлов.
Метод УдалитьКаталог удаляет каталог файлов.
* В данном примере приведена процедура удаления каталога файлов.
УстТекКаталог
Устанавливает текущий каталог файлов.
Англоязычный синоним:
Строковое выражение с именем текущего каталога файлов.
Метод УстТекКаталог устанавливает текущий каталог файлов.
* В данном примере приведена процедура установки текущего каталога файлов
См. также: ТекКаталог
ТекКаталог
Возвращает текущий каталог файлов.
Англоязычный синоним:
Возвращаемое значение:
Строковое значение имени текущего каталога файлов.
Метод ТекКаталог возвращает строковое значение имени текущего каталога файлов.
См. также: УстТекКаталог
WindowsКаталог
Возвращает имя Windows директории.
Англоязычный синоним:
Возвращаемое значение:
Строковое значение — имя Windows директории.
Метод WindowsКаталог возвращает имя Windows директории.
Пример:
WinKaT = Ф C.Windows Каталог ();
СвободноеМестоНаДиске
Определить размер свободного дискового пространства.
Англоязычный синоним:
Строковое выражение с именем диска.
Возвращаемое значение:
Численое значение — размер свободного дискового пространства в байтах.
Метод СвободноеМестоНаДиске возвращает численое значение размера
свободного дискового пространства.
* В данном примере приведена процедура определения свободного дискового пространства диска С:
--> -->Наш опрос -->
--> -->Форма входа -->
Тема 13 Файловая система
познакомится с понятием и областью применения агрегатного типа ФС;
приобрести и закрепить навыки применения методов для работы с ФС в программных модулях.
Пояснения к работе
Для работы с файлами и каталогами в 1С:Предприятие используется специальный объект ФС (файловая система). Средства языка 1С имеют возможности поиска, копирования, переименования, удаления и совершения других операций с файлами и каталогами.
В принципе его не требуется создавать с помощью функции СоздатьОбъект(). Можно считать, что он уже создан. Но 1С позволяет создать сколько угодно таких объектов при помощи функции СоздатьОбъект().
13.1 Методы для работы с файловой системой
ВыбратьФайл(<ТипДиалога>, <ИмяФайла>, <ИмяНачКаталога>, <3аголовокОкна>, <Фильтр>, <Расширение>, <Таймаут>) – открывает окно диалога выбора/сохранения файла.
<TипДиaлoгa> – тип открываемого диалога: 0 – диалог типа «открыть», 1 – диалог типа «сохранить».
<ИмяФайла> – имя переменной, содержащей строковое значение с именем файла. В эту же переменную система возвращает имя выбранного файла.
<ИмяНачКаталога> – имя переменной, содержащей строковое значение с именем начального каталога. В эту же переменную система возвращает имя выбранного каталога.
<ЗаголовокОкна> – строковое выражение, с помощью которого можно задать заголовок открываемого окна.
<Фильтр> – строковое выражение, с помощью которого можно задать список фильтров отбора файлов. Фильтр состоит из двух частей, разделенных символом "" (вертикальная черта): строки представления, которая отображается в окне выбора файла, и непосредственно строки маски. В строке маски можно использовать символ "*", что означает наличие любого числа произвольных символов. Символ "?" в строке маски означает наличие одного произвольного символа. Одновременно можно задавать несколько фильтров в виде списка, в качестве разделителей используется символ "|" (вертикальная черта). Например, список из двух фильтров: "Текст(*.txt)|*.txt| Таблицы(*.mxl)|*.mxl"
<Расширение> – строковое выражение, с помощью которого можно задать расширение файла по умолчанию, которое используется системой при записи файла.
<Таймаут> – необязательный параметр. Время ожидания системы (в секундах) на отклик пользователя.
Возвращаемое значение: 0 – если в окне диалога нажата кнопка Отмена; 1 – если в окне диалога нажата кнопка ОК, при этом в переменную <ИмяФайла> возвращается выбранное имя файла, а в переменную <ИмяНачКаталога> возвращается имя выбранного каталога; –1 (минус единица) – закончилось время <Таймаут> ожидания отклика пользователя.
// В данном примере приведена процедура вызова диалога выбора файла.
Процедура УдалФ()
ИмяВыбрФайла = "";
Если ФС.ВыбратьФайл(0, ИмяВыбрФайла, ИмяПути, "Выберите файл",
"Все файлы (*.*)|*.*", , ) = 1 Тогда
ФС.УдалитьФайл(ИмяПути + ИмяВыбрФайла);
КонецПроцедуры
ВыбратьФайлКартинки(<ТипДиалога>, <ИмяФайла>, <ИмяНачКаталога>, <3аголовокОкна>, <Расширение>, <Таймаут>) – открывает окно диалога (с возможностью предварительного просмотра) выбора/сохранения файла картинки.
<ТипДиалога> – тип открываемого диалога: 0 – диалог типа «открыть», 1 – диалог типа «сохранить».
<ИмяФайла> – имя переменной, содержащей строковое значение с именем файла. В эту же переменную система возвращает имя выбранного файла.
<ИмяНачКаталога> – имя переменной, содержащей строковое значение с именем начального каталога. В эту же переменную система возвращает имя выбранного каталога.
<3аголовокОкна> – строковое выражение, с помощью которого можно задать заголовок открываемого окна.
<Расширение> – строковое выражение, с помощью которого можно задать расширение файла по умолчанию, которое используется системой при записи файла.
<Таймаут> – необязательный параметр. Время ожидания системы (в секундах) на отклик пользователя.
Возвращаемое значение: 0 – если в окне диалога нажата кнопка Отмена; 1 – если в окне диалога нажата кнопка ОК, при этом в переменную <ИмяФайла> возвращается выбранное имя файла, а в переменную <ИмяНачКаталога> возвращается имя выбранного каталога; –1 (минус единица) – закончилось время <Таймаут> ожидания отклика пользователя.
// В данном примере приведена процедура вызова диалога выбора файла картинки.
// Фото – Объект типа "Картинка"
Процедура ЗагрКарт()
ИмяВыбрФайла = "";
// Выбор файла с просмотром
Если ФС.ВыбратьФайлКартинки(0, ИмяВыбрФайла, ИмяПути,
"Выберите файл", "bmp", ) = 1 Тогда
Фото.Загрузить(ИмяПути + ИмяВыбрФайла);
КонецПроцедуры
ВыбратьКаталог(<ИмяКаталога>, <3аголовок>, <Таймаут>) – открывает окно диалога выбора каталога.
<ИмяКаталога> – имя переменной, содержащей строковое значение с именем начального каталога. В эту же переменную система возвращает имя выбранного каталога.
<3аголовок> – строковое выражение, с помощью которого можно задать заголовок открываемого окна.
<Таймаут> – необязательный параметр. Время ожидания системы (в секундах) на отклик пользователя.
Возвращаемое значение: 0 – если в окне диалога нажата кнопка Отмена; 1 – если в окне диалога нажата кнопка ОК, при этом в переменную <ИмяНачКаталога> возвращается имя выбранного каталога; –1 (минус единица) – закончилось время <Таймаут> ожидания отклика пользователя.
// В данном примере приведена процедура вызова диалога выбора каталога.
Функция УстКат(ИмяПути)
Если ФС.ВыбратьКаталог(ИмяПути, "Выберите каталог", 10) = 1 Тогда
Возврат ИмяПути;
Возврат КаталогПользователя();
КонецПроцедуры
Существуетфайл(<ИмяФайла>) – проверяет существование файла.
<ИмяФайла> – строковое выражение с именем файла.
Возвращаемое значение: 1 – файл существует; 0 – не существует.
Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
Сообщить("Файл " + ИмяФайла + " – существует");
КопироватьФайл(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>, <ФлагОтказаПерезаписи>) – копирует файл–источник в файл–приемник.
<ИмяФайлаИсточника> – строковое выражение с именем файла источника.
<ИмяФайлаПриемника> – строковое выражение с именем файла приемника.
<ФлагОтказаПерезаписи> – 0 – при существовании файла приемника заменяет его на копируемый; 1 – при существовании файла приемника копирования не производится.
ФС.КопироватьФайл(ИмяВыбрФайла, ФПриемник, 1);
УдалитьФайл(<ИмяФайла>) – удаляет указанный файл.
<ИмяФайла> – строковое выражение с именем удаляемого файла.
ФС.УдалитьФайл(ИмяФайла);
ПереименоватьФайл(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>, <ФлагПерезаписи>) – выполняет переименование (перемещение) указанного файла.
<ИмяФайлаИсточника> – строковое выражение с именем файла источника.
<ИмяФайлаПриемника> – строковое выражение с требуемым именем файла.
<ФлагПерезаписи> – 0 – запрещает перемещение файла между дисками и при существовании файла приемника копирования не производится; 1 – разрешает перемещение файла (только для файлов) между дисками и при существовании файла приемника замещает его на копируемый.
ФС.ПереименоватьФайл(Результат, ФПриемник, 1);
НайтиПервыйФайл(<МаскаИмени>) – находит первый файл и открывает выборку файлов по заданной маске. Методы НайтиПервыйФайл() и НайтиСледующийФайл() возвращают имена файлов в той же последовательности, как это делает команда Dir операционной системы MS DOS, т. е. если задана маска "*.*"для некорневого каталога, первым возвращаемым значением будет "." – обозначающая ссылку на текущий каталог. Имя следующего файла будет ".." – обозначающее ссылку на каталог уровнем выше. При получении следующих файлов возвращаемым значением будет имя найденного файла.
<МаскаИмени> – строковое выражение с маской имен файлов. В строке маски можно использовать символ "*", что означает наличие любого числа произвольных символов. Символ "?" в строке маски означает наличие одного произвольного символа.
Возвращаемое значение: строка с именем найденного файла.
Результат = ФС.НайтиПервыйФайл("*.*");
НайтиСледующийФайл() – находит следующий файл по открытой выборке файлов.
Возвращаемое значение: строка с именем найденного файла.
Результат = ФС.НайтиПервыйФайл("*.*");
Результат = ФС.НайтиСледующийФайл();
АтрибутыФайла(<ИмяФайла>, <РазмерФайла>, <АтрибутыФайла>, <ВремяСоздания>, <ВремяПоследнДоступа>, <ВремяПоследнЗаписи>, <РасширенноеИмяФайла>) – считывает атрибуты файла и записывает их значения в передаваемые параметры.
<ИмяФайла> – строковое выражение с именем файла.
<РазмерФайла> – размер файла в байтах.
<АтрибутыФайла> – возвращаемое строковое значение длиной 9 символов, в котором закодированы атрибуты файла. Символы могут принимать значения "0" или "1":
Первый символ: если "1" – файл только для чтения;
Второй символ: если "1" – скрытый файл;
Третий символ: если "1" – системный файл;
Четвертый символ: если "1" – каталог;
Пятый символ: если "1" – архивный файл;
Шестой символ: если "1" – обычный файл (все другие атрибуты не установлены);
Седьмой символ: если "1" – временный файл;
Восьмой символ: если " 1" – файл, сжатый каким–либо архиватором;
Девятый символ: если "1" – нет доступа к файлу.
Для проверки атрибута можно применять выражение:
где кодАтрибута – 1/2/4/16/32. это выражение возвращает 1 или 0, в зависимости от того, установлен атрибут или нет.
<ВремяСоздания> – возвращаемое строковое значение, содержащее дату и время создания файла.
<ВремяПоследнДоступа> – возвращаемое строковое значение, содержащее дату и время последнего доступа к файлу.
<ВремяПоследнЗаписи> – возвращаемое строковое значение, содержащее дату и время последней записи файла.
<РасширенноеИмяФайла> – возвращаемое строковое значение, содержащее полное имя файла.
ФС.АтрибутыФайла(ИмяВыбрФайла, A, B, C, D, E, F);
СоздатьКаталог(<ИмяКат>) – создает новый каталог.
<ИмяКат> – строковое выражение с именем создаваемого каталога.
ФС.СоздатьКаталог(ИмяВыбрДир);
УдалитьКаталог(<ИмяКат>) – удаляет каталог.
<ИмяКат> – строковое выражение с именем удаляемого каталога.
ФС.УдалитьКаталог(ИмяВыбрДир);
УстТекКаталог(<ИмяКат>) – устанавливает текущий каталог.
<ИмяКат> – строковое выражение с именем текущего каталога.
ФС.УстТекКаталог(ИмяВыбрДир);
ТекКаталог() – строковое значение имени текущего каталога.
Возвращаемое значение: строковое значение имени текущего каталога.
ТекКат = ФС.ТекКаталог();
WindowsКаталог() – возвращает имя Windows директории.
Возвращаемое значение: строковое значение – имя Windows директории.
WinKaт = ФC.WindowsКаталог();
СвободноеМестоНаДиске(<ИмяДиска>) – размер свободного дискового пространства в байтах.
<ИмяДиска> – строковое выражение с именем диска.
Рез = ФС.СвободноеМестоНаДиске("С:");
Также часто применяются системные функции:
КаталогИБ() – возвращает имя каталога базы данных.
КаталогПользователя() – возвращает имя каталога пользователя.
КаталогПрограммы() – возвращает имя каталога с исполняемыми файлами системы 1С:Предприятие.
КаталогВременныхФайлов() – возвращает имя каталога временных файлов.
ИмяКомпьютера() – возвращает сетевое имя компьютера, работающего в данный момент с программой.
13.2 Работа с файловой системой
Дополним существующий пример конфигурации возможностью выбора файла для записи или чтения. Например, в обработке ЗагрузкаДолжностей имя файла вводилось с клавиатуры в обычное строковое поле. Теперь воспользуемся стандартными способами для выбора файла.
Откройте обработку ЗагрузкаДолжностей и измените форму следующим образом (рисунок 13.2.1):
// вызываем стандартное окно выбора файла
Если ФС.ВыбратьФайл(0, Файл, ИмяПути, "Выберите файл", "Текстовые файлы (*.txt)|*.txt", , ) = 0 Тогда
// получаем полное имя файла
Файл=ИмяПути+Файл;
Произведите аналогичные изменения для загрузки данных из DBF –файла.
Кроме того, с помощью агрегатных типов ФС и Картинка можно загружать и отображать графические файлы. Например, необходимо чтобы в справочнике Сотрудники находились фотографии работников. Конечно, в самом справочнике будут находиться полные имена графических файлов с фотографиями, а сами файлы будут находиться, например, в каталоге Фото информационной базы.
В справочнике сотрудники создайте новый реквизит Фото типа Строка неограниченной длины (так как имена файлов могут быть очень длинные). На форму элементы справочника поместите следующие элементы диалога (рисунок 13.2.2):
Картинка (используется для отображения фотографии): Идентификатор – ФотоРаб, Рамка – Простая;
Кнопка Загрузить фото (используется для выбора графического файла): Формула – ЗагрузкаФото();
Реквизит Фото (используется для отображения имени файла): опции Сделать недоступным и Пропускать при вводе установлены.
В программный модуль внесем следующие изменения. В процедуру ВводНового() добавьте строку:
Создайте процедуру ЗагрузкаФото():
Процедура ЗагрузкаФото()
// открываем стандартный диалог выбора картинки
Если ФС . ВыбратьФайлКартинки ( 0, Фото, ИмяПути,"Выберите файл", "bmp ", )=0 Тогда
// визуализируем выбранную картинку
ФотоРаб.Загрузить(ИмяПути+Фото);
// проверяем есть ли в каталоге информационной базы каталог Фото
Если ФС.СуществуетФайл(КаталогИБ()+"Фото\")=0 Тогда
// если нет, создаем его
ФС.СоздатьКаталог(КаталогИБ()+"Фото\");
// копируем выбранную картинку в каталог Фото
ФС.КопироватьФайл(ИмяПути+Фото, КаталогИБ()+"Фото\"+Фото,0);
// запоминаем полное имя файла
Фото=КаталогИБ()+"Фото\"+Фото;
Предупреждение(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
В разделе основной программы модуля записываем:
// если реквизит Фото не пуст
Если Фото<>"" Тогда
// оператор Попытка необходим, при загрузке фото из файла,
// так как указанный файл мог быть стерт или испорчен
// загружаем графический файл
ФотоРаб.Загрузить(Фото);
Предупреждение(ОписаниеОшибки());
КонецПопытки;
Сохраните конфигурацию и загрузите 1С в режиме Предприятие. Откройте справочник Сотрудники и попробуйте для какого–либо работника загрузить графический файл и сохранить изменения. Затем попробуйте снова открыть этого работника. Убедитесь, что выбранный файл загружается (рисунок 13.2.3).
В конфигурациях, созданных на прошлых занятиях, сделайте следующие изменения и дополнения:
все имена файлов для загрузки или выгрузки данных должны выбираться через стандартные диалоговые окна для работы с файлами;
в главный справочник ввести реквизит для отображения графической информации по вашему выбору и обеспечить загрузку изображения из файла и отображение на форме.
Читайте также: