132 документа
← К списку

Глава 21. Механизм временного хранилища, работа с файлами и картинками

страница

Глава 21. Механизм временного хранилища, работа с файлами и картинками

21.1. Временное хранилище

В «1С:Предприятии» существует механизм работы с временным хранилищем, обеспечивающий хранение некоторых данных, привязанных к сеансу. Кроме того, реализован механизм работы с файлами, который обеспечивает обмен файлами между информационной базой и клиентским приложением. Особенностью данного механизма является то, что он ориентирован на использование в тонком клиенте и веб-клиенте и разработан с учетом ограничений на работу с файлами, накладываемых веб-браузерами.

Временное хранилище ‑ это специализированное хранилище информации, в которое может быть помещено значение. Основное назначение ‑ это временное хранение информации при клиент-серверном взаимодействии до ее переноса в базу данных. Механизм временного хранилища совместно с механизмом работы с файлами предоставляет набор методов, с помощью которого можно поместить данные, хранящиеся локально у пользователя, во временное хранилище информационной базы, перенести эту информацию из временного хранилища в базу данных и получить ее обратно на компьютер пользователя. Наиболее распространенные прикладные задачи, решаемые этими механизмами, ‑ это хранение сопроводительной информации, например, изображений товаров, связанных с договорами документов и т. п. Механизмы временного хранилища и работы с файлами часто используются совместно, но могут использоваться и по отдельности.

Необходимость во временном хранилище возникает, например, в том случае, когда в веб-клиенте возникает необходимость передать файл с клиентского компьютера на компьютер сервера приложений (или расширения веб-сервера для файлового варианта информационной базы). При передаче файла он помещается во временное хранилище и потом (на стороне серверного приложения системы «1С:Предприятие») может быть использован при записи объекта в базу данных или обработки.

При помещении данных во временное хранилище следует помнить, что во временное хранилище не могут быть помещены данные, типы которых не поддерживают сериализацию, причем как непосредственно, так и в составе любых коллекций.

Можно использовать временное хранилище как универсальное хранилище с контролируемым временем жизни данных:

● Если при помещении данных во временное хранилище была выполнена привязка данных к некоторой форме, то время жизни сохраненных данных зависит от продолжительности жизни формы, к которой привязаны данные. При удалении объекта формы временное хранилище будет очищено от всей связанной с ней информации.

● Если при помещении данных во временное хранилище привязка к форме не была выполнена, то очистка временного хранилища будет выполнена в следующих случаях:

● При следующем запросе формы.

● При следующем серверном вызове из клиентского общего модуля.

● При контекстном и неконтекстном клиентских вызовах из формы.

● При серверном вызове из модуля команды. Если вызов сервера осуществляется для помещения значения во временное хранилище, то очистка не производится. Очистка производится после того, как вызов закончил свою работу.

То есть можно поместить одно или несколько значений во временное хранилище, а в следующем вызове это значение использовать. При этом после использования и перед тем, как серверный вызов будет окончен, помещенное значение будет автоматически удалено.

Наиболее типичная прикладная задача, решаемая временным хранилищем, ‑ обеспечение доступа к файлам или картинкам до того, как объект будет записан в информационную базу, например, в форме элемента. При организации такого доступа рекомендуется передавать данные с клиентских компьютеров на сервер именно как файлы, без предварительного «преобразования» в текстовый документ, табличный документ и аналогичные форматы системы «1С:Предприятие». Рекомендуется передать файл на сторону сервера и уже на стороне сервера загружать данные файла в нужный формат системы «1С:Предприятие».

Данные, помещенные в хранилище, идентифицируются уникальным адресом, который в дальнейшем можно использовать в операциях записи, чтения или удаления. Этот адрес выдают методы записи значения во временное хранилище. Отдельный метод во встроенном языке позволяет определить, является ли переданный адрес адресом, указывающим на данные во временном хранилище.

Временное хранилище, сформированное в одном сеансе, недоступно из другого сеанса. Исключением является возможность передачи данных из фонового задания в сеанс, инициировавший это фоновое задание, с помощью временного хранилища (подробнее см. здесь).

21.2. Особенности работы с файлами в асинхронном режиме и веб-клиенте

Работа с файлами в асинхронном режиме присутствует только на стороне клиентского приложения. В общем случае следует использовать синхронные методы для работы на стороне сервера и асинхронные ‑ для работы на стороне клиентского приложения.

Рассмотрим пример работы с файлами в асинхронной технике: удаление всех файлов в каталоге временных файлов. Для синхронной техники такое действие будет выглядеть следующим образом:

Копировать в буфер обмена

&НаКлиенте Процедура Удалить(Команда) Попытка УдалитьФайлы(КаталогВременныхФайлов(), ПолучитьМаскуВсеФайлыКлиента()); Сообщить("Удаление успешно завершено"); Исключение // здесь обработка ошибок ИнфоОбОшибке = ИнформацияОбОшибке(); Сообщить("При выполнении файловой операции обнаружена ошибка: " + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнфоОбОшибке)); КонецПопытки; КонецПроцедуры

