1с прочитать файл на сервере
Табличный документ - предназначен для формирования печатных форм первичных документов, отчетов, при размещении на форме также может использоваться в качестве средства интерактивного ввода данных. Табличные документы вида "Макет" служат прообразами для других табличных документов. Макеты могут содержать параметры, предназначенные для заполнения конкретными данными. Перед выводом области макета в результирующую таблицу параметрам можно присвоить значения и результаты выражений. Также макеты могут иметь параметры расшифровки, значения которых задаются аналогично параметрам. Расшифровка не влияет на внешний вид результирующей таблицы и используется для создания связанных отчетов, открытия форм или иных действий.
Создал реквизит формы с типом ТабличныйДокумент , вынес на форму сам реквизит и его командную панель и ужаснулся, команда Сохранить есть, а команда Открыть отсутствует.
Стандартные команды табличного документа |
Спасибо разработчикам платформы 1С, они предоставили разработчиками две замечательные функции: ПоместитьФайл и ПоместитьФайлы . Эти функции умеют помещать файлы из локальной файловой системы во временное хранилище. Более детальное описание функций приводить не буду, слишком много строк, просто покажу как работать с функцией ПоместитьФайл на примере открытия файла табличного документа.
Пишем код для команды, которая выполняется на клиенте
&НаКлиенте
Процедура ЗагрузитьПечатнуюФорму(Команда)
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Текст = "ru = ""Табличный документ""; en = ""Spreadsheet document""";
Фильтр = НСтр(Текст)+"(*.mxl)|*.mxl";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файл табличного документа";
Если ДиалогОткрытияФайла.Выбрать() Тогда
ВыбраныйФайл = ДиалогОткрытияФайла.ПолноеИмяФайла;
АдресВременногоХранилища = "";
ПоместитьФайл(АдресВременногоХранилища, ВыбраныйФайл, , Ложь, ЭтаФорма.УникальныйИдентификатор);
ПечатнаяФормаПрочитать(АдресВременногоХранилища);
КонецЕсли;
КонецПроцедуры
Подготавливаем диалог выбора файла и вызываем функцию ПоместитьФайл . После передаем выполнение кода на сервер вызовом процедуры ЗагрузитьПечатнуюФорму .
Создаем процедуру для вызова метода Прочитать, которая выполняется на сервере
&НаСервере
Процедура ПечатнаяФормаПрочитать(АдресВременногоХранилища)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("mxl");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ЭтаФорма.ПечатнаяФорма.Прочитать(ИмяВременногоФайла);
Попытка
УдалитьФайлы(ИмяВременногоФайла);
Исключение
КонецПопытки;
КонецПроцедуры // ПечатнаяФормаПрочитать()
Получаем из временного хранилища двоичные данные файла, сохраняем их во временный файл и вызываем метод Прочитать .
Все просто, единственный минус, это передача файла с клиента на сервер, и чем больше файл и меньше скорость интернета, тем дольше будет выполняться загрузка табличного документа.
Для работы с файлами требуется понимание работы платформы и некоторых новшеств.
При необходимости сохранять файлы на сервере, у пользователя, под которыми запущена служба сервера 1С, должен быть доступ на соответствующие каталоги.
Файлы будем хранить в конфигурации в клиент серверной версии 8.3.
Для хранения файлов будем использовать реквизит с типом "ХранилищеЗначения".
Особенностью данного реквизита является его недоступность на клиенте, поэтому работу с ним необходимо проводить только на сервере.
Концепция загрузки с клиента на сервер следующая:
1. Загружаем файлы от клиента на сервер помещая их во временное хранилище
2. На клиенте сохраняем адрес
3. При записи объекта на сервере сохраняем файл в базу данных
Пройдем более детально:
Загрузка файла происходит во временное хранилище на сервере и не передается с контекстом на клиент.
Для передачи адреса файла создадим отдельную переменную формы типа строка, назовем ее "АдресЗагруженногоФайла".
Перед загрузкой нужно получить от пользователя разрешение на работу с его файловой системой.
Для загрузки с клиента на сервер файла используем типовой метод "НачатьПомещениеФайла".
При работе с ним нужно учесть один момент - файл загружается во временное хранилище на сервер и на клиент передается адрес этого хранилища.
Этот адрес необходимо сохранить чтобы файл можно было найти на сервере.
Для этого используем переменную формы "АдресЗагруженногоФайла".
У нас есть адрес файла на сервере но нет доступа к реквизиту с типом "ХранилищеЗначений" на клиенте.
Для записи в этот реквизит перед записью на сервере получим файл из временного хранилище и положим в реквизит.
Загрузка файла в базу данных готова.
Концепция выгрузки с сервера на клиента следующая:
1. Файл достаем с реквизита и ложим во временное хранилище
2. Передаем с сервера на клиент адрес
3. Сохраняем файл на клиенте
Для работы с файлами на клиенте нужно получить от пользователя разрешение на работу с его файловой системой.
На сервере готовим метод который вытащит файл из реквизита и положит во временное хранилще
Используем типовой метод "НачатьПолучениеФайлов" для передачи файла с сервера на клиента.
В него необходимо передать массив получаемых файлов.
В этом массиве необходимо указать адреса нахождения файлов на сервере или адреса временных хранилищ файлов.
Во время работы файлы будут загружены по этим адресам и положены в массиве "ПолученныеФайлы" во временные хранилища.
На клиенте из этих хранилищ достаем файлы и сохраняем.
Время неумолимо идёт вперёд, а платформа 1С 8 бежит ещё быстрей этого времени.
Управляемые формы теперь называются "интерфейс ТАКСИ", модальные окна запрещены, а режим использования синхронных вызовов расширений и внешних компонент наглухо положил работоспособность большинства этих расширений и внешних компонент, и половину старых методов в добавок.
В общем, пацаны, дела такие - многие из вас читали статью великолепного Чистова П. о работе с файлами в 8.3
Если Вы ещё этого не сделали - бегом марш! (ссылка)
Суть механизма работы с файлами в кратце:
1) На клиенте выбираем файл
2) Пихаем его в чёрный ящик
3) Сохраняем содержимое чёрного ящика на сервере
Загвоздка состоит в том, что делать это надо особенно, по-новому и с душой.
и прочие языческие штучки здесь не прокатят.
Вот листинг кода, который позволяет загрузить файл с клиента
Нас интересует метод "НачатьПомещениеФайлов", который, собственно, вызывает диалог выбора файла и помещает этот файл во временное хранилище. Заморачиваться с описанием временного хранилища нет смысла, просто запомните - это то место, куда помещаются все выбранные нами файлы в виде двоичных данных (черный ящик).
Понять, что там и как храниться в этом временном хранилище практически невозможно. Можно только обратиться к нашему файлу по навигационной ссылке, которая присваивается автоматически (см. переменную "Адрес").
С тем, что файлы нужно хранить в реквизите или ресурсе с типом "Хранилище значения", спорить, думаю, никто не будет. Достать файл из временного хранилища и поместить его в реквизит с типом "Хранилище значения" можно след.образом:
С одним разобрались, теперь второе - как достать файл из этого хранилища значений (которое, напомню, находится на сервере) и сохранить на диск клиента?
Прежде всего, нам надо получить навигационную ссылку на реквизит с типом "Хранилище значения", куда у нас помещается файл в виде бинарных данных.
Будьте, внимательны! Эта навигационная ссылка уже не имеет с временным хранилищем ничего общего! Проверить тип навигационной ссылки можно методом
По традиции, листинг кода, который вызывает диалог сохранения файла
Значение переменной "Файл" это ещё одна особенность данного способа. Здесь стоит обратить внимание на "ИмяФайла". Дело в том, что помещая файл во временное хранилище, информация о его имени и расширении теряется. Поэтому не забудьте где-нибудь сохранять корректное имя файла, или хотя бы его расширение, чтобы потом не мучаться с вопросом "А это вордовский документ или мп3?"
Метод "НачатьПолучениеФайлов" аналогичен методу "НачатьПомещениеФайлов". Просто один открывает диалог для выбора файла, другой же, наоборот, открывает диалог для сохранения файла.
При использовании данного способа, никакие совместимости модальности и синхронных вызовов в свойствах конфигурации устанавливать не нужно.
Работа с FTP-сервером в 1С:Предприятии 8.x
Платформа 1С:Предприятие 8.x имеет в своем составе собственный FTP-клиент. Очень часто его используют для передачи файлов обмена между компьютерами по сети.
Сегодня в статье напишем небольшую обработку с функциями чтения списка файлов на FTP-сервере, а также загрузки и сохранения файлов.
Обработка
Как уже говорилось ранее, обработка будет получать список файлов, а также загружать файлы на FTP-сервер и скачивать их.
Внешне форма обработки выглядит следующим образом:
Структура метаданных обработки следующая:
В табличной части "Файлы" записывается список файлов на FTP-сервере, а в реквизитах обработки вводится информация для аутентификации на FTP-сервере и его адрес. Перейдем к рассмотрению работы обработки.
Получение списка файлов
Листинг команды получения списка файлов следующий:
В конструктор FTP-соединения передаются введенные в реквизиты данные для соединения с FTP-сервером. Метод "НайтиФайлы" получает список файлов в заданном каталоге (первый параметры). Второй параметр - строка шаблона для поиска файлов.
Загрузка файла на FTP-сервер
Программный код достаточно простой:
Выбирается файл на диске и с помощью метода "Записать" передается на сервер. Первый параметр - путь к файлу на диске, второй - имя файла на FTP-сервере.
Загрузка файла с сервера
Посмотрим программный код команды:
Общий принцип тот же. Сначала пользователь выбирает путь сохранения файла, затем этот путь передается в метод "Получить" во второй параметр. В первом параметре указывается путь к файлу на FTP-сервере.
Задача решена
На этом задачу можно считать решенной. Обработку из примера Вы можете скачать по ссылке .
Иногда так случается, что код, выполняемый на сервере, выгружает файлы во временную папку сервера, а они нужны на клиенте. А всё из-за разделения выполнения кода на два контекста: на сервере и на клиенте. Что бы побороть эту проблему, в арсенале платформы 1С имеются две функции: ПолучитьФайл и ПолучитьФайлы. Эти функции получают набор файлов и сохраняют их в локальную файловую систему пользователя. Более подробнее описание смотри в синтакс-помощнике.
Допустим, имеется обработка с макетами, которые хранят файлы в виде двоичных данных. Необходимо сохранить эти файлы во временную папку локального компьютера. Всё бы хорошо, только доступ к макетам доступен в контексте сервера. Приступим к реализации задачи.
Сперва, на сервере получаем двоичные данные файлов и помещаем их во временное хранилище, адреса файлов во временном хранилище записываем в массив:
// Функция помещает двоичные данные файлов во временное хранилище.
//
// Возвращаемое значение:
// Массив - массив с двоичными данными файлов.
//
&НаСервере
Функция ПолучитьФайлыИзМакетов()
АдресаВоВременномХранилище = Новый Массив;
ОбрОбъект = РеквизитФормыВЗначение("Объект");
ДД_Макет1 = ОбрОбъект.ПолучитьМакет("Макет1");
АдресаВоВременномХранилище.Добавить(ПоместитьВоВременноеХранилище(ДД_Макет1, ЭтаФорма.УникальныйИдентификатор));
ДД_Макет2 = ОбрОбъект.ПолучитьМакет("Макет1");
АдресаВоВременномХранилище.Добавить(ПоместитьВоВременноеХранилище(ДД_Макет2, ЭтаФорма.УникальныйИдентификатор));
Возврат АдресаВоВременномХранилище;
Что такое РеквизитФормыВЗначение и с чем его едят читать здесь.
Далее все действия по получению файлов выполняем на клиенте, следующий код довольно самодокументируемый, поэтому описывать его принцип работы не буду:
&НаКлиенте
Процедура ОткрытьФайлы(Команда)
ФайлыМакетов = ПолучитьФайлыИзМакетов();
// Создаем описание получаемых файлов.
ОписанияФайлов = Новый Массив;
Для Каждого ФайлМакета Из ФайлыМакетов Цикл
ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПолучитьИмяВременногоФайла(), ФайлМакета);
ОписанияФайлов.Добавить(ОписаниеФайла);
КонецЦикла;
// Сохраняем файлы из временного хранилища в локальную файловую систему.
ПолученныеФайлы = Новый Массив;
ПолучитьФайлы(ОписанияФайлов, ПолученныеФайлы, , Ложь);
// Открываем файлы.
Для Каждого ПолученныйФайлы Из ПолученныеФайлы Цикл
ЗапуститьПриложение(ПолученныйФайлы.Имя);
КонецЦикла;
КонецПроцедуры
Читайте также: