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

Материал обновлен для соответствия Drupal 8.7.0+

Temp store (временное хранилище) - позволяет вам временно хранить какие-либо данные. Это своего рода хранение данных в $_SESSION , так как данное хранилище привязывается, как правило, к какому-то пользователю. Вот только $_SESSION оно не использует и хранит всё внутри системы (в БД).

В ядре есть два сервиса для временного хранилища tempstore.private и tempstore.shared . Работают они идентично, но private всегда хранит данные для конкретного пользователя. То есть вызов по одному ключу у приватного хранилища, будет отдавать разные данные для каждого пользователя. Shared же, доступен из под каждого юзера.

Область применения данных сервисов и их хранилищ может быть очень огромной. Например, хранить какие-то временные значения форм, и если пользователь их не сохранил, их можно будет восстановить из этого хранилища, например для каких-нибудь REST формочек, да и для обычных подойдет. В общем то, на что у вас хватит фантазии или задач. Например, это можно использовать для каких-нибудь формочек контролируемых вне Drupal, например на React или Vue.

Значения в данных хранилищах живут по умолчанию 604800 секунд (1 неделю), после чего автоматически удаляются.

Для того чтобы изменить это значение. Нужно будет подключать например sites/default/services.yml и в нём переопределить:

Parameters: # 10 секунд tempstore.expire: 10

Но такого, по хорошему, быть не должно.

Давайте рассмотрим возможности каждого из хранилищь, хоть они и похожи, они немного отличаются.

tempstore.private - приватное хранилище

Данное хранилище является приватным для каждого пользователя.

tempstore.shared - общее хранилище

Данное хранилище является общим, и может содержать общие для всех пользователей данные.

Хранилище имеет следующие методы:

  • get($key) : Получает значение из хранилища по его ключу. Если данных нет, вернёт NULL , если есть, вернет значение.
  • getIfOwner($key) : Получает значение из хранилища по его ключу. Если данных нет или данные записаны не из под текущего пользователя, вернёт NULL , если есть и были записаны из под текущего пользователя, вернет значение.
  • setIfNotExists($key, $value) : Записывает в хранилище значение $value под ключем $key , только если на данный момент нет данных по данному ключу. Возвращает TRUE если записалось, FALSE , если данные уже были.
  • setIfOwner($key, $value) : Записывает в хранилище значение $value под ключем $key , только если данных на данный момент нет, или владелец актуальных данных является текущим пользователем.
  • set($key, $value) : Записывает в хранилище значение $value под ключем $key .
  • getMetadata($key) : Возвращает метаданные для конкретного $key , без данных. Это объект содержащий свойство owner, в котором хранится значение, кому принадлежит значение, и свойство updated - unix-таймштампом времени записи этого значения.
  • delete($key) : Удаляет из хранилища данные связанные с данным ключем $key .
  • deleteIfOwner($key) : Удаляет из хранилища данные связанные с данным ключем $key , только при условии что данные пренадлежат текущему пользователю.

Как они вызываются

Мелкие примеры как их вызывать.

Первым делом получается tempstore нужного хранилища, затем из хранилища получается "коллекция", где уже и хранятся данные под нужными ключами. Как правило, название "коллекции" равняется названию модуля.

Use Drupal\Core\TempStore\PrivateTempStoreFactory; use Drupal\Core\TempStore\SharedTempStoreFactory; /** @var PrivateTempStoreFactory $private_tempstore */ $private_tempstore = \Drupal::service("tempstore.private"); $my_private_storage = $private_tempstore->get("dummy"); $my_private_storage->set("username", "Drupal"); /** @var SharedTempStoreFactory $shared_tempstore */ $shared_tempstore = \Drupal::service("tempstore.shared"); $my_shared_storage = $shared_tempstore->get("dummy"); $my_shared_storage->set("username", "Drupal");

Пример

В примере мы создадим форму на странице /temp-store-form с двумя полями, одно из которых будет хранить сообщение в приватном хранилище, а другое в общем.

Создаём форму:

Src/FormWithTempStore.php

privateTempStore = $private_temp_store->get("dummy"); $this->sharedTempStore = $shared_temp_store->get("dummy"); } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static($container->get("tempstore.private"), $container->get("tempstore.shared")); } /** * {@inheritdoc} */ public function getFormId() { return "form_with_temp_store"; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { $form["private_message"] = [ "#type" => "textarea", "#title" => $this->t("Private message"), "#required" => TRUE, "#description" => $this->t("This value will be private for each user."), "#default_value" => $this->privateTempStore->get("message"), ]; $form["shared_message"] = [ "#type" => "textarea", "#title" => $this->t("Shared message"), "#required" => TRUE, "#description" => $this->t("This value will be shared for all users."), "#default_value" => $this->sharedTempStore->get("message"), ]; $form["actions"] = ["#type" => "actions"]; $form["actions"]["submit"] = [ "#type" => "submit", "#value" => $this->t("Save"), ]; return $form; } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $this->privateTempStore->set("message", $form_state->getValue("private_message")); $this->sharedTempStore->set("message", $form_state->getValue("shared_message")); } }