Асинхронная техника будет выглядеть по-другому:

Копировать в буфер обмена

&НаКлиенте Асинх Процедура УдалитьВременныеФайлы(Команда) Попытка Ждать УдалитьФайлыАсинх(Ждать КаталогВременныхФайловАсинх(), ПолучитьМаскуВсеФайлыКлиента()); Сообщить("Удаление успешно завершено"); Исключение // здесь обработка ошибок ИнфоОбОшибке = ИнформацияОбОшибке(); Сообщить("При выполнении файловой операции обнаружена ошибка: " + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнфоОбОшибке)); КонецПопытки; КонецПроцедуры

Следует обратить внимание, что практически все файловые операции являются асинхронными. Даже такие простые действия, как получение каталога временных файлов. Если при выполнении файловых операций произойдет ошибка ‑ она будет перехвачена конструкцией Попытка``‑``Исключение.

Работа с файлами в веб-клиенте имеет ряд особенностей:

1. Без установки расширения работы с файлами, в любом веб-браузере, доступны методы ПолучитьФайл(), НачатьПомещениеФайла() и НачатьПомещениФайлов(). При этом несколько ограничены возможности параметризации методов НачатьПомещениеФайла() и НачатьПомещениеФайлов().

2. В тонком и толстом клиенте, в отличие от веб-клиента, метод НачатьПомещениеФайла() (в интерактивном режиме) останавливает исполнение кода на встроенном языке. Тем не менее, после завершения операции вызов процедуры обратного вызова, переданной в метод НачатьПомещениеФайла(), все равно будет выполнен. Для того чтобы избежать различий в поведении при работе в тонком клиенте и веб-клиенте, следует весь код, который должен быть выполнен после помещения файла, размещать строго в обработчике обратного вызова.

3. При работе в веб-клиенте доступны только асинхронные методы работы с файлами. Данное поведение не зависит от свойства конфигурации Режим использования модальности, см. здесь.

4. При установке расширения работы с файлами расширяются возможности параметризации асинхронных методов работы с файлами. Однако возможности синхронной работы с файлами в веб-клиенте недоступны в любом режиме работы.

5. Расширение работы с файлами не поддерживает работу по протоколу HTTPS с использованием клиентского сертификата.

**Примечание 1. Для корректной работы расширения работы с файлами в веб-браузере Microsoft Internet Explorer рекомендуется использование библиотеки Microsoft Core XML Services (MSXML) версий 4.0 или 6.0.

Примечание 2. Расширение работы с файлами для веб-браузера Microsoft Internet Explorer устанавливается в каталог %``APPDATA%\1``C\1С``EWebExt\``FileSystemExtIE.**

21.3. Способы работы с файлами и временным хранилищем

21.3.1. Общая информация

Все файловые операции, выполняемые на стороне клиентского приложения (включая перенос файлов между клиентом и сервером и работу с временным хранилищем), являются асинхронными в любом клиентском приложении и в любом варианте работы.

При работе в веб-клиенте для передачи файлов на сервер может требоваться установка расширения работы с файлами. В общем случае можно утверждать, что расширение будет требоваться только в тех случаях, когда файловая операция не сопровождается интерактивным действием пользователя, например, поместить файл на сервер с фиксированным путем, указанным в коде прикладного решения ‑ будет требовать расширение. В то же время, указание файла с помощью диалога выбора файла ‑ не будет требовать расширение работы с файлами.

21.3.2. Помещение данных из файла во временное хранилище

21.3.2.1. Один файл

Для того чтобы поместить во временное хранилище один файл, следует использовать метод ПоместитьФайлНаСерверАсинх(). После завершения работы метода, файл из локальной файловой системы будет помещен во временное хранилище. При вызове метода можно указать некоторую вспомогательную информацию (в зависимости от того, какой из вариантов метода используется). Можно указать следующую информацию:

● Адрес во временном хранилище, по которому нужно сохранить файл (параметр Адрес). Если параметр не указан, то во временном хранилище будет создан новый элемент, адрес которого будет передан в обработчик окончания помещения файла во временное хранилище. Если параметр указан, то файл будет размещен по указанному адресу. При этом данные, которые хранились по преданному адресу на момент вызова метода, будут удалены.

● Описание файла, который должен быть помещен во временное хранилище. Файл может быть задан интерактивно, в диалоге выбора файла; как полный путь к файлу, сформированный во встроенном языке; как специальный объект, который образуется в том случае, когда файл помещен на элементы формы с помощью операции перетаскивания (объект СсылкаНаФайл).

● Описание диалога, который будет открыт для выбора файла, помещаемого во временное хранилище (объект ПараметрыДиалогаПомещенияФайлов).

● Уникальный идентификатор формы. Если данный параметр передан, то платформа автоматически удалит все элементы временного хранилища после того, как будет закрыта форма с указанным идентификатором. В противном случае значение будет удалено автоматически, после следующего серверного вызова. Если в качестве этого параметра указывается идентификатор, который не соответствует никакой форме, то удаление элемента временного хранилища автоматически будет выполнено при завершении клиентского сеанса. Но более правильно будет удалить неиспользуемое значение из временного хранилища в тот момент, когда это значение более не требуется (методом глобального контекста УдалитьИзВременногоХранилища()).

