1с поместить файл excel во временное хранилище

   SherifSP

29.01.13 — 15:54

Как записать Excel файлы в хранилище значения?

   SherifSP

1 — 29.01.13 — 15:55

ФайлНаДиске = Новый Файл(ОбъектXLS);

   Если Не ФайлНаДиске.Существует() Тогда

       Предупреждение(«Файл не найден!»);

       Возврат;

   КонецЕсли;

   
   ХранилищеXLS = Новый ХранилищеЗначения(ФайлНаДиске);

Если ХранилищеXLS.Получить() отладчик показівает неопределено

   Defender aka LINN

2 — 29.01.13 — 15:57

(0) Дай-ка угадаю… Как-то раз тебя попросили игру скинуть, и ты записал на флэшку файл «Игра.lnk»?

   SherifSP

3 — 29.01.13 — 15:59

(2)?

   lamme

4 — 29.01.13 — 15:59

(2) неа … там порнуха .. записанная нетрадиционным образом )

   lamme

5 — 29.01.13 — 16:00

у тебя в теме стоит — записать В хранилище

а по коду идет — получить ИЗ хранилища

определись — чего тебе надо

   Defender aka LINN

6 — 29.01.13 — 16:01

(3) «Файл» — объект 1С, предназначенный для управления файлами. Это ни в коем разе не сам файл.

   SherifSP

7 — 29.01.13 — 16:01

(5) Ну а как проверить записан ли файл в хранилище, помимо метода получить()?

   lamme

8 — 29.01.13 — 16:02

а собственно — зачем ты его проверяешь ?

ну проверил ты его — сущесвтует и что?

задача в (0) -записать в хранилище.

ну так и записывай = поверх того что существует или не существует.

и записывается оно  -в виде двоичных данных

   SherifSP

9 — 29.01.13 — 16:02

(6) То есть нужно фай в табличный док скопировать и таб док записать в хранилище?

   lamme

10 — 29.01.13 — 16:03

посмотри на примере типовой УТ — как сохраняется картинка у товара в хранилище значений.

там все четко написано.

(хотя пока доберешься до кода .. застрелится можно)

   Defender aka LINN

11 — 29.01.13 — 16:03

(9) Нет. Нужно искать другой объект

   SherifSP

12 — 29.01.13 — 16:03

(8) То есть записывать и не проверять, правильно ли записал, тот ли файл записан?)))

   SherifSP

13 — 29.01.13 — 16:04

(11) Есть Com объект, сам excel документ

   lamme

14 — 29.01.13 — 16:05

(12)

интересно- по каким параметрам ты его будешь проверять ?

   SherifSP

15 — 29.01.13 — 16:06

+(13) Но даже его записываю, при получении Неопределено

   lamme

16 — 29.01.13 — 16:06

по имени ? по размеру ? по внутреннему содержанию по байтово ?

   SherifSP

17 — 29.01.13 — 16:07

(16) даже по имени

   lamme

18 — 29.01.13 — 16:10

(17)

гы …

представь — имя совпадет

а содержание -нет

   SherifSP

19 — 29.01.13 — 16:10

+(8) Нужно получить из хранилища файл, который записал, но файла там нет, значит ошибка при записи )

   lamme

20 — 29.01.13 — 16:13

(19)

это примитивная проверка.

а представь — получил. все красиво. а файл при записи в хранилище — поломался. т.е. в оригинале ексель нормальный,а в 1С в хранилище — кривой.

и что делать?

   Defender aka LINN

21 — 29.01.13 — 16:17

(13) COM-объект тоже ни разу не сам документ.

   SherifSP

22 — 29.01.13 — 16:17

(20) В хранилище будит хранится всего один файл

   lamme

23 — 29.01.13 — 16:18

(22)

ага ..

БИТЫЙ!

   SherifSP

24 — 29.01.13 — 16:18

(21) И что же делать?

   SherifSP

25 — 29.01.13 — 16:19

(23) Главное записать)

   lamme

26 — 29.01.13 — 16:21

(25)

вот и я о том же

главное записать

а проверки последующие — малоэффективны

   Сергиус

27 — 29.01.13 — 16:26

(0) например так

ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл));

где файл это путь к твоему экселевскому файлу.

   lamme

28 — 29.01.13 — 16:28

(27)

агга !!

в УТ 11 есть такое

ПоместитьФайл (PutFile)

Синтаксис:

ПоместитьФайл(<Адрес>, <НачальноеИмяФайла>, <ВыбранноеИмяФайла>, <Интерактивно>, <УникальныйИдентификаторФормы>)

Параметры:

<Адрес> (необязательный)

