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

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

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

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

Навскидку приходит вариант с двоичными данными, но что-то я не могу придумать, как их изящно получить из массива структур на стороне сервера. Такое вообще возможно, не прибегая ко всяким хакам вида ЗначениеВФайл и последующего чтения этого файла в ДД?
---
не понял, а зачем JSON вручную парсить. Он же на клиенте штатно работает через ПрочитатьJSON
---
поместить массив структур во временное хранилище. в строковом значении передать адрес. на клиенте получить данные из хранилища.
---
1.Хранилище значения не доступно на клиенте.
2. Если имеется в виду ВременноеХранилище, то данные, помещенный во временное хранилище внутри ФЗ будут не доступны в другом сеансе до завершения ФЗ.

Мне необходимо получать данные в процессе работы ФЗ, с этим проблем нет, проблемы исключительно в возможности сериализации данных.
---
Json как вариант, но парсить на клиенте придется самостоятельно.
---
Вот ваще не хотелось бы заниматься парсингом "вручную", я уж тогда через файлик сделаю ДД.
---
Ну тут одну процедуру написать))
В ЭлектроннаяПодписьСлужебныйКлиент.ЗаполнитьСоответствиеИзОтветаJSON() есть разбор на клиенте Json. Но там конечно он немного урезанный.
Можно взять его за основу и добавить в него определение массива.
---
Разбирать JSON "вручную" на клиенте - имхо, еще более извращенный вариант, чем формирование ДД через файл на стороне сервера :)
Нужен максимально нативный метод сериализации/десериализации.
---
Мое дело предложить))
---
Да, спасибо за вариант :)
---
стрсоединить(массив,некийразделитель), стрразделить(строка,некийразделитель)
---
это уже сериализация "вручную" и парсинг полученного значения - чего вообще не хочется делать, проще с помощью файликов сделать ДД и передать в виде строки на клиент.
---
Еще вариант. Можно использовать ЗначениеВФайл(МояСтруктура). В файле текст ("строка"). Их передать в строковом значении. На клиенте сделать обратно ЗначениеИзФайла().
---
ЗначениеИзФайла, как и ЗначениеИзСтрокиВнутр - не доступны на клиенте(тонкий).
---
да, ошибся )
---
Я использую такой код. Разве тут есть проблема с получением данных (формированием структуры из полученной строки)?

```1c
    &НаКлиенте
    Процедура Подключаемый_ПроверитьВыполнениеЗадания_ЗагрузкаДанных()

    Попытка
    Если ЗаданиеВыполнено(ИдентификаторЗадания) Тогда
    ЗагрузитьПодготовленныеДанныеЗагрузкаДанныхНаСервере();
    ДлительныеОперацииКлиент.ЗакрытьФормуДлительнойОперации(ФормаДлительнойОперации);
    СообщитьОбОкончанииЗагрузкиДанных();
    Иначе
    ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания);
    ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания_ЗагрузкаДанных",
    ПараметрыОбработчикаОжидания.ТекущийИнтервал,
    Истина
    );
    // показать прогресс выполнения фонового задания
    Прогресс = ПолучитьПрогрессВыполнения(УникальныйИдентификатор);
    Если СтрЧислоСтрок(Прогресс) = 3 Тогда
    Состояние(СтрПолучитьСтроку(Прогресс,1), Число("0"+СтрПолучитьСтроку(Прогресс,2)), СтрПолучитьСтроку(Прогресс,3));
    КонецЕсли;
    КонецЕсли;
    Исключение
    ДлительныеОперацииКлиент.ЗакрытьФормуДлительнойОперации(ФормаДлительнойОперации);
    ВызватьИсключение;
    КонецПопытки;

    КонецПроцедуры

    &НаСервере
    Функция ПолучитьПрогрессВыполнения(УникальныйИдентификатор)

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

    Возврат Прогресс;

    КонецФункции
```
---
Получить строку прогресса из ФЗ проблем не вызывает, проблемы вызывает то, что внутри строки есть некие ключевые значения(не строкового типа), по которым необходимо выполнять обращение к строке дерева, устанавливать значения в колонки дерева, делать еще что-то....

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

В ПолучитьПрогрессВыполнения() я вмешиваться не буду. Я могу внутри ФЗ установить нужные мне значения, выдаваемые в прогресс.
---
не понял, а зачем JSON вручную парсить. Он же на клиенте штатно работает через ПрочитатьJSON
---
В вебе не доступен. Поэтому вручную, для универсальности.
---
да, но про веб не было указано.
---
Веб пока не трогаем, исключительно тонкий клиент.
---
Спасибо, думал, оно так же только на сервере доступно.
---
ЗаписатьЗначениеJSON(), ПрочитатьЗначениеJSON(), не?
---
ЗаписатьJSON/ПрочитатьJSON
---
в 23 версии платформы появились эти новые методы, которые и в веб работают.
Глобальный контекст (Global context)
ПрочитатьЗначениеJSON (ReadJSONValue)
Синтаксис:
ПрочитатьЗначениеJSON(<Строка>)
...
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.3.23.