Метод позволяет обработать несколько событий, которые возникают в процессе его (метода) работы:

● Факт выбора файла, который требуется поместить во временное хранилище. Для этого служит параметр метода ОписаниеОповещенияПередНачаломПомещенияФайла. Данное оповещение будет вызвано непосредственно перед началом процесса помещения файла во временное хранилище. В данном обработчике имеется возможность отказаться от помещения файла, если, например, превышен размер помещаемого файла. Если в данном обработчике отказаться от помещения файла, то обработчик завершения не будет вызван системой.

● Периодическое событие, возникающее в процессе передачи файла на сервер. Для этого служит параметр метода ОписаниеОповещенияОХодеВыполнения. В это событие будет передана информация о передаваемом файле и информация о том, какая часть файла передана на сервер. Если разработчик реализовал специальную форму по отображению прогресса передачи, то имеется возможность реализовать возможность прервать передачу файла на сервер, для чего необходимо установить в значение Истина специальный параметр обработчика ОтказОтПомещенияФайла. Если при помещении нескольких файлов, параметр обработчика ОтказОтПомещенияФайла будет установлен в значение Истина для всех помещаемых файлов, то это будет равноценно установке параметра обработчика ОтказОтПомещенияВсехФайлов в значение Истина. В любом из этих случаев, в обработчик оповещения об окончании помещения файлов будет передано значение Неопределено.

Информация о файле, который помещен на сервер, будет получена в результате того, что оператор Ждать «дождался» результата работы метода ПоместитьФайлНаСерверАсинх(). Информация о файле будет предоставлена в виде объекта ОписаниеПомещенногоФайла.

В качестве описания помещаемого файла, как было сказано выше, можно указать различные типы значений:

● Имя файла никак не указано. При работе в веб-клиенте не требуется установленное расширение работы с файлами. В этом случае для указания помещаемого файла будет предложен диалог выбора, параметры которого установлены в значения по умолчанию.

● Полный путь к помещаемому файлу (имя параметра ПутьКФайлу). При работе в веб-клиенте требуется установленное расширение работы с файлами. В этом случае будет выполнена попытка поместить во временное хранилище файл, путь к которому указан в параметре.

● Объект СсылкаНаФайл (одноименный параметр). При работе в веб-клиенте не требуется установленное расширение работы с файлами. Объект такого типа не может быть создан во встроенном языке, он может быть получен только в результате интерактивного действия. Этим действием является перетаскивание файла из интерфейса операционной системы в какой-либо элемент формы клиентского приложения (в том числе и в веб-клиенте).

● Объект ПараметрыДиалогаВыбораФайлов (параметр ПараметрыДиалога). При работе в веб-клиенте не требуется установленное расширение работы с файлами. Данный вариант вызова метода аналогичен самому первому, когда не указывается конкретный файл, а предлагается его выбрать интерактивно. Отличие описываемого варианта вызова в том, что диалог можно адаптировать под реальные сценарии работы: указать заголовок, маски отбора файлов. Если при помещении файла (или файлов) на сервер используется диалог выбора файлов и для этого диалога задается несколько фильтров, то рекомендуется создавать фильтр, который включает в себя все допустимые файлы и этот фильтр установить в качестве значения по умолчанию для фильтра.

Ниже приведен пример помещения файла во временное хранилище, в котором выполняется настройка диалога выбора файлов и отображается состояние передачи файла на сторону сервера. Пример приведен исключительно в образовательных целях и не является законченным вариантом реализации какого-либо механизма:

Копировать в буфер обмена