Печать (Ctrl+P)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Определяем прочие параметры методов
КаталогСохранения = “c:\temp”;
Интерактивно = Ложь ;
ИмяПереданногоФайла = КаталогСохранения + “\” + Объект.ИмяФайла ;
// Готовим описание методов для получения разрешений
Методы = Новый Массив;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Печать (Ctrl+P)

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

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

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

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

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

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

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

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

В хранилище значения можно сохранить почти любую информацию, например,

... картинки (фотки):

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

// в этом месте он все выводит... ЭлементыФормы.ПолеКартинки1.Картинка = Хранилище.Получить(); ТекИзображение.Записать();

...табличный документ:

ТабДок=Новый ТабличныйДокумент; ТабДок.Вывести(ЭлементыФормы.ПолеТабличногоДокумента1); Хранилище=Новый ХранилищеЗначения(ТабДок); Записать();

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

Процедура ВосстановитьИзХранилищаНажатие(Элемент)

ТабДок=Хранилище.Получить(); Если ТабДок<>Неопределено Тогда ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ТабДок); КонецЕсли;

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

... произвольные файлы (двоичные данные):

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

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

ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл),Новый СжатиеДанных(9));

... внешние обработки и отчеты:

Процедура ЗагрузитьОбработкуВХранилище(РеквизитТипХранилище)

СтепеньСжатия = Новый СжатиеДанных(9); //9 максимум РеквизитТипХранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные("c:\отчеты\отчет.epf", СтепеньСжатия));

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

Процедура ЗапуститьОбработкуИзХранилища(РеквизитТипХранилище)

ИмяВременногоФайла = КаталогВременныхФайлов()+"отчет.epf"; ДвоичныеДанные = РеквизитТипХранилище.Получить(); ДвоичныеДанные.Записать(ИмяВременногоФайла); ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяВременногоФайла); ВнешняяОбработка.ПолучитьФорму().Открыть();

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

Работа с хранилищем

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

Если ТипЗнч(Хранилище) <> Тип("ДвоичныеДанные") Тогда

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

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

КонецЕсли; ДвоичныеДанные.Записать(ИмяФайла);

Если это был, например, Word-документ (doc-файл, или другой файл зарегистрированного типа), то его можно открыть так:

ЗапуститьПриложение(ИмяФайла);

Чтобы очистить поле типа Хранилище значения, нужно присвоить ему Неопределено:

РеквизитХранилище = Неопределено;

Работа с файлами и картинками во встроенном языке 1С:Предприятия 8

Назначение

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

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

Область действия методов

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

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

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

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

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

Информационная база

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

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

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

Описание методов работы с файлами

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

Наиболее типичный сценарий использования данного механизма предусматривает первоначальное размещение данных пользователя во временное хранилище. Для этого предназначены два метода: ПоместитьФайл() и ПоместитьФайлВоВременноеХранилище().

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

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

Как результат метод возвращает Ложь, если пользователь в интерактивном режиме отказался от совершения операции в диалоге выбора файла. Метод доступен только на клиенте.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Получение в интерактивном режиме файла с диска // и помещение его во временное хранилище &НаКлиенте Процедура ВыбратьФайлСДискаИЗаписать()

Перем ВыбранноеИмя; Перем АдресВременногоХранилища; Если ПоместитьФайл(АдресВременногоХранилища, ВыбранноеИмя, Истина) Тогда Объект.ИмяФайла = ВыбранноеИмя; ПоместитьФайлОбъекта(АдресВременногоХранилища); КонецЕсли;

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

// Копирование файла из временного хранилища в реквизит // справочника, запись объекта,удаление файла из временного // хранилища &НаСервере Процедура ПоместитьФайлОбъекта(АдресВременногоХранилища)

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

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

// Считывание файла из реквизита и сохранение его // на локальном диске в интерактивном режиме &НаКлиенте Процедура ПрочитатьФайлИСохранитьНаДиск()

Адрес = ПолучитьАдресФайлаВИнформационнойБазе(Объект.Ссылка, "ДанныеФайла"); ПолучитьФайл(Адрес, Объект.ИмяФайла, Истина);

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

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

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

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

Пример // Привязка поля картинки к адресу картинки во временном // хранилище. АдресКартинки реквизит формы строкового типа

ПоместитьФайл(АдресКартинки,Истина)

Картинка.Данные = АдресКартинки

Ограничения при работе с Веб-клиентом

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