Тип: Строка.

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

<НачальноеИмяФайла> (необязательный)

Тип: Строка.

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

Если параметр <Интерактивно> = Истина, то отображается диалог выбора файла и выбранный в диалоге путь возвращается в параметре <ВыбранноеИмяФайла>.

<ВыбранноеИмяФайла> (необязательный)

Тип: Строка.

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

В веб-клиенте значение параметра зависит от типа браузера.

Для FireFox 3 в параметре возвращается только имя файла без пути.

Для Internet Explorer возвращаемое значение зависит от настройки текущей зоны. Подробности: http://msdn.microsoft.com/en-us/library/ms535128(VS.85).aspx

<Интерактивно> (необязательный)

Тип: Булево.

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

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

Значение по умолчанию: Истина

<УникальныйИдентификаторФормы> (необязательный)

Тип: УникальныйИдентификатор.

Уникальный идентификатор формы, который можно получить с помощью свойства УникальныйИдентификатор управляемой формы.

Файл помещается во временное хранилище и автоматически удаляется после удаление объекта формы.

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

Возвращаемое значение:

Тип: Булево.

Ложь — в параметре <Интерактивно> установлен интерактивный режим (Истина) и пользователь отказался от выполнения операции в диалоге выбора файла.

Описание:

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

Доступность:

Тонкий клиент, веб-клиент, толстый клиент.

   SherifSP

29 — 29.01.13 — 16:32

(27) {Документ.ПланограммаКДоговору.Форма.ФормаДокумента(120)}: Ошибка при вызове конструктора (ДвоичныеДанные): Ошибка совместного доступа к файлу ‘C:Users1C-progDesktop111.xls’

   ХранилищеXLS = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ФайлНаДиске.ПолноеИмя));

по причине:

Ошибка совместного доступа к файлу ‘C:Users1C-progDesktop111.xls’

   Сергиус

30 — 29.01.13 — 16:34

(29) файл значит что то держит..или открыт у тебя или com-соединение не закрыто(глянь в процессах excel).

   SherifSP

31 — 29.01.13 — 16:35

+(29) Вроде записал, в памяти висел этот excel

   Операция 1Ы

32 — 29.01.13 — 16:35

(29) файл закрой)

   SherifSP

33 — 29.01.13 — 16:35

// завершим процесс, чтобы файл не висел в системе

   КомандаСистемы(«taskkill » + ОбъектXLS);

   SherifSP

34 — 29.01.13 — 16:45

Кто работал с компонентой Microsoft Office Spreadsheet 11.0 ?

   SherifSP

35 — 29.01.13 — 16:47

Была идея файл который в хранилище записал, при открытии документа получать и записывать в Activex компоненту, но она не понятная и инфы очень мало, если кто что подскажети о компоненте, буду очень признателен

  

SherifSP

36 — 29.01.13 — 18:01

Файл = КаталогВременныхФайлов()+»Файл.xls»;

   Если ТипЗнч(ХранилищеXLS.Получить()) <> Тип(«ДвоичныеДанные») Тогда

       ДвоичныеДанные = ХранилищеXLS.Получить();

   Иначе

       ДвоичныеДанные = ХранилищеXLS;

   КонецЕсли;

   ДвоичныеДанные.Записать(Файл);

{Документ.ПланограммаКДоговору.Форма.ФормаДокумента(116)}: Метод объекта не обнаружен (Записать)

   ДвоичныеДанные.Записать(Файл);

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

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

 Помещение одного файла

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

Помещение набора файлов

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

// СписокФайлов – реквизит формы типа СписокЗначений,
// содержащий список добавляемых файлов
МассивФайлов = Новый Массив;
Для каждого ЭлементСписка Из СписокФайлов Цикл
МассивФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ЭлементСписка, ));
КонецЦикла;
ПомещенныеФайлы = Новый Массив;
Результат = ПоместитьФайлы(МассивФайлов, ПомещенныеФайлы, , Ложь, УникальныйИдентификатор);

Примечание 1. Для использования метода ПоместитьФайлы() в веб-клиенте требуется подключение расширения работы с файлами .
Примечание 2. Объем данных, перемещаемых между клиентом и сервером, за один вызов метода ПоместитьФайлы(), не должен превышать 4 Gb (в сериализованном виде).

Помещение данных во временное хранилище

