АйТиБложик
Иногда так случается, что код, выполняемый на сервере, выгружает файлы во временную папку сервера, а они нужны на клиенте. А всё из-за разделения выполнения кода на два контекста: на сервере и на клиенте. Что бы побороть эту проблему, в арсенале платформы 1С имеются две функции: ПолучитьФайл и ПолучитьФайлы. Эти функции получают набор файлов и сохраняют их в локальную файловую систему пользователя. Более подробнее описание смотри в синтакс-помощнике.
Допустим, имеется обработка с макетами, которые хранят файлы в виде двоичных данных. Необходимо сохранить эти файлы во временную папку локального компьютера. Всё бы хорошо, только доступ к макетам доступен в контексте сервера. Приступим к реализации задачи.
Сперва, на сервере получаем двоичные данные файлов и помещаем их во временное хранилище, адреса файлов во временном хранилище записываем в массив:
// Функция помещает двоичные данные файлов во временное хранилище.
//
// Возвращаемое значение:
// Массив — массив с двоичными данными файлов.
//
&НаСервере
Функция ПолучитьФайлыИзМакетов()
АдресаВоВременномХранилище = Новый Массив;
ОбрОбъект = РеквизитФормыВЗначение(«Объект»);
ДД_Макет1 = ОбрОбъект.ПолучитьМакет(«Макет1»);
АдресаВоВременномХранилище.Добавить(ПоместитьВоВременноеХранилище(ДД_Макет1, ЭтаФорма.УникальныйИдентификатор));
ДД_Макет2 = ОбрОбъект.ПолучитьМакет(«Макет1»);
АдресаВоВременномХранилище.Добавить(ПоместитьВоВременноеХранилище(ДД_Макет2, ЭтаФорма.УникальныйИдентификатор));
Возврат АдресаВоВременномХранилище;
Что такое РеквизитФормыВЗначение и с чем его едят читать здесь.
Далее все действия по получению файлов выполняем на клиенте, следующий код довольно самодокументируемый, поэтому описывать его принцип работы не буду:
&НаКлиенте
Процедура ОткрытьФайлы(Команда)
ФайлыМакетов = ПолучитьФайлыИзМакетов();
// Создаем описание получаемых файлов.
ОписанияФайлов = Новый Массив;
Для Каждого ФайлМакета Из ФайлыМакетов Цикл
ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПолучитьИмяВременногоФайла(), ФайлМакета);
ОписанияФайлов.Добавить(ОписаниеФайла);
КонецЦикла;
// Сохраняем файлы из временного хранилища в локальную файловую систему.
ПолученныеФайлы = Новый Массив;
ПолучитьФайлы(ОписанияФайлов, ПолученныеФайлы, , Ложь);
// Открываем файлы.
Для Каждого ПолученныйФайлы Из ПолученныеФайлы Цикл
ЗапуститьПриложение(ПолученныйФайлы.Имя);
КонецЦикла;
КонецПроцедуры
1С 8.3 Файлы, каталоги — Программист 1С Минск. Автоматизация бизнеса.
✔ Чтение и запись файлов
&НаСервере
Процедура ЧтениеИЗаписьФайлов ()
// Любое сериализуемое значение (массив, структура, таблица значений, строки. ) можно сохранить в файл
НаборСимволов = Новый Массив ;
НаборСимволов . Добавить ( 125 );
НаборСимволов . Добавить ( «А» );
НаборСимволов . Добавить ( «99» );
НаборСимволов . Добавить ( «%» );
ЗначениеВФайл ( «D:\Symbol.txt» , НаборСимволов ); // работает только на &НаСервере
// Восстановление произвольных значений из файла
НаборСимволовИзФайла = ЗначениеИзФайла ( «D:\Symbol.txt» );
Сообщить ( НаборСимволовИзФайла [ 0 ]); // 125
Сообщить ( НаборСимволовИзФайла [ 1 ]); // А
Сообщить ( НаборСимволовИзФайла [ 2 ]); // 99
Сообщить ( НаборСимволовИзФайла [ 3 ]); // %
&НаКлиенте
Процедура ОперацииНадФайлами ( Команда )
// Создание переменных (имя и путь к файлу)
ПутьКФайлу_Test = «D:\Test.txt» ;
ПутьКФайлу_Copy = «D:\Copy.txt» ;
// Создание пустого файла
ТекстФайл = Новый ЗаписьТекста ();
ТекстФайл . Закрыть ();
// Проверка на существование файла
ТекстФайл = Новый Файл ( ПутьКФайлу_Test );
Если ТекстФайл . Существует () Тогда
Сообщить ( ПутьКФайлу_Test + » существует!» );
КонецЕсли;
// Копирование файла. Параметры: Какой файл копируем, Куда файл копируем
КопироватьФайл ( ПутьКФайлу_Test , ПутьКФайлу_Copy ); // Если файл существует, то перезапишет
// Перемещение файла. Параметры: Какой файл копируем, Куда файл копируем
ПереместитьФайл ( ПутьКФайлу_Test , ПутьКФайлу_Copy ); // Если файл существует, то перезапишет
// Поиск файлов в каталоге (функция возвращает массив значений)
// Параметры: Каталог поиска, Маска поиска, Поиск и в подкаталогах
МассивФайлов = НайтиФайлы ( «D:\» , «*.txt» , Ложь);
Для Каждого ТекФайл Из МассивФайлов Цикл
Сообщить ( «Найден файл: » + ТекФайл . ПолноеИмя );
КонецЦикла;
// Удаление файла
УдалитьФайлы ( ПутьКФайлу_Test ); // Если файл с параметром только для чтения, то будет ошибка
// Удаление файлов в каталоге по маске
// поиск в каталоге нерекурсивный
УдалитьФайлы ( «D:\» , «*.txt» ); // Если маски нет, то удалятся все файлы и сам каталог
// Получение имя временного файла
ПолучитьИмяВременногоФайла (); // Например, C:\Temp\H_kImX035.tmp
ПолучитьИмяВременногоФайла ( «.txt» ); // Например, C:\Temp\H_kImX035.txt
&НаКлиенте
Процедура ПолучениеИИзменениеАтрибутовФайла ( Команда )
ТекстФайл = Новый Файл ( «D:\Test.txt» );
// Чтение атрибутов
ТекстФайл . ПолучитьВремяИзменения (); // время последнего изменения файла
ТекстФайл . ПолучитьТолькоЧтение (); // проверяем атрибут только чтение
ТекстФайл . ПолучитьНевидимость (); // проверяем атрибут hidden (скрытность, невидимость)
ТекстФайл . Размер (); // размер файла в байтах
// Получение расширение файла из его пути
ТекстФайл . Расширение (); // .txt
// Получение имени файла без расширения
ТекстФайл . ИмяБезРасширения (); // Test
// Получение информации по пути файла — это файл или каталог
Если ТекстФайл . ЭтоКаталог () Тогда
// Это каталог
ИначеЕсли ТекстФайл . ЭтоФайл () Тогда
// Это файл
КонецЕсли;
// Изменение атрибутов
ТекстФайл . УстановитьВремяИзменения ( ТекущаяДата ()); // меняем время последнего изменения файла
ТекстФайл . УстановитьТолькоЧтение (Ложь); // меняем атрибут только чтение
ТекстФайл . УстановитьНевидимость (Ложь); // меняем атрибут невидимости
&НаКлиенте
Процедура ОперацииНадКаталогами ( Команда )
//Создание каталога (он может уже существовать)
СоздатьКаталог ( «D:\Catalog» );
//Создание подкаталогов
СоздатьКаталог ( «D:\Catalog\2020\1» );
// Проверка существования каталога
Каталог = Новый Файл ( «D:\Catalog» );
Если Каталог . Существует () Тогда
Сообщить ( «Каталог по пути D:\Catalog существует!» );
КонецЕсли;
// Удаление каталога (вместе с файлами и подкаталогами)
УдалитьФайлы ( «D:\Catalog» ); // Можно добавить максу
// Получение каталога временных файлов
КаталогВременныхФайлов (); // Например, C:\Windows\Temp
&НаКлиенте
Процедура ОперацииСВременнымХранилищем ( Команда )
// Временное хранилище позволяет передавать данные,
// которые иначе не передать (произвольного типа) между сервером и клиентом
// Сохранение произвольного значения (списка значений) во временном хранилище
СЗ = Новый СписокЗначений ;
СЗ . Добавить ( «Арбуз» );
СЗ . Добавить ( «Дыня» );
СЗ . Добавить ( «Яблоко» );
АдресВХранилище = ПоместитьВоВременноеХранилище ( СЗ );
// Чтение произвольного значения (списка значений) из временного хранилища
СЗИзХранилища = ПолучитьИзВременногоХранилища ( АдресВХранилище );
Если СЗИзХранилища = Неопределено Тогда
Сообщить ( «Значение по этому адресу из хранилища уже удалено!» );
Иначе
Сообщить ( СЗИзХранилища [ 0 ]); // Арбуз
КонецЕсли;
// Перезапись уже сохраненного значения (массив) во временном хранилище
НаборСимволов = Новый Массив ;
НаборСимволов . Добавить ( 125 );
НаборСимволов . Добавить ( «А» );
НаборСимволов . Добавить ( «99» );
НаборСимволов . Добавить ( «%» );
// Время хранения зависит от параметра «АдресВХранилище» функции ПоместитьВоВременноеХранилище
ПоместитьВоВременноеХранилище ( НаборСимволов , АдресВХранилище );
// Если адрес — уникальный идентификатор формы или существующий адрес в хранилище:
// Значение будет удалено после закрытия формы
ПоместитьВоВременноеХранилище ( НаборСимволов , ЭтаФорма . УникальныйИдентификатор );
// Если адрес — уникальный идентификатор, не являющийся уникальным идентификатором формы %
// Значение будет удалено после завершения сеанса пользвоателя
ПоместитьВоВременноеХранилище ( НаборСимволов , Новый УникальныйИдентификатор );
// Если адрес не указан:
// Значение будет удалено после очередного запроса сервера
ПоместитьВоВременноеХранилище ( НаборСимволов );
// Удаление значения из временного хранилища
УдалитьИзВременногоХранилища ( АдресВХранилище );
// Проверка является ли строка адресом во временном хранилище
Если ЭтоАдресВременногоХранилища ( АдресВХранилище ) Тогда
// Это адрес во временном хранилище
КонецЕсли;
&НаКлиенте
Процедура ПередачаФайлаСКлиентаНаСервер ( Команда )
ТекстФайл = Новый ЗаписьТекста ( «D:\Prostokvashino.txt» );
ТекстФайл . ЗаписатьСтроку ( «Кот Матроскин» );
ТекстФайл . ЗаписатьСтроку ( «Дядя Федор» );
ТекстФайл . ЗаписатьСтроку ( «Шарик» );
ТекстФайл . Закрыть ();
Завершено = Новый ОписаниеОповещения ( «ПослеПередачи» , ЭтотОбъект );
// Параметр УникальныйИдентификаторФормы — если не указывать — то файл будет удален после очередного запроса сервера
// если указать — то после удаления объекта формы
// Параметр Интерактивно (Истина) — дает пользователю выбрать файл самому
НачатьПомещениеФайла ( Завершено , , «D:\Prostokvashino.txt» , Ложь, ЭтаФорма . УникальныйИдентификатор );
&НаКлиенте
Процедура ПослеПередачи ( Результат , ХранимыйАдрес , ВыбранноеИмяФайла , ДопПараметры ) Экспорт
Если Результат Тогда
// Сохранение полученного адреса в реквизите формы (строка) — адрес файла в хранилище на сервере
АдресФайлаВХранилище = ХранимыйАдрес ;
Сообщить ( «Файл » + ВыбранноеИмяФайла + » передан на сервер и сохранён во временном хранилище. Адрес: » + ХранимыйАдрес );
Иначе
Сообщить ( «Ошибка передачи файла на сервер!» );
КонецЕсли;
1с получить файл с сервера на клиент
Метод работает в асинхронном режиме. Возможны два варианта выбора файла для передачи на сервер:
- интерактивной режим, при котором пользователю будет выдан диалог выбора файла;
- неинтерактивный режим, при котором уже известен путь к требуемому файлу на компьютере клиента. Такое возможно, например, когда пользователь в отдельном поле ввода выбрал путь к обрабатываемому файлу. Такой сценарий описан в этой статье.
Параметр ОписаниеОповещенияОЗавершении содержит описание процедуры (тип ОписаниеОповещения), которая будет вызвана после завершения помещения файла во временное хранилище. Эта процедура должна иметь ключевое слово Экспорт и 4 параметра:
- Результат — для интерактивного режима возвращает результат работы пользователя с окном выбора файла. Истина — пользователь выбрал файл; Ложь — пользователь отказался от выбора;
- Адрес — адрес временного хранилища;
- ПомещаемыйФайл — путь к файлу;
- ДополнительныеПараметры — значение, указанное при создании объекта ОписаниеОповещения.
Следует обратить внимание на параметр УникальныйИдентификаторФормы. В него рекомендуется передавать идентификатор текущей формы для сохранения данных во временном хранилище между несколькими серверными вызовами. При закрытии формы данные из временного хранилища будут автоматически удалены.
Неинтерактивная передача файла на сервер
Рассмотрим пример неинтерактивной передачи файла на сервер, без вызова окна выбора файла:
&НаКлиенте
Процедура ЗагрузитьФайл ( Команда )
ИмяФайлаДляОбработки = «C:ДанныеДляЗагрузки.xml» ;
// Описание процедуры, которая будет вызвана помещения файла во временное хранилище
ОписаниеОповещения = Новый ОписаниеОповещения ( «ЗагрузитьФайлЗавершение» , ЭтотОбъект );
// Начало помещение файла из файловой системы во временное хранилище
НачатьПомещениеФайла ( ОписаниеОповещения , , ИмяФайлаДляОбработки , Ложь, УникальныйИдентификатор );
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение ( Результат , Адрес , ВыбранноеИмяФайла , ДополнительныеПараметры ) Экспорт
&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере ( Адрес )
// Получение данных из временного хранилища
Данные = ПолучитьИзВременногоХранилища ( Адрес );
// Получение имени временного файла
ИмяВременногоФайла = ПолучитьИмяВременногоФайла ( «xml» );
// Сохранение данных во временный файл
Данные.Записать ( ИмяВременногоФайла );
// Хорошим тоном будет удалить временный файл
Попытка
При интерактивном выборе файла дополнительно необходимо предусмотреть два момента:
- указать настройки диалога выбора файла (если требуется);
- проверять, что пользователь действительно выбрал файл.
Интерактивная передача файла на сервер
Рассмотрим, пример интерактивной передачи файла на сервер:
&НаКлиенте
Процедура ЗагрузитьФайлИнтерактивно ( Команда )
// Описание процедуры, которая будет вызвана после закрытия окна выбора файла
ОписаниеОповещения = Новый ОписаниеОповещения ( «ЗагрузитьФайлЗавершение» , ЭтотОбъект );
// Описание диалога выбора файла
Диалог = Новый ДиалогВыбораФайла ( РежимДиалогаВыбораФайла . Открытие );
Диалог . Фильтр = НСтр ( «ru=’Файл XML (*.xml)|*.xml’» );
// Начало помещение файла из файловой системы во временное хранилище
НачатьПомещениеФайла ( ОписаниеОповещения , , Диалог , Истина, УникальныйИдентификатор );
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры ) Экспорт
// Файл выбран
ВыполнитьЗагрузкуНаСервере ( Адрес );
// Пользователь отказался от выбора файла
Сообщить ( «Файл не был выбран» );
Процедура ВыполнитьЗагрузкуНаСервере при интерактивном и неинтерактивном режимах одинаковая.
Передача файла на сервер средствами БСП
В конфигурациях со встроенной Библиотекой стандартных подсистем для передачи файлов с клиента на сервер можно использовать процедуры
ЗагрузитьФайл ( ОбработчикЗавершения , ПараметрыЗагрузки = Неопределено, ИмяФайла = «» , АдресВоВременномХранилище = «» ) Экспорт
ЗагрузитьФайлы ( ОбработчикЗавершения , ПараметрыЗагрузки = Неопределено, ЗагружаемыеФайлы = Неопределено) Экспорт
общего модуля ФайловаяСистемаКлиент или
ВыбратьИПередатьФайлНаСервер ( ОповещениеЗавершения , Знач ПараметрыДиалога = Неопределено, Знач ИдентификаторФормы = Неопределено) Экспорт
общего модуля ОбменДаннымиКлиент.
Пример интерактивной загрузки файла на сервер средствами БСП:
&НаКлиенте
Процедура ЗагрузитьФайлИнтерактивно ( Команда )
ПараметрыДиалога = Новый Структура ;
ПараметрыДиалога . Вставить ( «Заголовок» , НСтр ( «ru = ‘Выберите файл XML’» ));
ПараметрыДиалога . Вставить ( «Фильтр» , НСтр ( «ru=’Файл XML (*.xml)|*.xml’» ));
Оповещение = Новый ОписаниеОповещения ( «ЗагрузитьФайлЗавершение» , ЭтотОбъект );
ОбменДаннымиКлиент . ВыбратьИПередатьФайлНаСервер ( Оповещение , ПараметрыДиалога , УникальныйИдентификатор );
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение (Знач РезультатПомещенияФайлов , Знач ДополнительныеПараметры ) Экспорт
Адрес = РезультатПомещенияФайлов . Хранение ;
ТекстОшибки = РезультатПомещенияФайлов . ОписаниеОшибки ;
ИмяВыбранногоФайла = РезультатПомещенияФайлов . Имя ;
Если ПустаяСтрока ( ТекстОшибки ) И ПустаяСтрока ( Адрес ) Тогда
ТекстОшибки = НСтр ( «ru = ‘Ошибка передачи файла на сервер’» );
Если НЕ ПустаяСтрока ( ТекстОшибки ) Тогда
ОбщегоНазначенияКлиентСервер . СообщитьПользователю ( ТекстОшибки );
Возврат;
Остались вопросы?
Спросите в комментариях к статье.
Guesto notes
Задача
Необходимо организовать сохранение файлов web-клиенте(браузере) и тонком клиенте через web. Для наглядности будем решать более узкую задачу, будем организовывать сохранение табличного документа в MS Excel.
Решение
Для наглядности будем решать более узкую задачу, будем организовывать сохранение табличного документа в MS Excel.
- Создадим табличный документ с произвольным текстом;
- Если работа производится на web-клиенте, то попытаемся подключить расширение работы с файлами;
- Поместим табличный документ во временной хранилище как файл MS Excel;
- Для сохранение файла воспользуемся функцией ПолучитьФайл(), который получает файл и сохраняет его в локальную файловую систему.
В итоге имеем следующий код:
При выполнении команды СохранитьФайл() получим диалог с вариантами сохранить или открыть получаемый файл
При выборе варианта «Открыть»
При выборе варианта «Сохранить»
Комментарии 3
Спасибо за статью! Пригодилось.
Алексей, рад что пригодилось!
Обратите внимание, что в статье используются методы УстановитьРасширениеРаботыСФайлами() и ПодключитьРасширениеРаботыСФайлами(), в настоящее время правильнее использовать НачатьУстановкуРасширенияРаботыСФайлами() и НачатьПодключениеРасширенияРаботыСФайлами().
По возможности поправлю статью)
Спасибо огромное!
Небольшое замечание:
Попытка
ТабличныйДокумент.Записать(ИмяФайла, ТипФайла);
АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));
Подправленная строка
АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификатор);
Подправленная строка
Без этого исправления вылетала ошибка 400
Исключение
ВызватьИсключение;
КонецПопытки;
Ситуация: пользователь на клиенте выбирает файл, и его нужно обработать. Удобнее всего это сделать на сервере, т.к. на клиенте многие функции и процедуры не доступны. Реализовать это возможно помещение данных во временное хранилище, а далее из него, при вызове серверной процедуры, «обратное» изьятие. Например реализовать это можно как-то вот так:
Комментарии:
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.
Работа с FTP в 1С 8.2 и 8.3
В этой статье я попробую рассказать о том, какими средствами располагает технологическая платформа 1С для работы с протоколом FTP. Первая часть статьи — теоретическая, вторая — практические примеры. Отмечу, что при написании статьи использовалась технологическая платформа версии 8.3.12.1595.
Общая информация
Для работы с протоколом FTP у технологической платформы 1С имеется два главных объекта — FTPСоединение и FTPФайл, кроме них существует объект ЗащищенноеСоединениеOpenSSL — который используется для подключения к FTPS-серверам (не следует путать с SFTP), а также объект ИнтернетПрокси — который используется для соединения с FTP-сервером через прокси-сервер.
FTPСоединение ключевой объект для работы с FTP в 1С — именно через этот объект происходит и соединение с FTP/FTPS сервером и все дальнейшие действия. Все параметры для соединения с сервером указываются в конструкторе объекта.
FTPФайл служит для получения информации о каталогах и файлах на FTP-сервере — этот объект позволяет получить информацию по объекту на FTP-сервере: имя, путь расширение, размер и тд.
ИнтернетПрокси позволяет указать прокси-сервер используемый для соединения с FTP/FTPS сервером — параметры для подключения к прокси-серверу указываются методом Установить(). Использование свойств «Пароль» и «Пользователь» нежелательно, так как эти свойства являются устаревшими.
ЗащищенноеСоединениеOpenSSL создает защищенное соединение OpenSSL — предоставляет возможность организовать защищенное соединение с FTP-сервером, также имеется возможность конкретный сертификат клиента и/или сертификат удостоверяющего центра.
Практические задачи при работе с FTP
В качестве практических примеров рассмотрим все операции которые позволяет выполнить объект FTPСоединение.
Как подключиться к серверу FTP?
Параметры для подключения указываются в конструкторе, сами параметры достаточно стандартны. Отдельно скажу про два параметра: