Native API как параметр сеанса, ошибка инициализации

1. Ligret 19.05.18 11:55 Сейчас в теме
Доброго времени суток,

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

Функция ПодключитьВесы() Экспорт
		Попытка
			ПодключитьВнешнююКомпоненту(ПутьКомпонентаЭлектронныхВесов,
			"ScalesDriver", ТипВнешнейКомпоненты.Native);
			ПодключенныеВесы = Новый ("AddIn.ScalesDriver"); 
			УстановитьПривилегированныйРежим(Истина);				
			ПараметрыСеанса.ПодключенныеВесы = 
			ПоместитьВоВременноеХранилище(ПодключенныеВесы, Новый УникальныйИдентификатор());
			Возврат ПодключенныеВесы;
		Исключение
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось загрузить компоненту для работы с весами");
			Возврат Ложь;
		КонецПопытки;
КонецФункции
Показать
По теме из базы знаний
Найденные решения
3. Ditron 185 19.05.18 12:22 Сейчас в теме
(1) Так не получится, объект компоненты нельзя поместить во временное хранилище, используйте глобальный контекст "ПараметрыПриложения", вот туда и добавляйте, а получать лучше через общий модуль (клиент) с повт. исп. значений на время сеанса. А нельзя поместить потому что объект не есть ссылкой или двоичными данными, это есть ссылка на экземпляр объекта в памяти процесса... А вот и ссылочка http://v8.1c.ru/news/newsAbout.jsp?id=11637
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Ditron 185 19.05.18 12:22 Сейчас в теме
(1) Так не получится, объект компоненты нельзя поместить во временное хранилище, используйте глобальный контекст "ПараметрыПриложения", вот туда и добавляйте, а получать лучше через общий модуль (клиент) с повт. исп. значений на время сеанса. А нельзя поместить потому что объект не есть ссылкой или двоичными данными, это есть ссылка на экземпляр объекта в памяти процесса... А вот и ссылочка http://v8.1c.ru/news/newsAbout.jsp?id=11637
2. user928779 19.05.18 12:19 Сейчас в теме
Подозреваю, что весы работают в контексте клиентского рабочего места. Поэтому запихивать компоненту на сервер - довольно дикая идея. Чем не устраивает экспортная переменная в модуле приложения?
4. Ditron 185 19.05.18 12:25 Сейчас в теме
(2) а компоненту на сервер вообще нет смысла пихать, если она конечно не работает с каким нибудь модемом на стороне сервера, я сомневаюсь что весы подключены к серверу (если конечно база клиент-серверная) )))
5. Ditron 185 19.05.18 12:30 Сейчас в теме
А вот и код (конечно должен быть на клиенете):
Функция ПодключитьВесы() Экспорт
        Попытка
            ПодключитьВнешнююКомпоненту(ПутьКомпонентаЭлектронныхВесов,
            "ScalesDriver", ТипВнешнейКомпоненты.Native);
            ПодключенныеВесы = Новый ("AddIn.ScalesDriver"); 
            Если ПараметрыПриложения = Неопределено Тогда
                  ПараметрыПриложения  = Новый Соответствие;
            КонецЕсли;
            ПараметрыПриложения.Вставить("ПодключенныеВесы", ПодключенныеВесы);
            Возврат ПодключенныеВесы;
        Исключение
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось загрузить компоненту для работы с весами");
            Возврат Ложь;
        КонецПопытки;
КонецФункции
Показать


А получать ее из модуля (клиентского), писал выше...
6. Ligret 19.05.18 13:02 Сейчас в теме
Компонента первоначально работала через глобальный, клиентский, модуль, переменная Весы инициализировалась на клиенте, передавалась в модуль, который возвращал значение. Теперь встал вопросов запуск процедуры взвешивания через обработчика ожидания, для того чтобы взвешивание и отображение результата длились до тех пор, пока статус не равен стабильный.
Основная цель инициализация весов должна происходить только один раз, при запуске клиента и все последующее время использоваться будет объявленная переменная. Какой смысл инициализировать компоненту при каждом открытии документа?
В глобальном модуле нет возможности объявить переменную, поэтому единственная идея которая пришла в голову – использование хранилища.
8. Ditron 185 19.05.18 13:14 Сейчас в теме
(6) Я же Вам написал, вызывайте функцию "ПодключитьВесы" при старте приложения и все, а в модуле повт. исп. переменных создайте функцию которая будет читать из ПараматерыКлиента....
Функция ПолучитьВесы() Экспорт
   Если ПараметрыКлиента = Неопределено Тогда
        Сообщить("Упс! Весы не подключены!");
        Возврат Неопределено;
   КонецЕсли;
   Возврат ПараметрыКлиента.Получить("ПодключенныеВесы");
КонецФункции
Показать

Вызывайте ее на клиенте где угодно...
9. user928779 19.05.18 13:22 Сейчас в теме
(8) А зачем в этой каше ещё и модуль повторно используемых значений?
11. Ditron 185 19.05.18 13:57 Сейчас в теме
(9) Кэширование, рекомендации разработчика...
7. user928779 19.05.18 13:11 Сейчас в теме
В глобальном - нет, в модуле приложения - да. Выше как раз пример использования такой переменной - соответствия, заботливо декларированной в типовой для таких случаев.
10. Ligret 19.05.18 13:44 Сейчас в теме
Модуль Клиент(управляемое приложение):
ПараметрыПриложения.Вставить("_Клиент.ПодключенныеВесы", Весы) – «Значение не является значением объектного типа (Вставить)»
Если ПараметрыКлиента = Неопределено – «Переменная не определена (ПараметрыКлиента)»
13. Ditron 185 19.05.18 13:59 Сейчас в теме
12. Ligret 19.05.18 13:57 Сейчас в теме
Разобрался:
ПараметрыПриложения = Новый Соответствие;
ПараметрыПриложения.Вставить("_Клиент.ПодключенныеВесы", Весы);

Всем спасибо за помощь!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот