На клиенте получить массив структур из сериализованных данных. Как?

1. nomad_irk 80 15.11.24 13:54 Сейчас в теме
Дано: некая обработка, использующая механизм "длительные операции" БСП, обработка умеет получать прогресс длительной операции.

Кто не в курсе, то типовой механизм умеет передавать отдельно числовое и строковое значения в качестве прогресса.

Вопрос: каким образом выполнить сериализацию массива структур, чтобы можно было без вызова сервера получить на клиенте?

В структурах содержатся исключительно сериализуемые типы данных: число и строка.

Навскидку приходит вариант с двоичными данными, но что-то я не могу придумать, как их изящно получить из массива структур на стороне сервера. Такое вообще возможно, не прибегая ко всяким хакам вида ЗначениеВФайл и последующего чтения этого файла в ДД?
По теме из базы знаний
Найденные решения
19. spacecraft 15.11.24 15:19 Сейчас в теме
не понял, а зачем JSON вручную парсить. Он же на клиенте штатно работает через ПрочитатьJSON
independ; nomad_irk; SlavaKron; +3 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. kuzev 48 15.11.24 14:02 Сейчас в теме
(1) поместить массив структур во временное хранилище. в строковом значении передать адрес. на клиенте получить данные из хранилища.
4. nomad_irk 80 15.11.24 14:10 Сейчас в теме
(2) 1.Хранилище значения не доступно на клиенте.
2. Если имеется в виду ВременноеХранилище, то данные, помещенный во временное хранилище внутри ФЗ будут не доступны в другом сеансе до завершения ФЗ.

Мне необходимо получать данные в процессе работы ФЗ, с этим проблем нет, проблемы исключительно в возможности сериализации данных.
3. Sashares 35 15.11.24 14:09 Сейчас в теме
(1) Json как вариант, но парсить на клиенте придется самостоятельно.
5. nomad_irk 80 15.11.24 14:11 Сейчас в теме
(3) Вот ваще не хотелось бы заниматься парсингом "вручную", я уж тогда через файлик сделаю ДД.
6. Sashares 35 15.11.24 14:16 Сейчас в теме
(5) Ну тут одну процедуру написать))
В ЭлектроннаяПодписьСлужебныйКлиент.ЗаполнитьСоответствиеИзОтветаJSON() есть разбор на клиенте Json. Но там конечно он немного урезанный.
Можно взять его за основу и добавить в него определение массива.
7. nomad_irk 80 15.11.24 14:19 Сейчас в теме
(6) Разбирать JSON "вручную" на клиенте - имхо, еще более извращенный вариант, чем формирование ДД через файл на стороне сервера :)
Нужен максимально нативный метод сериализации/десериализации.
8. Sashares 35 15.11.24 14:21 Сейчас в теме
(7) Мое дело предложить))
9. nomad_irk 80 15.11.24 14:21 Сейчас в теме
(8) Да, спасибо за вариант :)
13. independ 1555 15.11.24 14:39 Сейчас в теме
(1) стрсоединить(массив,некийразделитель), стрразделить(строка,некийразделитель)
18. nomad_irk 80 15.11.24 15:17 Сейчас в теме
(13) это уже сериализация "вручную" и парсинг полученного значения - чего вообще не хочется делать, проще с помощью файликов сделать ДД и передать в виде строки на клиент.
10. kuzev 48 15.11.24 14:31 Сейчас в теме
Еще вариант. Можно использовать ЗначениеВФайл(МояСтруктура). В файле текст ("строка"). Их передать в строковом значении. На клиенте сделать обратно ЗначениеИзФайла().
11. nomad_irk 80 15.11.24 14:32 Сейчас в теме
(10) ЗначениеИзФайла, как и ЗначениеИзСтрокиВнутр - не доступны на клиенте(тонкий).
12. kuzev 48 15.11.24 14:37 Сейчас в теме
14. kuzev 48 15.11.24 14:52 Сейчас в теме
Я использую такой код. Разве тут есть проблема с получением данных (формированием структуры из полученной строки)?
&НаКлиенте
Процедура Подключаемый_ПроверитьВыполнениеЗадания_ЗагрузкаДанных()
	
	Попытка
		Если ЗаданиеВыполнено(ИдентификаторЗадания) Тогда
			ЗагрузитьПодготовленныеДанныеЗагрузкаДанныхНаСервере();
			ДлительныеОперацииКлиент.ЗакрытьФормуДлительнойОперации(ФормаДлительнойОперации);
			СообщитьОбОкончанииЗагрузкиДанных();
		Иначе	
			ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания);
			ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания_ЗагрузкаДанных", 
				ПараметрыОбработчикаОжидания.ТекущийИнтервал, 
				Истина
			);
			// показать прогресс выполнения фонового задания
			Прогресс = ПолучитьПрогрессВыполнения(УникальныйИдентификатор);
			Если СтрЧислоСтрок(Прогресс) = 3 Тогда
				Состояние(СтрПолучитьСтроку(Прогресс,1), Число("0"+СтрПолучитьСтроку(Прогресс,2)), СтрПолучитьСтроку(Прогресс,3));
			КонецЕсли;
		КонецЕсли;
	Исключение
		ДлительныеОперацииКлиент.ЗакрытьФормуДлительнойОперации(ФормаДлительнойОперации);
		ВызватьИсключение;
	КонецПопытки;
	