Особенности при работе с ХранилищемЗначений на Клиенте

Проблема:

Когда у Документа в табличной части есть реквизит типа ХранилищеЗначений, то тормозит открытие формы документа, если в этом реквизите записаны данные большого размера.

Предполагаемая причина:

Возможно, при открытии формы, на клиент передается не ссылка на данные находящиеся в ХранилищеЗначений, а сами данные.

Решение

  • В свойствах табличного реквизита формы есть флаг "Использовать всегда". Если он установлен, то содержимое поля всегда передается между сервером и клиентом - например, при открытии формы. Этот флаг надо отключить, но при этом нужно учесть это в коде, так как по умолчанию значения этого поля на клиенте не будет. Пример можно посмотреть в 1С:Архив.

Ещё лучше использовать временное хранилище для передачи файлов между клиентом и сервером.

Бурты . Наиболее приемлемый способ хранения кар­тофеля, корнеплодов и белокочанной капусты - бурто­вание. Бурт - это продолговатая насыпь, наклоненная с двух сторон, и накрытая сверху изоляционным материа­лом. Его делают для хранения полученного урожая в те­чение одного сезона. Бурты бывают наземные, когда кар­тофель насыпают на ровную поверхность, и полуназемные - когда выкапывают неглубокие котло­ваны. Попуназемный (заглубленный) бурт. Для такого бур­та в направлении с севера на юг копают котлован глу­биной 25 см. Наилучшая ширина котлована для семен­ного картофеля 170-200 см. При кратковременном хра­нении здорового картофеля можно делать и более ши­рокую насыпь (до 4 м). Длина котлована может быть произвольной, но, тем не менее, лучше когда она не бо­лее 20-25 м. Высота насыпи бурта при его ширине у основания 2м может быть 90-100 см. Обычно картофель закладывают на хранение в не­скольких буртах на одной площадке. Буртовую площад­ку размещают вблизи мест выращивания картофеля на не затопляемом дождевыми и талыми водами месте, не­далеко от дороги. По центральной оси котлована роют вентиляцион­ный канал шириной и глубиной 20-25 см. Он выходит за пределы котлована и по длине на 25 см превышает величину покрытия в торцовой части бурта. Часть ка­нала, выходящую за пределы котлована, плотно закры­вают сверху досками, чтобы в котлован и канал не по­пала земля. В наземных буртах вентиляционный канал располагают прямо на поверхности земли и делают его в виде решетчатого шатра, составленного из отдельных полутораметровых секций. Чтобы солома и земля не по­падали в вентиляционный канал концы его делают без щелей. Для покрытия вентиляционных каналов заранее гото­вят решетчатые секции длиной 1,5 и шириной 0,5 м. Сек­ция состоит из планок шириною 2-3 см и просветов между ними 2-2,5 см. Секции укладывают на вентиляционные канал и скрепляют друг с другом. Образующаяся сплош­ная вентиляционная решетка покрывает часть канала, рас­положенную под продукцией. Во время формирования на­сыпи картофеля или других продуктов внутрь помещают буртовой термометр или специально изготовленные четырехгранные трубки-футляры с внутренним сечением 3x3 см, в которые вставляют термометры на конце стерж­ня. Бурты вентилируют через гребень и вентиляционный канал. Бурты укрывают соломой и землей. Солому на пол­ную толщину укладывают плотным слоем снизу вверх так, чтобы перекрывался гребень бурта. После этого бурт при­сыпают тонким слоем земли с боков. Гребень бурта до пер­вых заморозков остается под соломенным прикрытием. В дождливую погоду его временно накрывают рубероидом или полиэтиленовой пленкой. При охлаждении картофе­ля до +4°С перед наступлением устойчивых морозов вен­тиляционные каналы плотно закрывают соломой, а бурт полностью укрывают землей. Если температура в буртах снижается ниже +1°С, бурты дополнительно укрывают теплоизолирующими материалами - торфом, соломой, соломистым навозом или снегом. При обильных снегопа­дах, приводящих к излишнему укрытию буртов их перио­дически очищают от снега.