Метод ПоместитьВоВременноеХранилище() схож с методом ПоместитьФайл(), за исключением того, что данные для записи во временное хранилище
представляются не в виде пути в файловой системе, а в виде значения. Точно так же, если не указан существующий адрес во временном хранилище, создается новый адрес. Адрес возвращается как результат функции. Так же как и для файлов, размещенные данные обязательно принадлежат какой-либо форме и автоматически удаляются после ее удаления.
Примечание. Объем данных, перемещаемых между клиентом и сервером, за один вызов метода ПоместитьВоВременноеХранилище(), не должен превышать 4 Gb (в сериализованном виде).
Внимание! При помещении во временное хранилище фактическая сериализация значения не выполняется. Помещается ссылка на значение, которая хранится в кеше в течение 20 минут. По истечении этого периода значение сериализуется, записывается на диск (в хранилище сеансовых данных) и удаляется из кеша.

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

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

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

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

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

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

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

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

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

Получение файла из информационной базы

Получение одного файла

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

Получение набора файлов

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

// СписокФайлов – список значений, содержащий ссылки на элементы
// справочника, в котором расположены выгружаемые файлы
// Представлением списка значений является имя выгружаемого файла
МассивФайлов = Новый Массив;
Для каждого ЭлементСписка Из СписокФайлов Цикл
Файл = Новый Файл(Строка(ЭлементСписка.Значение));
ПолучаемыйФайл = Новый ОписаниеПередаваемогоФайла;
ПолучаемыйФайл.Имя = ЭлементСписка.Представление;
ПолучаемыйФайл.Хранение = ПолучитьНавигационнуюСсылку(ЭлементСписка.Значение, “Данные”);
МассивФайлов.Добавить(ПолучаемыйФайл);
КонецЦикла;
ПолученныеФайлы = Новый Массив;
Результат = ПолучитьФайлы(МассивФайлов, ПолученныеФайлы, ПутьВыгружаемыхФайлов, Ложь);
Если НЕ Результат Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Ошибка получения файлов!”;
Сообщение.Сообщить();
КонецЕсли;

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

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

ПередаваемыеФайлы = Новый Массив;
Описание = Новый ОписаниеПередаваемогоФайла(“Описание”, АдресФайла);
ПередаваемыеФайлы.Добавить(Описание);
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ВыборФайла.Заголовок = “Сохранение архива”;
ВыборФайла.Расширение = “zip”;
ВыборФайла.Фильтр = “Архив(*.zip)|*.zip|Все файлы|*.*”;
ВыборФайла.ИндексФильтра = 0;
ПолучитьФайлы(ПередаваемыеФайлы, , ВыборФайла, Ложь);

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

Пример использования файловых методов

// Получение в интерактивном режиме файла с диска
// и помещение его во временное хранилище.
&НаКлиенте
Процедура ВыбратьФайлСДискаИЗаписать()
Перем ВыбранноеИмя;
Перем АдресВременногоХранилища;
НовыйОбъект = Объект.Ссылка.Пустая();
Если ПоместитьФайл(АдресВременногоХранилища, “”, ВыбранноеИмя, Истина) Тогда
Объект.ИмяФайла = ВыбранноеИмя;
ПоместитьФайлОбъекта(АдресВременногоХранилища);
КонецЕсли;
КонецПроцедуры
// Копирование файла из временного хранилища в реквизит
// справочника, запись объекта, удаление файла из временного
// хранилища.
&НаСервере
Процедура ПоместитьФайлОбъекта(АдресВременногоХранилища)
ЭлементСправочника = РеквизитФормыВЗначение(“Объект”);
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
ЭлементСправочника.ДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных());
Файл = Новый Файл(ЭлементСправочника.ИмяФайла);
ЭлементСправочника.ИмяФайла = Файл.Имя;
ЭлементСправочника.Записать();
Модифицированность = Ложь;
УдалитьИзВременногоХранилища(АдресВременногоХранилища);
ЗначениеВРеквизитФормы(ЭлементСправочника, “Объект”);
КонецПроцедуры
// Считывание файла из реквизита и сохранение его
// на локальном диске в интерактивном режиме.
&НаКлиенте
Процедура ПрочитатьФайлИСохранитьНаДиск()
Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка,”ДанныеФайла”);
ПолучитьФайл(Адрес, Объект.ИмяФайла, Истина);
КонецПроцедуры

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

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

Если ПодключитьРасширениеРаботыСФайлами() Тогда
Ссылка = ПолучитьНавигационнуюСсылку(Объект.Ссылка, “ДанныеФайла”);
// Формирование описания передаваемых файлов (в данном случае файл один)
ПередаваемыеФайлы = Новый Массив;
Описание = Новый ОписаниеПередаваемогоФайла(Объект.ИмяФайла, Ссылка);
ПередаваемыеФайлы.Добавить(Описание);
// Готовим объект для получения информации о полученных файлах
ПереданныеФайлы = Новый Массив;

