Получить ссылку на файл 1с
В 1С 8.3 (8.2) для работы с файлами существует два объекта: Файл и ДиалогВыбораФайла.
Рассмотрим каждый по отдельности.
Объект Файл служит для управления параметрами файлов.
Сразу стоит заметить, что данный объект не предназначен для чтения и записи из файлов.
Например, прочитаем параметры некоторого файла, находящегося на диске C:
В результате мы получим следующую информацию (если файл найден):
Параметры файла:
Полное имя файла: C:\Работа с файлами\статья.txt
Имя: статья.txt
Имя без расширения: статья
Расширение: .txt
Путь без имени: C:\Работа с файлами\
Размер: 899
Это файл: Да
Изменен: 18.05.2015 16:21:28
Только чтение: Нет
Невидимость: Нет
Запись в файл
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Теперь, когда мы выбрали и открыли файл, можно с ним работать, т.е. прочитать его содержимое или записать в него что-нибудь.
Рассмотрим пример:
Чтение файла в 1С
Часто бывает необходимо прочитать текст файла построчно, например, для анализа каждой строки. Для этого используем объект ЧтениеТекста.
Запись текста из 1С в файл
Заметим, что при записи текстового файла можно установить кодировку.
Копирование файла
Здесь все очень просто
Перемещение
Удаление
Диалог выбора файла
В указанных выше примерах есть одно неудобство. Путь к файлу прописан жестко в коде. Чтобы выбрать файл интерактивно, существует объект ДиалогВыбораФайла, о котором речь пойдет ниже.
Объект ДиалогВыбораФайла служит для открытия файла (файлов), сохранения файла или выбора каталога в диалоге специального вида.
Например, выберем и откроем некоторый файл с расширением txt:
Задаем режим диалога выбора. Доступны три варианта: ВыборКаталога, Открытие, Сохранение
Доступ к файловой системе из кода конфигурации
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. При обращении из кода конфигурации к файлам и каталогам файловой системы следует иметь в виду, что доступ к ним ограничен правами пользователя операционной системы, от имени которого запущено приложение.
1.1. Если доступ к файловой системе осуществляется из кода, выполняемого на клиенте, то он выполняется под правами пользователя, от имени которого запущено приложение (тонкий, толстый или веб-клиент). Как правило, это текущий пользователь операционной системы.
1.2. Если доступ к файловой системе осуществляется из кода, выполняемого на сервере, то:
- при использовании клиент-серверной информационной базы, доступ ограничен правами пользователя, от имени которого запущен сервер 1С:Предприятия (*);
- при использовании файловой базы, опубликованной на веб-сервере, доступ ограничен правами пользователя, от имени которого запущен веб-сервер.
* Рабочие процессы могут быть также запущены от имени другого пользователя, отличного от того, под которым запускается агент сервера. Подробнее см. руководство администратора клиент-серверного варианта, описание служебного файла swpuser.ini
Область применения (уточнение): управляемое приложение, обычное приложение.
2. Запрещается выполнять запись каких-либо файлов в каталог исполняемых файлов 1С:Предприятия, получаемого с помощью метода КаталогПрограммы . Использование метода КаталогПрограммы допустимо только для чтения или запуска файлов. Например, при работе в ОС Windows, для запуска копии тонкого клиента 1С:Предприятия текущей версии, допустимо использовать:
3. Даже если не планируется локализация конфигурации на другие языки, следует обеспечивать переносимость файлов, сформированных из кода конфигурации, между различными операционными системами с различными кодировками. Для этого необходимо:
3.1. В именах файлов, автоматически формируемых из кода конфигурации, указывать только английские буквы, а также цифры, а в качестве кодировки текстовых файлов использовать только UTF-8 (именно этот формат предпочтителен, т.к. только с ним корректно работает операционная система macOS).
3.2. В тех случаях, когда имя файла не генерируется системой, а его явно вводит пользователь, разрешить ввод русскоязычных имен, но при этом дать возможность транслитерировать его в англоязычное имя. По умолчанию, если это технически возможно и не снижает удобство работы, рекомендуется предлагать англоязычное имя файла, а для текстовых файлов – сохранение в кодировке UTF-8.
Также эти рекомендации по выбору имени и кодировки файла следует разместить в справке к тем местам программы, где пользователь имеет возможность сохранять файлы и выбирать кодировку.
В конфигурациях на базе Библиотеки стандартных подсистем для транслитерации имен файлов рекомендуется использовать функцию СтроковыеФункцииКлиентСервер.СтрокаЛатиницей .
Работа с временными файлами и каталогами
При необходимости использования временных файлов и каталогов необходимо соблюдать следующие требования:
1. Для получения имени временного файла следует использовать метод ПолучитьИмяВременногоФайла (исключение составляет веб-клиент, см. ниже п. 3). В противном случае возможна некорректная работа конфигурации в многопользовательском режиме, с включенными профилями безопасностями, возникновение проблем с правами доступа к файлам операционной системы, а также неконтролируемое увеличение количества ненужных временных файлов, которые не будут своевременно удалены.
ИмяПромежуточногоФайла = "C:\Временные файлы 1С\TempFile.xml";
Данные.Записать(ИмяПромежуточногоФайла);
У текущего пользователя может не быть прав на запись в указанный каталог. Кроме того, при одновременном выполнении этого кода из двух разных сеансов возникнет ошибка.
При использовании этой функции будет получено уникальное имя, гарантирован доступ к файлу.
Кроме того, при использовании метода ПолучитьИмяВременногоФайла платформа 1С:Предприятие сохраняет контроль над такими файлами и автоматически удаляет их
- при перезапуске рабочего процесса (если файл был создан на стороне сервера) или клиентского приложения (если файл был создан на стороне клиента);
- через 20 минут после серверного вызова или сеанса, в котором создан временный файл (при работе в клиент-серверном варианте на платформе 8.3.17 и больше).
Если же имя временного файла было сформировано каким-то другим способом, и прикладной код не удалил (либо по какой-то причине не смог удалить) ранее созданный временный файл, то платформа такой файл не контролирует, и он остается в файловой системе на неопределенное время. Накапливание «потерянных» временных файлов может представлять серьезную проблему, особенно для информационных баз с большим количеством активно работающих пользователей (например, при работе в режиме сервиса).
Таким образом, неправильно :
Каталог = КаталогВременныхФайлов();
ИмяФайла = Строка(Новый УникальныйИдентификатор) + ".xml";
ИмяПромежуточногоФайла = Каталог + ИмяФайла;
Данные.Записать(ИмяПромежуточногоФайла);
Если по каким-то причинам прикладной код не удалит созданный файл (например, между блоками создания и удаления временного файла возникнет штатное или нештатное исключение), этот файл так и останется в каталоге временных файлов.
При использовании метода ПолучитьИмяВременногоФайла будет получено уникальное имя, гарантирован доступ к файлу, а также временный файл будет автоматически удален платформой 1С:Предприятие после завершения рабочего процесса сервера или клиентского приложения.
2. Для создания временного каталога рекомендуется также использовать имя, полученное при помощи метода ПолучитьИмяВременногоФайла (исключение составляет веб-клиент, см. ниже п. 3). Это гарантирует уникальность имени создаваемого каталога при работе в многопользовательском режиме и гарантирует, что после перезапуска рабочего процесса или клиентского приложения временный каталог будет автоматически удален платформой 1С:Предприятие. После этого, внутри созданного каталога можно создавать другие каталоги и файлы без ограничений.
3.1. При выполнении кода веб-клиентом метод ПолучитьИмяВременногоФайла недоступен. Поэтому для формирования имен временных файлов и каталогов необходимо использовать функцию КаталогВременныхФайлов и объект УникальныйИдентификатор .
Каталог = КаталогВременныхФайлов();
ИмяФайла = "TempDataFile.xml";
ИмяПромежуточногоФайла = Каталог + ИмяФайла;
Данные.Записать(ИмяПромежуточногоФайла);
Каталог = КаталогВременныхФайлов();
ИмяФайла = Строка(Новый УникальныйИдентификатор) + ".xml";
ИмяПромежуточногоФайла = Каталог + ИмяФайла;
Данные.Записать(ИмяПромежуточногоФайла);
3.2. Если в конфигурацию встроена Библиотека стандартных подсистем , для создания временных каталогов на стороне клиента необходимо использовать процедуру ФайловаяСистемаКлиент.СоздатьВременныйКаталог .
4. После окончания работы с временным файлом или каталогом, его необходимо удалить самостоятельно. Нельзя рассчитывать на автоматическое удаление файлов и каталогов при следующем запуске платформы, это может привести к исчерпанию свободного места в каталоге временных файлов.
// Работа с файлом
.
// Удаляем временный файл
Попытка
УдалитьФайлы(ИмяПромежуточногоФайла);
Исключение
ЗаписьЖурналаРегистрации(НСтр("ru = 'Мой механизм.Действие'"), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
5. При использовании временных файлов и каталогов на сервере, необходимо полностью завершать работу с ними в рамках одного серверного вызова. При работе конфигурации с использованием кластера серверов, при следующем вызове эти файлы могут стать недоступны, так как код начнет исполняться на другом компьютере. При необходимости сохранить данные между серверными вызовами в пределах одного сеанса следует использовать временное хранилище платформы (методы ПоместитьВоВременноеХранилище , ПолучитьИзВременногоХранилища ).
5.1. В редких случаях может возникнуть необходимость передачи данных во временных файлах между сеансами, например, при подготовке данных для фонового задания, при организации длительного процесса, обслуживающего несколько последовательных вызовов web-сервиса. Необходимо самостоятельно обеспечивать гарантировано общее место хранения, права для доступа к файлам из разных мест их обработки, удаление файлов по истечению сроков их обработки или аварийного завершения процесса обработки. Рекомендуется использовать следующий подход:
- Для обеспечения доступа со всех возможных мест обработки заводится константа для хранения общего пути к файлам, доступного для доступа со всех серверов кластера;
- При создании временных файлов их имена заносятся во вспомогательный регистр сведений с сохранением времени создания файла;
- При штатном прохождении процесса, последняя операция, которой были нужны файлы, перед своим завершением удаляет как сам файл, так и записи о них во вспомогательном регистре;
- Вспомогательное регламентное задание периодически проверяет наличие записей во вспомогательном регистре, время существования которых заведомо превышает время штатного завершения процесса. При обнаружении таких записей, задание удаляет временные файлы и записи о них.
Передача файлов между клиентом и сервером
1. При одновременной работе с файлом на клиенте и на сервере необходимо использовать передачу файла через временное хранилище (методы ПоместитьФайлы , ПолучитьФайл , ПолучитьФайлы , НачатьПомещениеФайла , ПоместитьВоВременноеХранилище , ПолучитьИзВременногоХранилища ). В общем случае клиент и серверы кластера - это разные компьютеры с разной файловой системой, причем доступ к файлам может происходить под разными пользователями ОС с различными правами.
&НаКлиенте
Процедура ОбработатьФайл()
.
ИмяФайла = "C:\Файлы для обработки\Загрузка.xml";
Результат = ПроизвестиОбработкуНаСервере(ИмяФайла);
.
Чтение = Новый ЧтениеТекста(ИмяФайла);
.
Результат = Чтение.Прочитать();
Возврат Результат;
ИмяФайлаДляОбработки = "C:\Файлы для обработки\Загрузка.xml";
ОписаниеОповещения = Новый ОписаниеОповещения(
"ОбработатьФайлЗавершение", ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);
&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
Данные = ПолучитьИзВременногоХранилища(Адрес);
ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("txt");
Данные.Записать(ИмяПромежуточногоФайла);
Чтение = Новый ЧтениеТекста(ИмяПромежуточногоФайла);
.
Результат = Чтение.Прочитать();
.
2. Для сохранения данных во временном хранилище между несколькими серверными вызовами, при помещении его в хранилище необходимо использовать параметр УникальныйИдентификаторФормы метода ПоместитьФайл , передав в него идентификатор текущей формы. Такие значения будут удалены из временного хранилища только при закрытии указанной формы. При этом, при повторном помещении того же файла во временное хранилище, предыдущее значение необходимо удалять вручную. Например:
.
// Первый серверный вызов
ИмяФайлаДляОбработки = "C:\Файлы для обработки\Загрузка.xml";
ОписаниеОповещения = Новый ОписаниеОповещения(
"ОбработатьФайлЗавершение", ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);
&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
.
Результат = ПроизвестиНачальнуюОбработкуНаСервере(Адрес);
ПродолжитьОбработкуФайла();
.
.
// Второй серверный вызов с той же версией файла
Результат = ПроизвестиПромежуточнуюОбработкуНаСервере(Адрес);
.
// Третий серверный вызов с новой версией файла
ОписаниеОповещения = Новый ОписаниеОповещения(
"ПродолжитьОбработкуФайлаЗавершение", ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);
Процедура ПродолжитьОбработкуФайлаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
При этом во временном хранилище формы останется две копии файлов. Адрес второй копии будет находиться в переменной Адрес , а адрес первой копии будет утерян. Это приводит к затрате дополнительных ресурсов приложения, замедлению работы.
.
// Первый серверный вызов
ИмяФайлаДляОбработки = "C:\Файлы для обработки\Загрузка.xml";
ОписаниеОповещения = Новый ОписаниеОповещения(
"ОбработатьФайлЗавершение", ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);
.
&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
.
Результат = ПроизвестиНачальнуюОбработкуНаСервере(Адрес);
ПродолжитьОбработкуФайла();
.
.
// Второй серверный вызов с той же версией файла
Результат = ПроизвестиПромежуточнуюОбработкуНаСервере(Адрес);
.
// Третий серверный вызов с новой версией файла
УдалитьИзВременногоХранилища(Адрес);
ОписаниеОповещения = Новый ОписаниеОповещения(
"ПродолжитьОбработкуФайлаЗавершение", ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);
&НаКлиенте
Процедура ПродолжитьОбработкуФайлаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
3. Если в конфигурацию встроена Библиотека стандартных подсистем для помещения файлов во временное хранилище необходимо использовать процедуры ЗагрузитьФайл и ЗагрузитьФайлы общего модуля ФайловаяСистемаКлиент . Для сохранения данных файла между несколькими серверными вызовами необходимо использовать свойство ИдентификаторФормы параметра ПараметрыЗагрузки :
&НаКлиенте
Процедура ОбработатьФайл()
.
ИмяФайлаДляОбработки = "C:\Файлы для обработки\Загрузка.xml";
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьФайлЗавершение", ЭтотОбъект);
ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
ПараметрыЗагрузки.Интерактивно = Ложь;
ФайловаяСистемаКлиент.ЗагрузитьФайл(ОписаниеОповещения,
ПараметрыЗагрузки, ИмяФайлаДляОбработки);
&НаКлиенте
Процедура ОбработатьФайлЗавершение(ПомещенныйФайл, ДополнительныеПараметры)
У надписи есть событие "Нажатие" - туда и вставляй открытие файла.
Большое спасибо что помогаете, но как открыть потом этот файл
Создаю форму элемента справочника:
Объект
Декорация надпись(флаг гипрессылака, надпись нажатие "текст процедуры".
как открыть прикрепленный файл? (чтобы при счелчке по кнопке открывался файл с жеского диска)
Спасибо огромное что помогаете!
К гиперссылке в восьмере не "прикрепишь".
Ход событий примерно такой:
Есть кнопка выбора файла (работу см. (2)). Есть список значений, структура, соответсвие (на выбор) где прописано связка ИмяГиперссылки-Файл. В обработчике нажатия гиперссылки ищешь свой файл и если он задан - открываешь.
Создаю форму элемента справочника:
Объект
Декорация надпись(флаг гипрессылака, надпись нажатие "текст процедуры".
Куда лезть чтобы его открыть или что где задать?
я уж не пойму куда проще разживать задачу. Вы подробно читали что написано?
нужна организация гиперсылки на внешний файл чтобы ПОЛЬЗОВАТЕЛЬ мог без заморок открыть файл по гиперссылке. как в ворде или в экселе гиперссылка на файл.
выше описал то что сделал по вашему совету (спасибо конечно что помогаете, но слова все связанные причем рускими буквами написанные . читайте как есть и смысл поймете.
Я написал что гиперссылку получается поставить, точнее открыть диалоговое окно и выбрать файл,
Как пользователь сможет открыть этот выбранный файл? на что жать? форме не хватает кнопки открытия этого файла как ее созадть?
//При нажатии на ссылку:
в кнопку открытия нужно вставить именно тот путь что мы брали кнопкой привязки.
а кнопка надпись или еще что там, все равно. Ктонибудь может написать как сделать или хотябы ссылку дать что почетать(просьба на радченко не ссылаться нету тама и на другие источники где нет тоже прошу ни кидать).
WScript.Shell. - если есть инфа как это сделать и красиво и самое главное чтобы работало напишите пожалуйста.
(15) ну открой любую обработку в типовых. Клиент-банк, например. Там все файлы открываются на раз, причем, ничего дополнительно делать не нужно.
(15) "Выбрать файл" - так же как в моём примере и реализовать.
Если под "Прикрепить файл" подразумевается "сохранить его в реквизите справочника", то:
Открытие файла в этом случае можно сделать так:
Вместо самого файла в справочнике можно хранить только ссылку на него (путь к нему). В этом случае, нужно будет учитывать то, что файлы могут перемещаться, изменяться, удаляться и т.п.
не прикрипить файл(мне не нужна раздутая картинками база,с проблемой переименования удаления и другими вопросами сам справлюсь), а прикрипить ссылку на внешний файл. И вторую кнопку чтобы открыть этот файл по ссылке(мне паралельно какой рограммой он откываться будет, вордом, экселем или как картинка, или в 1се.)
кто то посоветывал скачать типовую клиент-банк,буду искать скачивать, чтобы там
подглядеть как сделано. Вот ток вопрос, там точно как нужно "ссылка на файл" а не файл в базу. У меня уже есть пару конфигураций типа Документооборота, вот там в
базу файл кидается, а мне нужна именно ссылка на внешний файл.
Конечно лучше всего если есть у кого такая конфигурация киданите один справочник
в конфигурации, можно на мыло,если есть скажите, мыло напишу.
создаю: справочник, в нем реквизиты . реквезит СсылкаНаФайл(тип Хранилище занач)
дальше что добавить надо туда чтобы в реквизит СсылкаНаФайл добовлялась ссылка.
и как по кнопке, надписи, или еще какому нибудь элементу открыть тот файл, который перед этим выберается при счелчке по Ссылке(декорация)
(19) "СсылкаНаФайл" должна иметь тип значения строка!
>дальше что добавить надо туда чтобы в реквизит СсылкаНаФайл добовлялась ссылка.
P.S.: mir-mup, ты из какой страны? Пойму, если не русский, но если русский, старайся писать так, чтобы было понятно, тем, кто будет это читать. Если бы я тебе в ответ написал что-нибудь типа:
Ссылка на файл текстовый дальше что надо добавить ссылка на файл присвоить диалог полное имя файла.
Ты понял бы, что я имею ввиду.
дальше что добавить надо туда, чтобы в реквизит "СсылкаНаФайл" добовлялась ссылка.
уважаемый учитель русского языка. У меня всегда была тройка. И теперь нужна тройка, если поставите можно и двойка - три или две кнопки.
кнопка1(прикрипить гиперссылку) Кнопка2(открыть файл) Кнопка3(Очистить)
Пожалуйста ни придирайтесь к запятым, если можете помочь по вопросу помогите, если нет то может кто знает как это сделать и все же научит.
Мир не без добрых людей.
Для второй кнопки текст уже имеется в примере, подставляй туда значение реквизита "СсылкаНаФайл".
Не получается строку в реквизит записать, чтобы потом прочитать его.
две дикорации одна пивязывает ссылку другая открывает ссылку. при открытой форме все работает. После закрытия формы ссылка стирается. Если можете, прошу помогите.
(23) А где у тебя записывается элемент справочника с измененным значением реквизита?
Ты открыл форму элемента справочника, присвоил что-то там, не записал и закрыл. Естественно, при следующем открытии формы в реквизите ничего не будет.
В открывшемся окне в поле «Объект» через три точки выберем объект, по которому нужен анализ.
К примеру, нужно проверить, в каких документах вносились изменения тем или иным пользователем. Для этого в поле «Объект» выберем «Пользователь»:
Получите понятные самоучители по 1С бесплатно:
Открывается дополнительное окно, в котором указаны все пользователи данной программы. Выберем «Белкина Анна Григорьевна»:
По кнопке «Найти ссылки» программа выдает все справочники, документы, регистры, в которых записан выбранный нами пользователь.
Дополнительно есть возможность в полученных ссылках найти тот или иной документ, к примеру, «Начисление зарплаты», по кнопке «Найти».
В результате получим.
Т.е. в нашем случае под пользователем «Белкина Анна Григорьевна» был создан только один документ начисления зарплаты. Такая информация может понадобиться руководству для контроля за сотрудниками.
Также обработка будет полезна и в других случаях. Например, при дублировании номенклатуры (для удаления ненужного элемента) или поиска мест использования помеченных на удаление элементов справочников (для исправления учетных данных в базе).
Читайте также: