В платформе 1С:Предприятие 8 существуют два механизма, которые на первый взгляд могут показаться похожими, но служат разным целям: Временное хранилище и Хранилище значения. Понимание их различий и назначения критически важно для эффективной разработки.
Временное хранилище (ВХ)
Назначение:
Временное хранилище предназначено для краткосрочного хранения данных на сервере в рамках одного сеанса пользователя. Его основное назначение — обеспечение обмена данными между клиентом и сервером, особенно при работе с файлами и в асинхронных операциях, а также для передачи данных между формами.
Ключевые особенности Временного хранилища:
Кратковременность: Данные во Временном хранилище существуют ограниченное время. Время жизни данных может быть привязано к времени жизни формы, или они могут удаляться после следующего серверного вызова или запроса формы, если не были привязаны к форме.
Хранение в памяти или временных файлах сервера: Данные не записываются в основную базу данных, а хранятся в оперативной памяти сервера или во временных файлах.
Передача данных: Основная роль — передача данных между клиентским приложением и сервером, например, при загрузке файла с компьютера пользователя на сервер перед его сохранением в информационную базу.
Работа с файлами: Часто используется совместно с механизмом работы с файлами для загрузки и скачивания файлов в веб-клиенте и тонком клиенте.
Асинхронность и фоновые задания: Позволяет передавать данные из фонового задания в сеанс, инициировавший это задание.
Ограничение на размер: Существует ограничение на объем данных, помещаемых во временное хранилище за один вызов (например, не более 4 Гб в сериализованном виде для метода ПоместитьФайл()).
Основные методы:
ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификаторФормы): Помещает данные во временное хранилище. Возвращает строковый адрес, по которому можно получить данные.
Данные: Любое значение, которое нужно сохранить.
УникальныйИдентификаторФормы (необязательный): Если указан, то данные будут автоматически удалены при закрытии формы с этим идентификатором.
ПолучитьИзВременногоХранилища(Адрес): Получает данные из временного хранилища по их адресу. Если данных по адресу нет (например, удалены или адрес некорректен), возвращает Неопределено.
УдалитьИзВременногоХранилища(Адрес): Явно удаляет данные из временного хранилища.
Примеры использования Временного хранилища:
Загрузка файла с клиента на сервер: Пользователь выбирает файл на своем компьютере, файл помещается во Временное хранилище, а затем на сервере извлекается для дальнейшей обработки (например, сохранения в Хранилище значения или в файловую систему сервера).
// Клиентский код (упрощенно) &НаКлиенте Процедура ПрикрепитьФайл(Команда) Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Если Диалог.Выбрать() Тогда АдресВременногоХранилища = ""; ПоместитьФайл(АдресВременногоХранилища, Диалог.ПолноеИмяФайла, , Ложь, УникальныйИдентификатор); // Далее можно вызвать серверную процедуру и передать АдресВременногоХранилища ОбработатьЗагруженныйФайлНаСервере(АдресВременногоХранилища, Диалог.ИмяФайла); КонецЕсли; КонецПроцедуры // Серверный код &НаСервере Процедура ОбработатьЗагруженныйФайлНаСервере(АдресВременногоХранилища, ИмяФайла) ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища); Если ДвоичныеДанные <> Неопределено Тогда // ... обработка двоичных данных ... // Например, сохранение в ХранилищеЗначения НовыйФайл = Справочники.ПрисоединенныеФайлы.СоздатьЭлемент(); НовыйФайл.Наименование = ИмяФайла; НовыйФайл.ФайлХранилище = Новый ХранилищеЗначения(ДвоичныеДанные); НовыйФайл.Записать(); КонецЕсли; КонецПроцедуры
Передача больших данных между формами: Если нужно передать из одной формы в другую большой объем данных, который нецелесообразно передавать через параметры. Данные помещаются во Временное хранилище в одной форме, а в другой извлекаются по полученному адресу.
Формирование и передача печатных форм: Сформированный на сервере табличный документ можно поместить во Временное хранилище и передать на клиент для отображения или сохранения.
Промежуточное хранение данных при длительных операциях: Чтобы не хранить большие объемы данных в оперативной памяти сервера в течение всей длительной операции.
Хранилище значения
Хранилище значения в 1С — это тип данных, предназначенный для хранения в базе данных различных значений, включая те, которые не могут быть напрямую сохранены в полях базы данных стандартных типов. Основное его назначение — хранение сериализованных данных, то есть данных, преобразованных в формат, пригодный для записи и последующего восстановления.
Ключевые особенности Хранилища значения:
Универсальность: Позволяет хранить практически любые типы данных, включая примитивные типы, картинки, двоичные данные (например, файлы Word, PDF), таблицы значений, структуры и другие сериализуемые объекты.
Хранение в базе данных: Данные, помещенные в Хранилище значения, физически сохраняются в базе данных (в файле .1CD или таблицах SQL-сервера). Это означает, что они включаются в резервные копии базы.
Сжатие: Поддерживается возможность сжатия данных перед сохранением, что позволяет экономить место в базе данных, особенно при работе с большими объектами. Степень сжатия можно настраивать.
Ограничения: Для полей типа Хранилище значения не поддерживается индексирование, упорядочивание в запросах и выборках, а также суммирование. Система не контролирует ссылочную целостность для объектов, сохраненных в Хранилище значения. Хранение больших объемов данных непосредственно в полях объектов может замедлить работу системы.
Примеры использования Хранилища значения:
Хранение изображений: Например, фотографии товаров в справочнике номенклатуры, сканы подписанных документов.
// Пример: Сохранение картинки в Хранилище значения МояКартинка = Новый Картинка("C:\Temp\Image.jpg"); ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка, Новый СжатиеДанных(9)); // 9 - максимальная степень сжатия ЭлементСправочника.МоеПолеХранилище = ХранилищеКартинки; ЭлементСправочника.Записать();
Хранение файлов: Прикрепление к документам или элементам справочников различных файлов (договоров, спецификаций, инструкций).
// Пример: Сохранение файла в Хранилище значения ДвоичныеДанныеФайла = Новый ДвоичныеДанные("C:\Temp\Document.docx"); ХранилищеФайла = Новый ХранилищеЗначения(ДвоичныеДанныеФайла); ОбъектДокумент.ПрикрепленныйФайл = ХранилищеФайла; ОбъектДокумент.Записать();
Хранение сложных структур данных: Сохранение настроек пользователя, таблиц значений или других сложных структур, которые неудобно или невозможно хранить в отдельных реквизитах.
// Пример: Сохранение таблицы значений в Хранилище значения МояТаблицаЗначений = Новый ТаблицаЗначений; // ... заполнение таблицы ... ХранилищеТаблицы = Новый ХранилищеЗначения(МояТаблицаЗначений); Константы.НастройкиОтчета.Установить(ХранилищеТаблицы);
Когда что использовать?
Используйте Хранилище значения, когда вам нужно надежно сохранить какие-либо данные (файлы, картинки, сложные настройки) непосредственно в информационной базе на длительный срок.
Используйте Временное хранилище, когда вам нужно передать данные между клиентом и сервером (особенно файлы), передать данные между формами, или когда данные нужны лишь на короткий промежуток времени в рамках текущей операции или сеанса. Часто Временное хранилище используется как промежуточный этап перед помещением данных в Хранилище значения (например, при загрузке файла с клиента).
Понимание различий и назначения этих двух механизмов позволяет разработчикам 1С эффективно управлять данными и оптимизировать работу приложений.