// Определяем прочие параметры методов
КаталогСохранения = “c:temp”;
Интерактивно = Ложь;
ИмяПереданногоФайла = КаталогСохранения + “” + Объект.ИмяФайла;
// Готовим описание методов для получения разрешений
Методы = Новый Массив;
Методы.Добавить(Новый Массив);
Методы[0].Добавить(“ПолучитьФайлы”);
Методы[0].Добавить(ПередаваемыеФайлы);
Методы[0].Добавить(ПереданныеФайлы);
Методы[0].Добавить(КаталогСохранения);
Методы[0].Добавить(Интерактивно);
Методы.Добавить(Новый Массив);
Методы[1].Добавить(“ЗапуститьПриложение”);
Методы[1].Добавить(ИмяПереданногоФайла);
Если Не ЗапроситьРазрешениеПользователя(Методы) Тогда
Предупреждение(“Пользователь отказал в разрешении.”);
Возврат;
КонецЕсли;
ПолучитьФайлы(ПередаваемыеФайлы, ПереданныеФайлы, КаталогСохранения, Интерактивно);
ЗапуститьПриложение(ИмяПереданногоФайла);
Иначе
Предупреждение(“Выполнение не поддерживается. Не установлено расширение работы с файлами.”);
КонецЕсли;

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

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

ПолучитьФайлы()/НачатьПолучениеФайлов(),
● ПоместитьФайлы()/НачатьПомещениеФайлов(),
● НайтиФайлы()/НачатьПоискФайлов(),
● КопироватьФайл()/НачатьКопированиеФайла(),
● ПереместитьФайл()/НачатьПеремещениеФайла(),
● УдалитьФайлы()/НачатьУдалениеФайлов(),
● СоздатьКаталог()/НачатьСозданиеКаталога(),
● ЗапуститьПриложение()/НачатьЗапускПриложения().

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

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

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

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

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

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

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

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

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

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

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

Skip to content

1С временное хранилище, записать, получить данные или файлы

1С временное хранилище: записать, получить файл или другие данные

Временное хранилище в 1С используется для передачи данных между сервером и клиентом. После прочтения данных — информация стирается из временного хранилища.

Пример записи данных

Например поместим табличную часть документа во временное хранилище:

&НаСервере
Процедура ПоместитьТЧВоВременноеХранилищеНаСервере()
	ТаблицаЗначенийТовары = Объект.Товары.Выгрузить(); 
	Объект.АдресВХ = ПоместитьВоВременноеХранилище(ТаблицаЗначенийТовары); 
КонецПроцедуры

Пример извлечения данных

&НаСервере
Процедура ПрочитатьДанныеИзВременногоХранилищаНаСервере()
	ТаблицаЗначенийТовары = ПолучитьИзВременногоХранилища(Объект.АдресВХ);
	Для каждого Стр Из ТаблицаЗначенийТовары Цикл
		Сообщить("Номенклатура: " + Стр.Номенклатура + ", цена: " + Стр.Цена); 
	КонецЦикла; 
КонецПроцедуры

Связанные статьи

Содержание:

1.       Работа с файлами в 1С

2.       Работа с изображениями в 1С

3.       Работа в фоновых заданиях в 1С

С появлением управляемых форм изменился и функционал взаимодействия процедур и функций в модулях форм, объектов и общих модулях 1C. В частности, из-за разделения выполнения кода на «клиент» и «сервер», появились некоторые ограничения на передачу данных между ними. И если передача переменных с простым типом данных осталась такой же, то возникла необходимость изменить передачу переменных сложных типов или больших объёмов данных между «клиентом» и «сервером».

Инструментом для реализации этого является Временное Хранилище в 1С. Этот функционал позволяет организовать временное хранение информации, главным образом для обмена ею при клиент-серверном взаимодействии.

Временное хранилище в 1С для разработчика представлено в виде строковой переменной, в которую помещён адрес, где хранятся данные.

В этой статье рассмотрим 3 основные области применения Временного хранилища в 1С:

1.       Работа с файлами в 1С

2.       Работа с изображениями в 1С, выводимыми на форму

3.       Работа в фоновых заданиях в 1С

Важно знать, что объем данных, помещаемых во временное хранилище 1С (за один вызов метода «ПоместитьВоВременноеХранилище») не должен превышать 4 Гб в сериализованном виде.

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

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

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

·         при контекстном или неконтекстном клиентском вызове из формы;

·         при следующем серверном вызове из клиентского общего модуля 1С;

·         при серверном вызове из модуля команды;

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

1.   Работа с файлами в 1С

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

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

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