Хранение в траншеях . Для этого способа хранения требуется в 2 раза меньше соломы или других теплоизо­ляционных материалов, чем при хранении в буртах. Траншеи используются при глубоком залегании грунто­вых вод. Глубина и ширина траншеи от 60-80 см (в Южных районах) до 1,5-2 м (в Сибири). Сверху тран­шеи накрываются слоем соломы: в центральных райо­нах он составляет 30-40 см, в Сибири - до 70 см. За­тем насыпается слой земли (от 40 до 70 см в зависимости от зоны). Обычно используют различные типы траншей: мел­кие, глубокие с вентиляционными каналами, с прослой­кой с землей и без прослойки и обычные. Траншеи и бурты оборудуют (естественной) про­стейшей вентиляцией. Основное её назначение - ох­лаждение картофеля и овощей в осенний период. Принцип действия приточно-вытяжной вентиляции основан на разнице давления воздуха, т.е. на тяге дви­жения воздуха вверх из-за разности температуры в шта­беле продукции и снаружи. Теплый воздух, как более легкий, уходит через вытяжную трубу, а холодный по­ступает через приточный канал. Вентиляционная сис­тема состоит из приточного и вытяжного каналов. При­точный канал проходит посредине основания бурта, в торцевых концах имеются выходы наружу. В буртах с картофелем и корнеплодами делают в виде канавки се­чением 20x20 см или 30x30 см покрытой решетчаты­ми щитами, поперечными планками или хворостом, так чтобы отдельные экземпляры продукции не про­валивались. По этому каналу в штабель самотеком по­ступает более холодный наружный воздух. Нагревший­ся воздух из штабеля удаляется по вытяжным каналам (трубам). Они представляют собой четырехгранные ко­роба из досок сечением 20x20 см или 15x15 см. В ниж­ней части, проходящей в слое овощей, их делают ре­шетчатыми, а в верхней, проходящей через укрытие, сплошными, чтобы в них не попадала земля. Сверху на них устанавливают козырек, предохраняющий про­дукцию от дождевой воды. Вытяжные трубы в зави­симости от особенностей и качества закладываемых на хранение овощей устанавливают через каждые 2-4 м по длине бурта. Одним из недостатков вертикальных вытяжных труб является то, что теплый и влажный воздух отводится только из прилегающих к ним зон штабеля, а удаленные зоны почти не охлаждаются. Около вытяжных труб за­текает вода, отпотевает и подмораживается продукция, так как здесь укрытие получается менее плотным и на­дежным. Поэтому используют гребневую вытяжную вентиляцию. При закладке на хранение овощей в сухую прохладную погоду гребень траншеи укрывают только соломой, через которую удаляется теплый воздух. Од­нако такие условия бывают редки, часто осенью стоит дождливая погода. В таких случаях устанавливают го­ризонтальный вытяжной канал - сколоченные под уг­лом 90° доски, которые укладывают на штабель овощей с выходом по торцам наружу. В этом случае траншею по гребню можно сразу укрыть соломой и землей, не опа­саясь намокания соломы и подмораживания продукции. Следует лишь вовремя закрыть торцевые отверстия. Преимущество горизонтального гребневого вытяж­ного канала перед вертикальными вытяжными венти­ляционными трубами заключается также и в том, что в этом случае теплый и влажный воздух удаляется из все­го штабеля продукции равномерно.

Яма . Наиболее простое хранилище-земляная яма - предназначена для хранения, чаще всего, небольшой партии картофеля, изредка корнеплодов. Ее копают на воз­вышенном участке с низким уровнем грунтовых вод. В за­висимости от плотности грунта ее копают с прямыми или наклонными стенами. Наиболее приемлемая форма ямы- круглая, однако, иногда их делают и прямоугольными. В плот­ном глинистом грунте выкапывают яму, по форме напоми­нающую кувшин. В песчаном грунте этого делать не рекомендуется, так как она будет обваливаться. Выкапывают яму следующим образом: очерчивают круг диаметром 1 м и выкапывают горловину кувши­на, потом, копая вглубь, постепенно расширяют яму до ширины 2-2,5 м в диаметре. Глубина ямы-кувшина должна быть 1,5-2 м. Для предохранения попадания талых вод в яму вокруг отверстия горловины выкла­дывают валик из вынутой глины. Такое хранилище зак­рывают крышкой, поставленной с уклоном для скаты­вания дождевой воды. Хорошо сделанная яма-кувшин служит без ремонта 30-40 лет. Зимой в ней сохранят­ся более постоянные температура и влажность возду­ха, чем в обычном подвале. Картофель в такой яме- кувшине не отпотевает и долго не прорастает. В небольших ямах картофель хранят без вентиляции. В больших - устанавливают вентиляционную трубу из досок или четырех кольев, вбитых в дно ямы и обвитых соломенным жгутом. Картофель опускают в яму с помощью ведра. К ведру привязывают две веревки: одну - к дужке, а другую - к днищу. После того как ведро достигнет пола, натяги­вают веревку, прикрепленную к дну. При этом ведро оп­рокидывается и картофель высыпается. Клубни при та­ком способе засыпки не травмируются. После заполнения ямы-кувшина картофелем горловину закры­вают соломой и крышкой. Первые две недели картофель выделяет много влаги при дыхании, поэтому слой соломы не должен быть толстым. Позже слой доводят до 50-70 см в зависимо­сти от условий местных зим.