&НаКлиенте Асинх Процедура ПоместитьФайлКоманда(Команда) ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов; ПараметрыДиалога.Заголовок = "ПоместитьФайлНаСерверАсинх"; ПараметрыДиалога.МножественныйВыбор = Истина; ПараметрыДиалога.Фильтр = "Текстовый файл|.txt|Все файлы|.*"; ПрогрессОбратныйВызов = Новый ОписаниеОповещения("ПрогрессОбратныйВызов", ЭтотОбъект); ПередНачаломОбратныйВызов = Новый ОписаниеОповещения("ПередНачаломОбратныйВызов", ЭтотОбъект); ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(ПрогрессОбратныйВызов, ПередНачаломОбратныйВызов, , ПараметрыДиалога); Сообщить("Помещение файла " + ?(ОписаниеФайла.ПомещениеФайлаОтменено, "отменено", "выполнено успешно")); Сообщить("Адрес во временном хранилище: " + ОписаниеФайла.Адрес); Сообщить("Имя файла: " + ОписаниеФайла.СсылкаНаФайл.Имя); Сообщить("Размер файла, байт: " + ОписаниеФайла.СсылкаНаФайл.Размер()); КонецПроцедуры &НаКлиенте Процедура ПрогрессОбратныйВызов(ПомещаемыйФайл, Помещено, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт Состояние("Файл " + ПомещаемыйФайл.Имя, Помещено, "Размер файла, байт = " + ПомещаемыйФайл.Размер(), БиблиотекаКартинок.Документ); КонецПроцедуры &НаКлиенте Процедура ПередНачаломОбратныйВызов(ПомещаемыйФайл, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт Сообщить("Помещаемый файл - " + ПомещаемыйФайл.Имя + ", размер файла, байт = " + ПомещаемыйФайл.Размер()); КонецПроцедуры

Необходимо понимать, что указание списка фильтров при параметризации диалога не является гарантией того, что пользователь выберет файлы только с этими расширениями или масками. Указание фильтров лишь упрощает пользователю возможность выбрать нужные файлы.

Для помещения файла на сервере могут использоваться следующие методы:

● Синхронный способ: ПоместитьФайл().

● Асинхронный (обратные вызовы): НачатьПомещениеФайлаНаСервер().

Смотри также:

● Синхронные и асинхронные методы работы (см. здесь).

● Механизм перетаскивания (см. здесь).

21.3.2.2. Несколько файлов

Общая схема работы метода ПоместитьФайлыНаСерверАсинх() соответствует описанию метода ПоместитьФайлНаСерверАсинх(). Отличия заключаются в том, что для передачи описаний нескольких файлов используется:

● Строка с маской, описывающая помещаемые файлы на диске клиентского компьютера. В веб-клиенте требуется установка расширения работы с файлами. В этом случае на сервер будут переданы все файлы, соответствующие строке поиска.

● Массив объектов, описывающих помещаемые файлы. Важно понимать, что в рамках одного вызова массив может содержать значения какого-то одного типа. Объекты могут быть следующих типов:

● Типа ОписаниеПередаваемогоФайла. В веб-клиенте требуется установка расширения работы с файлами. Каждый элемент массива должен содержать непустой путь к файлу на диске.

● Типа СсылкаНаФайл. В веб-клиенте не требуется установка расширения работы с файлами. Может использоваться в форме, на которую перетаскивают разные файлы с накопителя клиентского компьютера.

● Параметры диалога выбора файлов для того, чтобы пользователь самостоятельно указал файлы, которые необходимо передать на сервер. В веб-клиенте не требуется установка расширения работы с файлами.

Количество и описание обработчиков событий соответствует событиям из метода ПоместитьФайлНаСерверАсинх() с той разницей, что в каждый обработчик попадет массив объектов, описывающих обрабатываемые файлы.

В обработчике события перед началом помещения файлов имеется возможность отказаться от передачи на сервер только всех выбранных файлов. Собственно процесс передачи файлов на сервер происходит последовательно. При этом для каждого файла вызывается обработчик события оповещения о ходе выполнения. В этом обработчике предоставляется возможность отказаться как от передачи какого-то одного файла (с помощью параметра обработчика ОтказОтПомещенияФайла), так и от помещения всех файлов (с помощью параметра обработчика ОтказОтПомещенияВсехФайлов).

Информация о файлах, которые помещены на сервер, будет получена в результате того, что оператор Ждать «дождался» результата работы метода ПоместитьФайлыНаСерверАсинх(). Информация о файлах будет предоставлена в виде массива объектов ОписаниеПомещенногоФайла.

Для помещения файлов на сервере могут использоваться следующие методы:

● Синхронный способ: ПоместитьФайлы().

● Асинхронный (обратные вызовы): НачатьПомещениеФайловНаСервер().

Смотри также:

● Синхронные и асинхронные методы работы (см. здесь).

21.3.2.3. Данные из памяти

Метод ПоместитьВоВременноеХранилище() предназначен для размещения во временном хранилище данных, которые имеются в виде существующего объекта некоторого типа в оперативной памяти, а не в виде файла на дисковом накопителе. Если при вызове метода не указан адрес во временном хранилище ‑ данные будут размещены по новому адресу, который возвращается как результат функции. Размещенные данные обязательно принадлежат какой-либо форме и автоматически удаляются после ее удаления или серверного вызова (в зависимости от параметров метода).

В том случае, если для адреса временного хранилища, которое является результатом работы метода ПоместитьВоВременноеХранилище(), применялся метод УдалитьИзВременногоХранилища(), то указанный адрес не может быть повторно использован в качестве параметра Адрес метода ПоместитьВоВременноеХранилище(). В случае, если такая попытка будет выполнена, будет сгенерировано исключение.

Внимание! При помещении во временное хранилище фактическая сериализация значения не выполняется. Помещается ссылка на значение, которое хранится в кеше в течение 20 минут. По истечении этого периода значение сериализуется, записывается на диск (в хранилище сеансовых данных) и удаляется из кеша.

21.3.3. Получение данных из информационной базы в файл

21.3.3.1. Один файл

Метод ПолучитьФайлССервераАсинх() получает файл из информационной базы и сохраняет его в локальную файловую систему пользователя. При вызове метода можно указать следующие параметры (состав параметров зависит от варианта вызова метода):

● Указывается адрес данных, которые необходимо поместить в файл, в информационной базе (навигационная ссылка). Это обязательный параметр.

● Полное имя файла (включая путь к файлу), в который предлагается сохранить данные из базы.

● Параметры диалога получения файла (объект типа ПараметрыДиалогаПолученияФайлов).

Метод всегда возвращает значение типа Обещание. В зависимости от того, какой вариант синтаксиса используется, различается результат выполнения обещания и необходимость установки расширения работы с файлами в веб-клиенте:

● Вариант с диалогом получения файлов. Результат выполнения обещания ‑ всегда значение Неопределено. При работе с веб-клиентом расширение работы с файлами не требуется, но используется для установки параметров диалога получения файлов. Если расширение не установлено, то значение параметра ПараметрыДиалогаПолученияФайлов игнорируются.

● Вариант без диалога получения файлов. Результат выполнения обещания ‑ значение типа ОписаниеПереданногоФайла. При работе в веб-клиенте требуется расширение работы с файлами.

У пользователя, от имени которого выполняется операция сохранения файла, должно быть право Просмотр на реквизит базы данных, в котором размещены сохраняемые данные.

Копировать в буфер обмена

КаталогДляСохранения = Ждать КаталогВременныхФайловАсинх(); ДиалогПолучения = Новый ПараметрыДиалогаПолученияФайлов("Заголовок диалога получения файлов", Ложь, КаталогДляСохранения); Ждать ПолучитьФайлССервераАсинх(АдресВоВременномХранилище, ПолныйПутьКФайлу, ДиалогПолучения); Результат = Ждать ПолучитьФайлССервераАсинх(АдресВоВременномХранилище, ПолныйПутьКФайлу);

21.3.3.2. Несколько файлов

Метод ПолучитьФайлыССервераАсинх() позволяет получить и сохранить на локальный накопитель клиентского компьютера несколько файлов, хранящихся в информационной базе. Метод имеет несколько вариантов использования:

● Методу передается массив описаний получаемых файлов (объекты типа ОписаниеПередаваемогоФайла), описание диалога сохранения файлов и параметры архива, в который будут помещены получаемые файлы (при необходимости). При работе в веб-клиенте не требуется установленное расширение работы с файлами, но оно будет использоваться, если установлено. Еслит расширение работы с файлами не установлено, то настройка диалога сохранения файлов не будет выполнена.

● Методу передается обработчик оповещения о завершении операции, массив описаний получаемых файлов (объекты типа ОписаниеПередаваемогоФайла), стартовый каталог, в который предполагается сохранить получаемые файлы и параметры архива, в который будут помещены получаемые файлы (при необходимости). При работе в веб-клиенте требуется установленное расширение работы с файлами.

Результатом работы метода всегда является объект типа Ожидание. При вызове метода с использованием диалога, результатом выполнения ожидания всегда является значение Неопределено. Если используется вариант без диалога, то результатом выполнения ожидания является массив объектов типа ОписаниеПереданногоФайла.

При получении нескольких файлов с сервера предоставляется возможность задать параметры диалога, который будет показан при выборе местоположения файлов. За это отвечает параметр ПараметрыДиалогаПолученияФайлов одноименного типа. Значение свойства ПараметрыДиалогаПолученияФайлов.ВыборКаталога определяет, каким образом будет выполняться выбор каталога:

● Истина ‑ каталог будет выбран один раз и все файлы будут размещены в этом каталоге. В веб-клиенте игнорируется.

● Ложь ‑ диалог выбора каталога будет появляться для каждого файла, который будет получаться с сервера.

Свойство ПараметрыДиалогаПолученияФайлов.Заголовок позволяет задать заголовок диалога выбора каталога сохранения, а свойство ПараметрыДиалогаПолученияФайлов.Каталог позволяет задать начальное значение каталога сохранения файлов (в веб-клиенте игнорируется).

Еще одна полезная возможность, предоставляемая при получении файлов с сервера ‑ это автоматическое формирование архива при получении файлов. За это отвечает параметр метода ПараметрыПолученияАрхиваФайлов (одноименного типа). Если параметр не указан, то архив формироваться не будет. Если параметр указан (в метод передано значение типа ПараметрыПолученияАрхиваФайлов), то создание архива определяется значением свойства ПараметрыПолученияАрхиваФайлов.Режим и наличием расширения работы с файлами:

● Свойство ПараметрыПолученияАрхиваФайлов.Режим установлено в значение ПолучатьАрхивВсегда. В этом случае архив формируется всегда при использовании метода ПолучитьФайлыССервераАсинх().

● Свойство ПараметрыПолученияАрхиваФайлов.Режим установлено в значение ПолучатьАрхивПриНеобходимости. В этом случае архив формируется только тогда, когда получается несколько файлов с помощью метода ПолучитьФайлыССервераАсинх() и не установлено расширение работы с файлами.

Имя создаваемого архива определяется с помощью свойства ПараметрыПолученияАрхиваФайлов.ИмяАрхива.

При формировании архива, требуемые объекты сохраняются во временный каталог сервера, затем эти файлы упаковываются в архив (средствами платформы) и получившийся архив передается на сторону клиентского приложения.

Размещение файлов (как в архиве, так и в каталоге-получателе) определяется свойством ОписаниеПередаваемогоФайла.Имя:

● Задано имя файла, без каталогов ‑ файл будет размещаться непосредственно в каталоге-получателе или корне архива.

● Задано имя файла с указанием относительного пути ‑ в каталоге-получателе или архиве будет создана структура каталогов, указанная для файла.

● Задано абсолютное имя файла ‑ в этом случае файл будет сохраняться по указанному пути. В архиве будет воссоздана структура каталогов, соответствующая полному пути к файлу.

21.3.4. Получение данных из временного хранилища

При записи объекта в информационную базу может понадобиться извлечь данные из временного хранилища и поместить их, например, в реквизит объекта информационной базы. Для этого существует специальный метод ‑ ПолучитьИзВременногоХранилища(). Этот метод извлекает данные из временного хранилища и возвращает их в качестве результата выполнения. Для получения данных необходимо указать адрес во временном хранилище. Этот адрес возвращают методы помещения данных во временное хранилище в случае их успешного выполнения (см. предыдущие разделы).

**Внимание! При получении на сервере значения из временного хранилища следует учитывать то, что оно получается по ссылке. В действительности, ссылка эта указывает на значение, которое хранится в кеше. В течение 20 минут, с момента помещения в хранилище или же с момента последнего обращения, значение сохранится в кеше, а затем записывается на диск и из кеша удаляется. При следующем обращении значение загружается с диска и снова помещается в кеш.

После десериализации и восстановления значения из временного хранилища ссылки не восстанавливаются. Значение в кеше восстанавливается с диска. Но после сериализации/десериализации восстановить ссылки на другие объекты внутри значения невозможно.**

21.3.5. Удаление данных из временного хранилища

После того как данные сохранены в реквизите объекта информационной базы, данные во временном хранилище можно удалить. Для этого есть метод УдалитьИзВременногоХранилища(), который производит удаление. Метод принимает в параметре адрес во временном хранилище.

21.3.6. Проверка адреса на принадлежность временному хранилищу

Адрес может указывать как на временное хранилище, так и на реквизит в информационной базе. Для проверки его типа существует метод ЭтоАдресВременногоХранилища().

Он проверяет, что переданный адрес является адресом, указывающим на хранилище. Возвращает Истина, если адрес указывает на временное хранилище.

21.3.7. Получение адреса реквизита

После того как данные помещены в реквизит объекта информационной базы, может потребоваться получить доступ к ним с помощью файловых методов.

Но прежде чем получить данные, например из реквизита, необходимо получить адрес этого реквизита. Для этого существует метод ПолучитьНавигационнуюСсылку().

Он может вернуть адрес значения в информационной базе по исходным параметрам. Для этого необходимо передать ключ объекта (это может быть как ссылка на объект, так и ключ записи регистра сведений) и имя реквизита. Если нужно получить адрес значения, хранимого в реквизите табличной части, то к имени реквизита в параметре, задающем имя реквизита, необходимо добавить имя табличной части и точку «.».

Например:

Копировать в буфер обмена

Товары.Изображение

21.3.8. Разрешение на выполнение группы операций с файлами

При выполнении некоторых операций в веб-клиенте может потребоваться получить разрешение на несколько операций по работе с файлами. Например, необходимо выполнить получение документа из информационной базы и затем открыть сохраненный документ с помощью ассоциированного приложения.

Для выполнения этой операции потребуется отвечать на вопрос о сохранении документа и на вопрос о необходимости запуска. Если операций будет больше, вопросов пользователю также станет больше.

Для уменьшения количества вопросов можно воспользоваться методом ЗапроситьРазрешениеПользователяАсинх(). При использовании этого метода пользователю отображается список всех операций, которые планируется выполнить, и предлагается разрешить выполнение группы операций. Если пользователь разрешил выполнение, то запрошенные операции будут выполняться без дополнительных запросов пользователю. Если разрешение не предоставлено, операции будут выполняться в обычном режиме: один запрос на одну операцию.

В тонком и толстом клиентских приложениях метод ЗапроситьРазрешениеПользователяАсинх() всегда возвращает значение Истина, без взаимодействия с пользователем. При работе в веб-клиенте требуется подключить расширение работы с файлами (см. здесь).

Следует отметить несколько особенностей применения метода ЗапроситьРазрешениеПользователяАсинх().

● Разрешение можно запросить для следующих методов:

● ПоместитьФайлНаСерверАсинх();

● ПоместитьФайлыНаСерверАсинх();

● ПолучитьФайлССервера();

● ПолучитьФайлыССервера();

● ЗапуститьПриложениеАсинх();

● УдалитьФайлыАсинх();

● ПоискФайловАсинх();

● КопироватьФайлАсинх();

● ПереместитьФайлАсинх();

● СоздатьКаталогАсинх();

● СоздатьДвоичныеДанныеИзФайлаАсинх();

● ФайловыеПотоки.СоздатьВременныйФайлАсинх();

● ФайловыеПотоки.СоздатьАсинх();

● ФайловыеПотоки.ОткрытьАсинх();

● ФайловыеПотоки.ОткрытьДляЧтенияАсинх();

● ФайловыеПотоки.ОткрытьДляЗаписиАсинх();

● ФайловыеПотоки.ОткрытьДляДописыванияАсинх();

● ДвоичныеДанные.ЗаписатьАсинх().

● Разрешение запрашивается для конкретного набора параметров метода. Если при реальном исполнении метода работы с файлами значения параметров будут отличаться от тех, для которых получено разрешение, это разрешение не будет действовать и пользователь получит отдельный запрос на подтверждение выполнения операции.

● Если необходимо выполнить две (или более) одинаковые операции с файлами (даже с одинаковым набором параметров), следует указать соответствующее количество элементов в массиве параметров метода ЗапроситьРазрешениеПользователяАсинх(). Например, если необходимо дважды получить из информационной базы один и тот же файл и поместить его в фиксированное место файловой системы, следует запросить разрешение на две операции.

● Если запрашивается разрешение на операцию, при выполнении которой выполняется интерактивная операция (например, функция ПолучитьФайлыССервераАсинх() работает в интерактивном режиме), то такая операция исключается из запроса.

Полученные разрешения сохраняются либо до выполнения разрешенного вызова, либо до окончания исполнения встроенного языка.

Для получения разрешения пользователя на выполнение операций могут использоваться следующие методы:

● Синхронный способ: ЗапроситьРазрешениеПользователя().

● Асинхронный (обратные вызовы): НачатьЗапросРазрешенияПользователя().

Смотри также:

● Синхронные и асинхронные методы работы (см. здесь).

21.3.9. Работа с временным хранилищем в фоновом задании

В механизме работы с временным хранилищем есть возможность передать данные из фонового задания в сеанс, инициировавший фоновое задание. Для такой передачи следует в родительском сеансе поместить во временное хранилище пустое значение (с помощью метода ПоместитьВоВременноеХранилище()), указав какой-либо идентификатор создаваемого временного хранилища (параметр Адрес). Затем полученный адрес передать в фоновое задание через параметры фонового задания. Далее, если в фоновом задании этот адрес использовать в качестве значения параметра Адрес метода ПоместитьВоВременноеХранилище(), то результат будет скопирован в сеанс, из которого было запущено фоновое задание.

Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания.

21.3.10. Доступ к стандартным каталогам

При использовании системы требуется некоторое место в файловой системе, где можно хранить различные файловые данные, которые с одной стороны являются временными, а с другой ‑ должны храниться достаточно длительное время. К таким файлам можно отнести черновики для систем управления документооборотом, внешние компоненты, работающие на стороне клиентского компьютера и т. д.

Для хранения таких файлов предназначен специальный каталог, который привязан к конкретному пользователю конкретной информационной базы. Один и тот же пользователь, работающий с двумя информационными базами, будет иметь доступ к двум разным каталогам хранения данных пользователя. Местоположение данного каталога определяется с помощью метода РабочийКаталогДанныхПользователяАсинх(). Если каталог отсутствует, то он создается при первом обращении к нему. Если создание каталога невозможно ‑ система вызывает исключение.

В операционной системе имеется специальный каталог, выделенный для постоянного хранения данных пользователя. Это могут быть какие-то отчеты, печатные формы документов и т. д. В этот каталог помещаются данные, которые в дальнейшем могут быть отправлены внешним потребителям. Для доступа к этому каталогу предназначен метод КаталогДокументовАсинх(). Физическое расположение каталога зависит от операционной системы, где исполняется приложение и приведено в синтакс-помощнике.

Фактический результат становится доступен после выполнения обещания с помощью оператора Ждать.

Для получения доступа к стандартным каталогам могут использоваться следующие методы:

● Синхронный способ: РабочийКаталогДанныхПользователя(), КаталогДокументов().

● Асинхронный (обратные вызовы): НачатьПолучениеРабочегоКаталогаПользователя(), НачатьПолученниеКаталогаДокументов().

Смотри также:

● Синхронные и асинхронные методы работы (см. здесь).

21.4. Работа с картинками

21.4.1. Параметры картинки и операции преобразования

Платформа «1С:Предприятие» предоставляет возможность получения некоторых характеристик картинки. Для получения характеристик картинки необходимо создать объект Картинка с помощью соответствующего конструктора. У полученного объекта имеется возможность получения следующих свойств картинки:

● Ширина и высота картинки. Размер возвращается в точках по соответствующей координате. Используются методы Ширина() и Высота().

● Глубина цвета. Для растровых картинок возвращается глубина цвета в виде значения системного перечисления ГлубинаЦвета. Используется метод ГлубинаЦвета().

● Признак того, что картинка хранится в виде оттенков серого. Для картинок, формат которых предполагает хранение такого признака (форматы PNG и TIFF). Используется метод ОттенкиСерого().

● Количество страниц в многостраничной TIFF-картинке. Используется метод КоличествоКадров().

● Плотность картинки по горизонтали и вертикали. Позволяет получить количество точек на дюйм по (DPI) по соответствующей координате. Используются методы ПлотностьПоГоризонтали() и ПлотностьПоВертикали(). Если формат картинки не предполагает хранение такой информации ‑ возвращается значение 72 точки на дюйм.

● Формат загруженной картинки. Возвращает формат картинки в виде значения системного перечисления ФорматКартинки. Используется метод ФорматКартинки().

● Признак того, что картинка является набором картинок (подробнее см. здесь). Используется свойство НаборВариантов.

Если в виде картинки выступает набор картинок, то все методы возвращают информацию по текущему варианту картинки. Под «текущим» понимается тот вариант картинки, который будет отображаться в текущий момент в данном клиентском приложении.

Если загруженная картинка является коллекцией картинок (см. здесь), то для такой картинки методы Ширина(), Высота(), ПлотностьПоГоризонтали(), ПлотностьПоВертикали() и РазмерФайла() не имеют смысла.

При необходимости имеется возможность выполнять некоторые преобразования полученной картинки. Для этого существует специальный объект ОбрабатываемаяКартинка. Получение обрабатываемой картинки осуществляется на основании оригинальной картинки с помощью необходимого конструктора объекта ОбрабатываемаяКартинка.

В дальнейшем предоставляется возможность изменять параметры картинки, при этом каждый метод преобразования выполняется над той картинкой, которая размещена в данный момент в объекте ОбрабатываемаяКартинка, с учетом всех ранее выполненных преобразований. Предоставляется возможность выполнить следующие действия:

● Изменить размер картинки по вертикали и горизонтали. Используется метод УстановитьРазмер().

● Изменить формат картинки с помощью метода УстановитьФормат().

● Уменьшить или увеличить картинку с помощью метода Масштабировать().

● Повернуть картинку на некоторый угол с помощью метода Повернуть().

● Изменить глубину цвета или преобразовать картинку в оттенки серого. Для этого используются методы (соответственно) УстановитьГлубинуЦвета() и ПреобразоватьВОттенкиСерого().

● Метод УстановитьПлотность() позволяет установить значения плотности картинки по соответствующей координате в метаданных картинки. Установленные значения будут использоваться для определения соответствия между реальным размером картинки и размером в точках. Если текущий формат картинки не предполагает хранения таких значений ‑ вызов метода пройдет успешно, но фактических изменений не будет выполнено.

● Метод ВыделитьОбласть() позволяет указать фрагмент картинки, который заместит оригинальную картинку в объекте ОбрабатываемаяКартинка после завершения работы метода.

● Метод ВыделитьЗначимуюЧастьКартинки() позволяет выделить из оригинальной картинки значимую часть.

● Метод ПолучитьКартинки() позволяет получить все страницы многостраничной TIFF-картинки в виде массива.

Для того чтобы сохранить результат преобразования, следует получить объект Картинка из объекта ОбрабатываемаяКартинка и затем выполнить сохранение в файл на диске или использовать картинку по назначению любым другим способом.

В качестве примера можно рассмотреть преобразование всех картинок, расположенных в некотором каталоге, из формата TIFF в формат PNG. Оригинальные картинки при этом будут удалены с диска.

Пример:

Копировать в буфер обмена

ИсходныеФайлы = НайтиФайлы(КаталогСКартинками, "*.tif"); Для каждого ИсходныйФайл Из ИсходныеФайлы Цикл Картинка = Новый Картинка(ИсходныйФайл.ПолноеИмя); Обработка = Новый ОбрабатываемаяКартинка(Картинка); Обработка.УстановитьФормат(ФорматКартинки.PNG); Обработка.ПолучитьКартинку().Записать(ИсходныйФайл.Путь + ИсходныйФайл.ИмяБезРасширения + ".png"); Картинка = Неопределено; УдалитьФайлы(ИсходныйФайл.ПолноеИмя); КонецЦикла;

21.4.2. Поддержка адресов в поле картинки

Элемент формы Поле вида Поле картинки поддерживает отображение картинки, заданной адресом значения (которое может быть картинкой или двоичными данными) во временном хранилище или в базе данных.

Для этого в свойстве Данные элемента формы необходимо задать реквизит строкового типа. Значение этого реквизита и будет интерпретироваться как адрес картинки.

Рис. 525. Отображение картинки на форме

Копировать в буфер обмена

// Пример 1 // Привязка поля картинки к адресу картинки во временном // хранилище. АдресКартинки - реквизит формы строкового типа ПоместитьФайл(АдресКартинки, ИсходноеИмя, ВыбранноеИмя, Истина, УникальныйИдентификатор); // Пример 2 // Получение адреса картинки из реквизита объекта // информационной базы ФайлКартинки = Объект.ФайлКартинки; Если Не ФайлКартинки.Пустая() Тогда АдресКартинки = ПолучитьНавигационнуюСсылку(ФайлКартинки, "ДанныеФайла"); Иначе АдресКартинки = ""; Конецесли;