Для иллюстрации будем использовать новые методы работы с файлами, доступными с версии платформы 1С Предприятие 8.3.15.

Ниже приведен код процедур помещения файла в реквизит «ДанныеФайла» объекта справочника:

код процедур помещения файла

Команда «СохранитьФайл» вызывается по нажатию кнопки на форме. Процедура «НачатьПомещениеФайлаНаСервер» в данном случае вызывает окно выбора файла и после помещает выбранный файл во временное хранилище. Обработка результата помещения файла происходит в процедуре «ЗавершениеПомещенияФайла».

В переменной «ОписаниеФайла» содержится свойство «Адрес», которое и указывает на временное хранилище выбранного файла. Если файл не выбран, то свойство «ПомещениеФайлаОтменено» переменной «ОписаниеФайла» возвратит «Истина».

Сама запись файла в реквизит объекта справочника происходит в процедуре «ПередЗаписьюНаСервере». Для этого сначала анализируется с помощью метода «ЭтоАдресВременногоХранилища» – действительно ли идёт обработка переменной с адресом временного хранилища; потом идёт получение данных файла из временного хранилища с помощью метода «ПолучитьИзВременногоХранилища», но уже на стороне сервера.

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

ПолучитьИзВременногоХранилища

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

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

Важно понимать, что передавать данные файла с типом «Двоичные данные» между клиентом и сервером с помощью параметров методов невозможно. Это не примитивный тип данных. Поэтому и приходится использовать временное хранилище.  

2.   Работа с изображениями в 1С

По сути изображение в 1С – это тоже файл. Поэтому получение изображения-файла на стороне клиента и помещение его на сервер ничем не отличается от представленного выше кода для работы с файлом.

Тут приведем лишь получение картинки из реквизита справочника и вывод её на форму.

Работа с изображениями в 1С

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

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

3.   Работа в фоновых заданиях в 1С

Для передачи результата выполнения фонового задания в 1С также используются временные хранилища. Само по себе выполнение фонового задания не возвращает результат. Если после выполнения фонового задания необходимо проанализировать полученные данные, то это надо предусмотреть при выполнении фонового задания в 1С.

Схема выполнения с возвратом результата такая:

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

2. Выполняемое фоновое задание по окончании работы помещает результат в полученное временное хранилище.

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

Код в модуле формы:

обработчик ожидания 1С

В общем модуле «ДляФоновыхЗаданий»:

модуль ДляФоновыхЗаданий

Процедура «Фоновое» вызывает серверную процедуру, которая создает пустое временное хранилище в 1С 8.3 и передает его в качестве параметра в выполнение фонового задания.

Само фоновое задание выполняется в общем модуле. В нашем примере оно просто помещает значение строковой переменной в переданное временное хранилище.

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

Специалист компании ООО «Кодерлайн»

Османов Нагим Мавлетгалиевич

Содержание[Убрать]

    • Помещение в хранилище
    • Чтение из хранилища

Передача файла с клиента на сервер и обратно.

В связи с новым подходом в программировании на платформе 8.2 возникла необходимость передачи данных между клиентом и сервером при этом прямая передача в виде параметров имеет ряд ограничений. И тогда был введен объект «Временное хранилище».

Чем полезно временное хранилище:

  • Не надо создавать объекты в конфигурации
  • Доступно и с сервера и с клиента
  • Можно записать любой объект
  • Ускорение работы 1С

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

Синтаксис работы с хранилищем простой:

Передав параметром, данные которые хотим поместить(Посылка) и УникальныйИдентификатор получаем Адрес, по которому потом можно будет обратиться. Причем передаваемый идентификатор не является получаемым в последствии адресом. Вместо идентификатора можно передать строку Адреса, по которому и будет помещено наше значение, но это не любая строка! Строка Адреса выглядит примерно вот так «e1cib/tempstorage/ae5c5472-0266-4892-9073-20392dd5a6a6».


УникальныйИдентификатор = Новый УникальныйИдентификатор;
Адрес = ПоместитьВоВременноеХранилище(Посылка, УникальныйИдентификатор);

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


Адрес = ПоместитьВоВременноеХранилище(Посылка);
ПрочитатьНаСервере(Адрес); // процедура на сервере которая читает из хранилища с помощью метода ПолучитьИзВременногоХранилища()
ПрочитатьНаСервере(Адрес); // при этом вызове серверной процедуры значения в хранилище уже не будет.

Чтобы получить из хранилища нужно только указать адрес:


Посылка = ПолучитьИзВременногоХранилища(Адрес);

Также можно удалить помещенный объект, используя адрес


