Имя: Пароль:
1C
1С v8
Вопрос про временное хранилище
, ,
0 Ksandr
 
20.01.12
16:50
Здравствуйте, имею такую необходимость поместить во временное хранилище 2 объекта, 1 на клиенте, 1 на сервере.
Так вот, помещаю первый (на клиенте), смотрю отладчиком, все хорошо ПолучитьИзВременногоХранилища(АдресВХранилище + "_1") выдает то что нужно,

после помещения (на сервере) во временное хранилище еще одного объекта по адресу АдресВХранилище + "_2" первый становится неопределено.

ЧЯДНТ?

З.Ы. Адрес в хранилище - уникальный идентификатор формы
1 5 Элемент
 
20.01.12
16:56
в ПоместитьВоВременноеХранилище передаешь второй параметр?
2 Ksandr
 
20.01.12
16:58
(1) Конечно. В первом объект, во втором адрес
3 5 Элемент
 
20.01.12
17:00
(2) надо не адрес, а уникальный идентификатор формы.
ты лучше код выложи.
4 Ksandr
 
20.01.12
17:30
Код ничем не примечателен. В СП пишут, что уникальный идентификатор, строка

Попытка
           ТекCOMОбъект = Новый COMОбъект(ОбъектПодключения + ".Application");
           ТекCOMОбъект.Connect(СтрокаПодключения);
           ПоместитьВоВременноеХранилище(ТекCOMОбъект, АдресВХранилище + "Application");
           ПодключеноApplication = Истина;
       Исключение
           ПодключеноApplication = Ложь;
           ОбщегоНазначения.СообщитьОбОшибке("Не удалось установить подключение V82.Application по причине " + ОписаниеОшибки());
       КонецПопытки;
       
       Попытка
           ПодключитьCOMConnector(ОбъектПодключения, СтрокаПодключения, АдресВХранилище);
           ПодключенCOMConnector = Истина;
       Исключение
           ПодключенCOMConnector = Ложь;
           ОбщегоНазначения.СообщитьОбОшибке("Не удалось установить подключение V82.COMConnector по причине " + ОписаниеОшибки());
       КонецПопытки;
5 Ksandr
 
20.01.12
17:31
ПодключитьCOMConnector(ОбъектПодключения, СтрокаПодключения, АдресВХранилище);
выполняется на сервере без контекста, после выполнения пропадает первое значение.
6 5 Элемент
 
20.01.12
17:37
(4) должен быть УИД формы. В СП же русским языком написано. А у тебя что?
7 Ksandr
 
20.01.12
17:39
(6) Угу, именно русским:

ПоместитьВоВременноеХранилище (PutToTempStorage)
Синтаксис:

ПоместитьВоВременноеХранилище(<Данные>, <Адрес>)
Параметры:

<Данные> (обязательный)

Тип: Произвольный.
Данные, которые необходимо поместить во временное хранилище.
<Адрес> (необязательный)

Тип: УникальныйИдентификатор; Строка.
Адрес во временном хранилище, по которому надо поместить данные. Или уникальный идентификатор формы, во временное хранилище которой, надо поместить данные и вернуть новый адрес.
В случае, если передается УникальныйИдентификатор формы, то значение будет автоматически удалено после закрытия этой формы.
Если параметр не указан, помещенное значение будет удалено после очередного запроса сервера из общего модуля, при контекстном и неконтекстном серверном вызове из формы, при серверном вызове из модуля команды или при получении формы.
8 Ksandr
 
20.01.12
17:40
Надо попробовать поместить два объекта по уникальному идентификатору, вдруг не заместятся
9 5 Элемент
 
20.01.12
17:42
при первом вызове передаваемый адрес не ссылается на адрес во временном хранилище.
поэтому она считает что параметр не передан.
10 vmv
 
20.01.12
17:44
пользуйся, возьми суть, переменные вставь свои

// Модуль: Add_V82AppClient
// Клиентские методы этой ИБ при внешнем соединении с ней других баз данных 1С



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////// ОБЩИЕ МЕТОДЫ