КонецПроцедуры

&НаСервере
Функция ПолучитьПрогрессВыполнения(УникальныйИдентификатор)
	
	Прогресс = "";
	НайденныеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Новый Структура("Ключ", УникальныйИдентификатор));
	Задание = НайденныеЗадания[0];
	МассивСообщений = Задание.ПолучитьСообщенияПользователю(Истина);
	Если МассивСообщений <> Неопределено Тогда
		Для Каждого Сообщение Из МассивСообщений Цикл
			Если Сообщение.ИдентификаторНазначения = УникальныйИдентификатор Тогда
				Прогресс = Сообщение.Текст;
			КонецЕсли;
		КонецЦикла;
	Конецесли;
	
	Возврат Прогресс;
	
КонецФункции
Показать
15. nomad_irk 80 15.11.24 15:01 Сейчас в теме
(14) Получить строку прогресса из ФЗ проблем не вызывает, проблемы вызывает то, что внутри строки есть некие ключевые значения(не строкового типа), по которым необходимо выполнять обращение к строке дерева, устанавливать значения в колонки дерева, делать еще что-то....

Не хотелось бы это все парсить "вручную", хотелось бы просто получить массив структур и обработать уже его.
16. kuzev 48 15.11.24 15:07 Сейчас в теме
(15) В ПолучитьПрогрессВыполнения() можно сформировать структуру из полученной строки. Например, как писал выше, с помощью ЗначениеИзФайла(). Ну, либо используйте ЗначениеИзСтрокиВнутр().
17. nomad_irk 80 15.11.24 15:11 Сейчас в теме
(16) Да они не доступны на клиенте - в этом вся сложность.
На клиенте доступно только ДД в виде сериализованного значения и ЧтениеДанных(ДвоичныеДанные)

В ПолучитьПрогрессВыполнения() я вмешиваться не буду. Я могу внутри ФЗ установить нужные мне значения, выдаваемые в прогресс.
19. spacecraft 15.11.24 15:19 Сейчас в теме
не понял, а зачем JSON вручную парсить. Он же на клиенте штатно работает через ПрочитатьJSON
independ; nomad_irk; SlavaKron; +3 Ответить
20. Sashares 35 15.11.24 15:23 Сейчас в теме
(19) В вебе не доступен. Поэтому вручную, для универсальности.
21. spacecraft 15.11.24 15:25 Сейчас в теме
(20) да, но про веб не было указано.
23. nomad_irk 80 15.11.24 15:26 Сейчас в теме
(20) Веб пока не трогаем, исключительно тонкий клиент.
22. nomad_irk 80 15.11.24 15:26 Сейчас в теме
(19) Спасибо, думал, оно так же только на сервере доступно.
24. kuzev 48 15.11.24 15:36 Сейчас в теме
(19) ЗаписатьЗначениеJSON(), ПрочитатьЗначениеJSON(), не?
25. nomad_irk 80 15.11.24 16:02 Сейчас в теме
(24) ЗаписатьJSON/ПрочитатьJSON
26. spacecraft 15.11.24 16:12 Сейчас в теме
(25) в 23 версии платформы появились эти новые методы, которые и в веб работают.
Глобальный контекст (Global context)
ПрочитатьЗначениеJSON (ReadJSONValue)
Синтаксис:
ПрочитатьЗначениеJSON(<Строка>)
...
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.3.23.
Sashares; +1 Ответить
Оставьте свое сообщение

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