УдалитьИзВременногоХранилища(Адрес);

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

Помещение в хранилище


ДвоичДанные = Новый ДвоичныеДанные(ПутьКФайлу);
Адрес = ПоместитьВоВременноеХранилище(ДвоичДанные, УникальныйИдентификатор);

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

Чтение из хранилища

В интернете есть множество примеров как на сервере записать полученные данные в базу, поэтому ниже приводится другой пример, когда файл полученный на сервере открывается для работы. В качестве такого файла используется XML.


ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
ИмяВременногоФайлаXML = ПолучитьИмяВременногоФайла("xml"); // например был помещен XML
ДвоичныеДанные.Записать(ИмяВременногоФайлаXML);
ЧтениеXML = Новый ЧтениеXML; 
ЧтениеXML.ОткрытьФайл(ИмяВременногоФайлаXML);
ЧтениеXML.Прочитать();
// Дальше стандартная работа с XML

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


ПоместитьФайл(Адрес,,,Истина,ЭтаФорма.УникальныйИдентификатор);

В параметре Адрес, можно указать Адрес в который нужно записать файл, если нужен новый адрес, то нужно передать пустую строку.


Адрес = "";
ПоместитьФайл(Адрес,,,Истина,ЭтаФорма.УникальныйИдентификатор);

Истина – открывает окно для выбора папки и имени файла, при значении Истина есть возможность открыть файл.»КопияФайла.xml» – Имя файла под которым будет сохранен файл.Адрес – это адрес в хранилище,ПолучитьФайл(Адрес,»Копияфайла.xml» , Истина);Чтобы сохранить файл из временного хранилища на Клиенте можно использовать метод

Для получения файла используется метод


ПолучитьФайл(Адрес,"Копияфайла.xml" , Истина);

Поместить файл во временное хранилище

Автор magnifico61, 20 июн 2017, 09:32

0 Пользователей и 1 гость просматривают эту тему.