//
// Это метод вызывается посредством внешнего соединения из другой ИБ, в  _OEIB_Structures
// содержится переданная из другой ИБ структура с тремя вложенными структурами
//
// OEIB_Identification_ :  // Внешний объект: Структура идентификации
//
// _OEIB_Identification :  // Родной объект : Структура идентификации
//
// _OEIB_Properties     :  // Родной объект : Структура свойств полученная из Внешний объект
//
// По COM-структуре на клиенте во внешнем соединении можно делать обход, но передать ее на сервер нельзя.
// Для передачи структур на сервер в этой базе необходимо скопировать их из COM-структуры в
// аналогичные структуры и передать через временное хранилище в этой базе.
//
//
Функция ОбновитьВнешнююСсылкуОбъектаКлиент(_OEIB_Structures, ТекстОшибки) Экспорт
   
   _OEIB_StructuresServer = Новый Структура;  // Создаем сводную переменную-структуру в этой базе              
   
   // Копируем вложенные COM_Структуры в этой ИБ
   OEIB_Identification_ = ВнешнююСтруктуруСкопироватьВОбычную(_OEIB_Structures.OEIB_Identification_);
   _OEIB_Identification = ВнешнююСтруктуруСкопироватьВОбычную(_OEIB_Structures._OEIB_Identification);
   _OEIB_Properties     = ВнешнююСтруктуруСкопироватьВОбычную(_OEIB_Structures._OEIB_Properties);
   
   // Вставляем вложенные структуры в сводную структуру в этой ИБ
   _OEIB_StructuresServer.Вставить("OEIB_Identification_", OEIB_Identification_); // Внешний объект: Структура идентификации
   _OEIB_StructuresServer.Вставить("_OEIB_Identification", _OEIB_Identification); // Родной объект : Структура идентификации
   _OEIB_StructuresServer.Вставить("_OEIB_Properties"    , _OEIB_Properties);     // Родной объект : Структура свойств полученная из Внешний объект
   
   // Сохраняем во временном хранилище этой ИБ полученную сводную структуру
   АдресВХ = ПоместитьВоВременноеХранилище(_OEIB_StructuresServer, Новый УникальныйИдентификатор());
   
   // Передаем на сервер адрес временного хранилища и обрабатываем там данные полученные из хранилища
   // Получаем с сервера адрес другого временного хранилища по которому хранится структура содержащую идентификацию обновленного(созданного) в этой ИБ объекта
   АдресВХ = Add_V82AppServer.ОбновитьВнешнююСсылкуОбъектаСервер(АдресВХ, ТекстОшибки);    
   
   // Получаем обновленную структуру с сервера по адресу временного хранилища
   _OEIB_Identification = ПолучитьИзВременногоХранилища(АдресВХ);
   Если Не ЗначениеЗаполнено(_OEIB_Identification) Тогда
       Возврат Новый Структура;
   КонецЕсли;
   
   УдалитьИзВременногоХранилища(АдресВХ);
   
   Возврат _OEIB_Identification;       // Собственно возврат GUID, Версии и т.д. обновленногов этой ИБ Объекта.
   
КонецФункции

Функция ВнешнююСтруктуруСкопироватьВОбычную(ВнешняяСтруктура)
   
   ОбычнаяСтруктура = Новый Структура;
   
   Для каждого ВнешняяСтруктураЭлемент Из ВнешняяСтруктура Цикл
       ОбычнаяСтруктура.Вставить(ВнешняяСтруктураЭлемент.Ключ, ВнешняяСтруктураЭлемент.Значение);
   КонецЦикла;
   
   Возврат ОбычнаяСтруктура;
   
КонецФункции


// Модуль: Add_V82AppServer

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////// ОБЩИЕ МЕТОДЫ ПРИЕМА ДАННЫХ ИЗ ВНЕШНИХ ИБ

Функция ОбновитьВнешнююСсылкуОбъектаСервер(АдресВХ, ТекстОшибки) Экспорт

   // Получаем сводную структуру на сервере по адресу временного хранилища
   _OEIB_Structures = ПолучитьИзВременногоХранилища(АдресВХ);
   Если Не ЗначениеЗаполнено(_OEIB_Structures) Тогда
       ТекстОшибки = ТекстОшибки + Символы.ПС + "Не передана структура данных для внешней информационной базы";
       Возврат Ложь;
   КонецЕсли;
   
   // Получаем вложенную структуру. Внешний объект : Структура идентификации
   ВнешнийОбъектИдент = _OEIB_Structures.OEIB_Identification_;
   Если Не ЗначениеЗаполнено(ВнешнийОбъектИдент) Тогда
       ТекстОшибки = ТекстОшибки + Символы.ПС + "Не передана структура идентификации объекта-источника для внешней информационной базы";
       Возврат Ложь;
   КонецЕсли;

   // Получаем вложенную структуру. Родной объект: Структура идентификации
   РоднойОбъектИдент = _OEIB_Structures._OEIB_Identification;
   Если Не ЗначениеЗаполнено(РоднойОбъектИдент) Тогда
       ТекстОшибки = ТекстОшибки + Символы.ПС + "Не передана структура идентификации объекта-приемника для внешней информационной базы";
       Возврат Ложь;
   КонецЕсли;
   
   // Получаем вложенную структуру. Родной объект: Структура свойств полученная из Внешний объект
   РоднойОбъектСвойства = _OEIB_Structures._OEIB_Properties;
   Если Не ЗначениеЗаполнено(РоднойОбъектСвойства) Тогда
       ТекстОшибки = ТекстОшибки + Символы.ПС + "Не передана структура свойств объекта-приемника для внешней информационной базы";
       Возврат Ложь;
   КонецЕсли;
   
   УспешноеОбновление = ОбновитьОбъектПоВнешнейСсылке(ВнешнийОбъектИдент, РоднойОбъектИдент, РоднойОбъектСвойства, ТекстОшибки);
   
   УдалитьИзВременногоХранилища(АдресВХ);  // Удаляем обработанные данные из временного хранилища
   
   Если УспешноеОбновление Тогда           // Помещаем структуру содержащую идентификацию обновленного(созданного) в этой ИБ объекта в другое хранилище для чтения на клиенте.
       АдресВХ = ПоместитьВоВременноеХранилище(РоднойОбъектИдент, Новый УникальныйИдентификатор());
       Возврат АдресВХ;
   Иначе
       Возврат "";                         // Возвращаем пустой адрес
   КонецЕсли;
   
КонецФункции