- ВременноеХранилище, пропадает значение
- Проблемы с временным хранилищем
- Временное хранилище в 1С
- Как поместить данные во временное хранилище
- Как получить данные из временного хранилища
- Пример работы с временным хранилищем
- Как удалить данные из временного хранилища
- Как изменить данные во временном хранилище
- Время жизни данных в хранилище
- Как узнать является ли переменная адресом временного хранилища
- Получение данных из фонового задания
- Временное Хранилище
- 8.3 проблемы с ПоместитьВоВременноеХранилище
ВременноеХранилище, пропадает значение
вожусь с картинками, и тут такое дело. при выборе файлика сую картинку в хранилище, адрес в реквизите формы АдресКартинки. перед записью на сервере пишу в хранилище значения у объекта. при создании на сервере из хранилища значения получаю, сую во временное, адрес в АдресКартинки.
так вот при выходе из события ПриСозданииНаСервере значение в хранилище по этому адресу становится Неопределено. Почему?
влезу со своим немного не тем, но рабочим кодом.
[1с]
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
НЗ=РегистрыСведений.ФайлыЗаданий.СоздатьНаборЗаписей();
НЗ.Отбор.Задание.Установить(Объект.Ссылка);
НЗ.Прочитать();
Если НЗ.Количество() Тогда
Данные=НЗ[0].Файл.Получить();
РасширениеФайла=НЗ[0].Расширение;
Иначе
Данные=Неопределено;
Расширение=»»;
КонецЕсли;
Если Данные<>Неопределено Тогда
АдресФайла=ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если НЕ ЭтоАдресВременногоХранилища(АдресФайла) Тогда
Возврат;
КонецЕсли;
НЗ=РегистрыСведений.ФайлыЗаданий.СоздатьНаборЗаписей();
НЗ.Отбор.Задание.Установить(Объект.Ссылка);
Запись=НЗ.Добавить();
//к этому моменту ссылка не должна быть пустой
Запись.Задание=Объект.Ссылка;
Запись.Файл=Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресФайла));
Запись.Расширение=РасширениеФайла;
НЗ.Записать();
КонецПроцедуры
[/1с]
Источник
Проблемы с временным хранилищем
Добрый день!
Конфигурация 1С: Управление холдингом 1.3.10.2. Постоянно сталкиваюсь с «фантомными» ошибками при работе со сводными таблицами:
1. Периодически после ручного редактирования ячеек (показателей) в сводной таблице и сохранении результатов восстанавливаются прежние значения до редактирования
2. При ручном добавлении аналитического раскрытия в сводной таблице возникает ошибка «Поле не доступно КэшАналитикПоказателейСТАдрес»
3. Не сохраняются настройки расположения аналитик в форме настройки бланка сводной таблицы
Ошибки воспроизводятся только в продуктивной базе и ближе к вечеру, в тестовых – никогда. По ощущениям, подкрепленным примером ниже, природа этих ошибок связана с работой функций «ПолучитьИзВременногоХранилища», «ПоместитьВоВременноеХранилище». В частности ниже приведен фрагмент кода:
СтруктураТаблицИнтерфейса = ПолучитьИзВременногоХранилища(АдресТаблицИнтерфейса);
КэшАналитикПоказателейСТ = ПолучитьИзВременногоХранилища(КэшАналитикПоказателейСТАдрес);
СтруктураТаблицИнтерфейса.Вставить(«КэшАналитикПоказателейСТ»,КэшАналитикПоказателейСТ);
В соответствие с описанием работы этих функций после выполнения третьей строки во временном хранилище по адресу «АдресТаблицИнтерфейса» должна обновиться структура: в ней должно появиться свойство «КэшАналитикПоказателейСТАдрес». Если поставить точку останова после последней строки кода фрагмента и вычислить выражение «ПолучитьИзВременногоХранилища(АдресТаблицИнтерфейса)», то в полученном значении вначале действительно будет это свойство, но уже по прошествии 10 секунд повторное вычисление возвращает структуру уже без этого свойства. Т.е. теперь в последующих вызовах в других фрагментах кода это свойство будет недоступно и вызовет ошибку №2 из ранее приведенного списка.
Повторюсь, что ошибки начинают проявляться во второй половине дня (каждую ночь выполняется перезагрузка сервера 1С).
(2) Странно, как будто во временном хранилище храниться не сеарилизованное значение а непосредственно экземпляр объекта. Моя сомневается.
А ссылку на форум дашь?
Но время в 10 сек наводит на мысли о повторно используемых значениях или времени жизни этого самого значения в хранилище пока сущестыует сеанс или пока существует форма.
ВНИМАНИЕ! При получении на сервере значения из временного хранилища следует учитывать то, что оно получается по ссылке. В действительности, ссылка эта указывает на значение, которое хранится в кэше. В течение 20 минут, с момента помещения в хранилище или же с момента последнего обращения, значение сохранится в кэше, а затем записывается на диск и из кэша удаляется. При следующем обращении значение загружается с диска и снова помещается в кэш.
Вот как то так мы это делаем. Сколько крови было вылето из моих разных отверствий (глаза и ухи), пока докопались:
Источник
Временное хранилище в 1С
Временное хранилище позволяет временно хранить какие-то данные в служебных файлах 1С. Эти данные не будут записаны в базу данных, но они и не будут доступны после завершения сеанса. Обычно временное хранилище используют для передачи файла с клиента на сервер, для передачи больших массивов данных и т.п.
С временным хранилищем можно работать как на сервере, так и на клиенте. Но обращение к хранилищу на клиенте выполняет неявное обращение к серверу.
Как поместить данные во временное хранилище
Для этого используется метод глобального контекста ПоместитьВоВременноеХранилище(). Первым параметром нужно передать данные, которые нужно поместить во временное хранилище. Данный метод вернет адрес во временном хранилище, где будут храниться данные. Например:
Как получить данные из временного хранилища
Для этого используется метод глобального контекста ПолучитьИзВременногоХранилища(). Первым параметром нужно передать адрес во временном хранилище, по которому находятся некие данные (они должны быть предварительно помещены туда методом ПоместитьВоВременноеХранилище). Если по указанному адресу ничего нет, метод вернет Неопределено. Например:
Пример работы с временным хранилищем
Как удалить данные из временного хранилища
Чтобы явно удалить данные из временного хранилища нужно использовать метод УдалитьИзВременногоХранилища(), передав параметром адрес временного хранилища, например:
Как изменить данные во временном хранилище
Если во временном хранилище уже есть какие-то данные и нам нужно получить их, изменить и снова положить туда, то в методе ПоместитьВоВременноеХранилище() можно использовать второй параметр. Туда нужно передать адрес временного хранилища, куда нужно положить данные. Если там уже что-то было, то старые данные будут заменены на новые. Например:
Время жизни данных в хранилище
Если вы внимательно разбирали последний пример, то наверняка заметили такую строчку:
В ней вторым параметром в метод ПоместитьВоВременноеХранилище передается уникальный идентификатор, хотя раньше мы этого не делали. Это нужно для того, чтобы данные во временном хранилище были доступны до окончания сеанса пользователя. При завершении сеанса они будут автоматически удалены из временного хранилища.
Если не заполнять второй параметр, то данные будут удалены из хранилища сразу после завершения серверного вызова. Например:
Если указать уникальный идентификатор формы, то данные будут храниться пока открыта форма с таким идентификатором:
Как узнать является ли переменная адресом временного хранилища
Для этого можно использовать метод ЭтоАдресВременногоХранилища(), передавая ему параметром переменную с потенциальным адресом во временном хранилище. Если переменная является адресом временного хранилища, то метод вернет Истина, иначе Ложь. Например:
Так как адрес временного хранилища является обычной строкой, то можно использовать такой способ:
Получение данных из фонового задания
Через временное хранилище можно получать данные из фонового задания или передавать какие-то данные в фоновое задание. Для этого нужно воспользоваться следующим алгоритмом:
- Поместить Неопределено во временное хранилище, получить адрес и передать его в фоновое задание
- В фоновом задании поместить по этому адресу данные. Данные будут скопированы в сеанс, который запустил фоновое задание.
- Только после выполнения задания можно будет получить данные из хранилища. Для этого можно анализировать состояние выполнения фонового задания (в файловом варианте данные будут доступны до завершения фонового задания).
Источник
Временное Хранилище
Приветствую.
В последнее время перестал работать обмен данными между сервером (фоновое задание) и клиентом через временное хранилище.
на клиенте делаю
АдресПараметров = ПоместитьВоВременноеХранилище(Неопределено)
передаю параметром фоновому заданию
на сервере в фоновом задании чё-то делаю, выкладываю результат в
ПоместитьВоВременноеХранилище(Результат, АдресПараметров)
на клиенте обработчик ожидания смотрит завершение задания и
Результат = ПолучитьИзВременногоХранилища(АдресПараметров)
И если в начале день, два всё работает, то потом результат получается из хранилища на второй третий раз, а сейчас постоянно «неопределено». Одну обработку перевёл на хранилище настроек, всё заработало отлично, но это же не правильно.
Платформа 1С:Предприятие 8.3 (8.3.10.2580) УПП 1.3.100.1 SQL 2008
(9)пардон не принят, результат = неопреледено постоянно
В СП на тему ВХ и фоновых заданий довольно длинный текст с кучей сюрпризов.
Временное хранилище, сформированное в одном сеансе, недоступно из другого сеанса.
Исключением является возможность передачи данных из фонового задания в сеанс, инициировавший фоновое задание, с помощью временного хранилища. Для такой передачи следует в родительском сеансе поместить во временное хранилище пустое значение, передав идентификатор формы. Затем полученный адрес передать в фоновое задание через параметры фонового задания. Далее, если этот адрес использовать в параметре , то результат будет скопирован в сеанс, из которого было запущено фоновое задание.
Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания.
Данные, помещенные в фоновом сеансе в хранилище по сформированному в родительском сеансе адресу, сразу после помещения становятся недоступными в фоновом сеансе. «
по классике все просто:
в форме реквизиты формы АдресВХранилище и ИдентификаторЗадания и .
далее в фоне в серверном ОМ типо этого:
Источник
8.3 проблемы с ПоместитьВоВременноеХранилище
на 8.2 работало!
Помещаю ДокументОбъект во временное хранилище, выдает:
«Переданное значение не может быть помещено во временное хранилище»
НовыйДок = Документы.ДокументИсполнения.СоздатьДокумент();
.
пар = ПоместитьВоВременноеХранилище(НовыйДок, Новый УникальныйИдентификатор());
А ссылку на этот объект получается поместить?
Ну и вообще, какой смысл объект туда помещать??
(0) В «1С:Предприятии 8.3» при помещении во временное хранилище значений, сериализация которых не поддерживается (например, ДокументОбъект. , СправочникОбъект. и пр.), возникает ошибка «Переданное значение не может быть помещено во временное хранилище».
Для устранения несовместимости необходимо:
Выявить все места помещения значений во временное хранилище (поиском метода глобального контекста ПоместитьВоВременноеХранилище);
Проверить, что возможна сериализация типов значений объектов, помещаемых во временное хранилище. Для этого необходимо свериться с синтакс-помощником, убедившись, что в группе «Доступность» явно указана фраза «Сериализуется». При этом следует отличать сериализацию от XDTO-сериализации и XML-сериализации. Например, для типов СправочникОбъект. сериализация не поддерживается, хотя поддерживается XDTO-сериализация и XML-сериализация.
Если во временное хранилище значений помещается несериализуемое значение, следует пересмотреть проектное решение.
(11) этого я не понял:
«Например, для типов СправочникОбъект. сериализация не поддерживается, хотя поддерживается XDTO-сериализация и XML-сериализация.»
Что значит сериализация не поддерживается, если поддерживается XDTO-сериализация и XML-сериализация
(13) вроде вторым параметром ты неправильно передаеш:
Надо передавать переменную у которой продолжительное время жизни. Например айди формы, так во всех конфах в основном делается. или заведи строковый реквизит на форме ИД, или глобальную переменную.
как только ты выходиш из процедуры сборщик мусора удаляет ИДшник который ты передаеш вторым параметром. и следовательно удаляет твой оъект который хранится в хранилище.
вроде так) но могу ошибаться
(15) не не в этом проблема, повторюсь в 8.2 все работало
Из справки:
Тип: УникальныйИдентификатор; Строка.
Источник