&НаКлиенте
Процедура ФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Оповещение  =  Новый ОписаниеОповещения("ОбработатьВыборФайла",   ЭтотОбъект);
НачатьПомещениеФайла(Оповещение,   ,   ,   Истина,   УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
ЗаполнитьИмяФайла(ВыбранноеИмяФайла);
Объект.СсылкаНаХранилище = Адрес;
КонецПроцедуры

Процедура ЗаполнитьИмяФайла(Имя)
Объект.Файл = Имя;
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьИзExcelНаСервере()
Если ЗначениеЗаполнено(Объект.КолонкаАртикул) И ЗначениеЗаполнено(Объект.КолонкаКоличество) Тогда
//ФайлЭксель = Новый Файл(Объект.Файл);

АдресЭксель = ПолучитьИзВременногоХранилища(Объект.СсылкаНаХранилище);
ФайлЭксель = Новый Файл(АдресЭксель);
Если ФайлЭксель.Существует() Тогда
Об_Конект = ADO_ПолучитьПодключениеКФайлуExcel(Объект.Файл);
ВысотаЗаголовка = 0;
СтрЗапроса = "
|SELECT *
|FROM [A" + ВысотаЗаголовка + ":AZ100000]
|";

Об_РекордСет = Новый COMОбъект("ADODB.Recordset");
Попытка
Об_РекордСет=Об_Конект.Execute(СтрЗапроса);
Исключение
Сообщить("Не удалось выполнить запрос к файлу Excel");
Возврат;
КонецПопытки;
ЗагрузитьВТЧТовары(Об_РекордСет);
Об_Конект=Неопределено;
Об_РекордСет=Неопределено;
Иначе
Сообщить("Файл "+ Объект.Файл +" не найден!");
КонецЕсли;
Иначе
Сообщить("Не заполнены поля колонки артикул и количество!");
КонецЕсли;
КонецПроцедуры

При получении файла из временного хранилища это не выбранный файл, Где ошибка?


(0) а ГДЕ описание {УникальныйИдентификатор}, типа УникальныйИдентификатор=Новый УникальныйИдентификатор;

Цитата: magnifico61 от 20 июн 2017, 09:32НачатьПомещениеФайла(Оповещение,   ,   ,   Истина,   УникальныйИдентификатор);

и отладчиком посмотри КАК у тебя идёт всё…

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


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


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

Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google


magnifico61,

Об_Конект = ADO_ПолучитьПодключениеКФайлуExcel(ФайлЭксель.ПолноеИмя);

Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!


Цитата: Dethmontt от 20 июн 2017, 10:58
magnifico61,
Об_Конект = ADO_ПолучитьПодключениеКФайлуExcel(ФайлЭксель.ПолноеИмя);

файл эксель не существует на сервере, до этого момента не доходит

Добавлено: 20 июн 2017, 11:15


Цитата: oleg-x от 20 июн 2017, 10:52
Не знаю как там с временным хранилищем, но я бы переписал выполнения чтения файла и его обработку не на сервере, а на клиенте.

Если можно пример как это сделать при данном варианте.


Цитата: magnifico61 от 20 июн 2017, 11:15

Цитата: Dethmontt от 20 июн 2017, 10:58
magnifico61,
Об_Конект = ADO_ПолучитьПодключениеКФайлуExcel(ФайлЭксель.ПолноеИмя);

файл эксель не существует на сервере, до этого момента не доходит

Добавлено: 20 июн 2017, 11:15


Цитата: oleg-x от 20 июн 2017, 10:52
Не знаю как там с временным хранилищем, но я бы переписал выполнения чтения файла и его обработку не на сервере, а на клиенте.

Если можно пример как это сделать при данном варианте.

Вот это:

&НаСервере
Процедура ЗагрузитьИзExcelНаСервере()

Переделать на

&НаКлиенте
Процедура ЗагрузитьИзExcelНаСервере()

Далее смотрим что либо все работает, либо смотрим что еще переписать.

Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google


Цитата: magnifico61 от 20 июн 2017, 09:32АдресЭксель = ПолучитьИзВременногоХранилища(Объект.СсылкаНаХранилище);

Что в переменной АдресЭксель ???

Добавлено: 20 июн 2017, 12:06


Что нибудь типа такого

&НаСервере
Процедура ЗагрузитьИзExcelНаСервере()
    Если ЗначениеЗаполнено(Объект.КолонкаАртикул) И ЗначениеЗаполнено(Объект.КолонкаКоличество) Тогда
        //ФайлЭксель = Новый Файл(Объект.Файл);

                 АдресЭксель = ПолучитьИзВременногоХранилища(Объект.СсылкаНаХранилище);
        //Если АдресЭксель это ДвоичныеДанные
        ПутьТемп = ПолучитьИмяВременногоФайла("xls"); //Нужно передавать сюда расширение файла типа Объект.РасширениеФайла
        АдресЭксель.Записать(ПутьТемп);
            Об_Конект = ADO_ПолучитьПодключениеКФайлуExcel(ПутьТемп);
            ВысотаЗаголовка = 0;

Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!


сделал через сохранение файла на сервере.


Весьма частая задача, с которой сталкивается 1С разработчик – это чтение файлов Excel и загрузка их в 1С. Есть как минимум два способа прочитать файл Excel – средствами платформы 1С, или используя COM-объект приложения MS Excel. В статье рассматривается чтение файлов xls, xlsx при помощи табличного документа.

Содержание

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

В платформе 1С 8 существует объект ТабличныйДокумент, который позволяет формировать и выводить на экран печатные формы в табличном виде. Но у табличного документа есть еще одно применение – чтение данных из табличных файлов. Поддерживаются форматы xls, xlsx и ods. Т.е. можно загружать табличные файлы, созданные в пакете MS Office или OpenOffice Calc.

Значения типа Число или Дата, содержащиеся в ячейках исходного табличного файла, можно считать двумя способами – как значение, либо как текст. Рассмотрим пример: пусть в ячейке содержится число 123,456, и установлен формат с округлением до целого числа; в этом случае отображаться будет текст “123”, а значение будет храниться 123,456

  1. Если прочитать с указанием способа чтения как “Значение”, в табличный документ 1С будет прочитано исходное значение 123,456
  2. Если прочитать с указанием способа чтения как “Текст”, значение будет потеряно, и в табличный документ прочитается текст “123”

Использование объекта ВременноеХранилище

Вспомогательные процедуры — диалог выбора файла

Следующий код не является обязательным для решения задачи – путь к исходному файлу можно указать в коде, ввести вручную, скопировать из адресной строки ОС или прочитать из БД – вариантов очень много. Мы же рассмотрим пример, когда пользователь сам указывает файл на клиентском компьютере, и путь к этому файлу помещается в реквизит. В примере будем использовать реквизит формы ПутьКФайлу

Чтение файла Excel. Диалог выбора файла

Создадим обработчик события НачалоВыбора:

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ВыбратьФайлНаКлиенте();
	
КонецПроцедуры

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

&НаКлиенте
Асинх Процедура ВыбратьФайлНаКлиенте()
	
	Перем Диалог;
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
	Диалог.ИндексФильтра = 0;
	Диалог.ПредварительныйПросмотр = Ложь;
	Диалог.МножественныйВыбор = Ложь; 
	РезультатВыбора = Ждать Диалог.ВыбратьАсинх();
	Если РезультатВыбора <> Неопределено Тогда
		ПутьКФайлу = РезультатВыбора[0];
	КонецЕсли;
	
КонецПроцедуры

Двоичные данные во временное хранилище

Логика кода будет следующая. Нам понадобятся двепроцедуры – клиентский обработчик команды, и серверный метод который и будет непосредственно считывать переданный файл.

Клиентский код:

  1. проверяем, указан ли путь к файлу. Если не указан – прекращаем выполнение
  2. Получаем двоичные данные из файла по указанному пути
  3. Помещаем эти двоичные данные во временное хранилище
  4. Далее передаем на сервер адрес этого временного хранилища
&НаКлиенте
Процедура ДвоичныеДанныеВоВременноеХранилище(Команда)

	Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
		Возврат;
	КонецЕсли;
	
	ДД = Новый ДвоичныеДанные(ПутьКФайлу);
	АдресВХ = ПоместитьВоВременноеХранилище(ДД);
	ПрочитатьИзВХНаСервере(АдресВХ);
	
КонецПроцедуры

Серверный код:

  1. Создаем временный файл с нужным расширением (в примере – xlsx)
  2. Получаем двоичные данные из временного хранилища
  3. Записываем во временный файл
  4. Определяем вариант чтения файла – читать значения табличного документа как текст, или как значения
  5. Далее используем метод Прочитать, и считываем из временного файла данные в табличный документ

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

&НаСервере
Процедура ПрочитатьИзВХНаСервере(АдресВХ, Режим = "Значение")
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
	
	ДД = ПолучитьИзВременногоХранилища(АдресВХ);
	ДД.Записать(ИмяВременногоФайла);

	Если Режим = "Текст" Тогда
		СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Текст;
	Иначе
		СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Значение;
	КонецЕсли;

	Попытка
		ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтения);
	Исключение
	КонецПопытки;	
	
КонецПроцедуры

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

Помещение файла на сервер в 1С

Более простой, но менее универсальный способ, предназначенный исключительно для передачи файла с клиента на сервер – это использование метода НачатьПомещениеФайлаНаСервер. В платформе предусмотрено несколько методов для помещения файлов – как одиночных, так и нескольких одновременно. Эти методы делятся на синхронные и асинхронные. Начиная с версии 8.3.18 появились методы, использующие ключевые слова Асинх и Ждать. Аналогичный метод мы рассмотрели при работе с диалогом. Далее разберем “классический” вариант с обработкой оповещения. 

Логика кода следующая:

  1. Создаем описание оповещения и указываем в нем процедуру, которая будет вызвана после окончания помещения файла на сервер
  2. Указываем параметры диалога выбора файла и добавляем фильтр
  3. Вызываем помещение файла на сервер
  4. После того как файл помещен во временное хранилище, используем ту же процедуру, которую мы реализовали в первом примере – ПрочитатьИзВХНаСервере. В этом примере мы для разнообразия используем способ чтения значений как “Текст”.
&НаКлиенте
Процедура ПередачаФайла(Команда)
	
ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещения", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОкончанияПомещения(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
	
АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьИзВХНаСервере(АдресФайла, "Текст");
	
КонецПроцедуры

Использование потока для чтения файла

В случае, если нам нужно просто передать файл с клиента на сервер для сохранения в базу данных, либо мы хотим прочитать файл в формате ods(Open Documents Spreadsheet) или mxl(встроенный формат табличных документов 1С), мы можем воспользоваться еще одним способом – с использованием потоков данных.

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

&НаКлиенте
Процедура ПрочитатьЧерезПоток(Команда)

ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещенияПоток", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "файлы ODS или MXL|*.ods;*.mxl";

НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);

КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОкончанияПомещенияПоток(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт

АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьВПоток(АдресФайла);

КонецПроцедуры

&НаСервере
Процедура ПрочитатьВПоток(АдресФайла)

ДД = ПолучитьИзВременногоХранилища(АдресФайла);
Поток = ДД.ОткрытьПотокДляЧтения();
ТабДок.Прочитать(Поток,,ТипФайлаТабличногоДокумента.ODS);
Поток.Закрыть();

КонецПроцедуры

Надеюсь, рассмотренные примеры помогут вам справиться с задачей передать файл с клиента на сервере и прочитать файл Excel в 1С.

Like this post? Please share to your friends:
  • 1с печать документа по шаблону word
  • 1с печать договора по шаблону word
  • 1с печать word программно
  • 1с печатная форма документ word
  • 1с печатная форма в word колонтитулы