Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача данных клиент/сервер
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
demon14
Загрузка из эксель, (Бухгалтерия 2.1.3.1, 8.3.13.1690)

1) читаю в массив ( Sheet.UsedRange.Value.Выгрузить() ) несколько файлов (на тесте 10 файлов, ~10 000 строк в каждом * 30 колонок).
2) прочитанные данные каждого файла добавляю в общий массив.
3) общий массив отправляю на сервер, там все разбираю - создаю/обновляю объекты.

Все выполняется не быстро (минуты), переписал через ДлительныеОперации.ВыполнитьВФоне, но запуск выполняется дольше чем серверные процедуры.

По итогу замера производительности, передача данных с клиента на сервер больше 50% времени (и это один комп, между разными или веб еще ж хуже будет...).

Вопрос, как правильно в таком случае поступить? Как быстрее всего будет передать данные на сервер, уже прочитанные, по каждому файлу отдельно или все сразу как у меня?
pablo
Рассмотрите вариант с передачей файлов на сервер и там уже выполняйте все операции.

Далее, если с загрузкой файлов не взлетит, советую читать и хранить данные структурированно, а не одним массивом текста. Создаете массив структур и построчно его заполняете. Потом этот массив передаете на сервер. За счет типизированности данных может уменьшится объем пересылаемых данных.
demon14
pablo @ Сегодня, 8:59 необходимо зарегистрироваться для просмотра ссылки ,

Изначально так и проектировал, отказался большей частью из-за рекомендаций переносить чтение на клиент.

Цитата(pablo @ 29.11.19, 9:16) необходимо зарегистрироваться для просмотра ссылки
За счет типизированности данных может уменьшится объем пересылаемых данных.

Строковый тип не самый легкий?
pablo
1. Какую длину имеют строки в Вашем массиве?2. Число во внутреннем представлении занимает меньше байт, чем строка.
demon14
Цитата(pablo @ 29.11.19, 9:37) необходимо зарегистрироваться для просмотра ссылки
2. Число во внутреннем представлении занимает меньше байт, чем строка.

Про числа не подумал.
Цитата(pablo @ 29.11.19, 9:37) необходимо зарегистрироваться для просмотра ссылки
1. Какую длину имеют строки в Вашем массиве?

колонка символьная с самыми длинными строками 50-100
demon14
Кручусь вокруг "ВыполнитьВФоне" и никак не пойму как это сделать(

Сейчас примерно так:

&НаКлиенте
Процедура ЗагрузкаМассиваФайлов()
....

Для Каждого Файл Из МассивФайлов Цикл
МассивДанных.Добавить(ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Файл),УникальныйИдентификатор));
КонецЦикла;

ДлительнаяОперация     = НачатьВыполнениеНаСервере(МассивДанных);
ПараметрыОжидания     = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
...

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

&НаСервере
Функция НачатьВыполнениеНаСервере(МассивДанных)
    
    Для Каждого Данные Из МассивДанных Цикл
        МассивВФЗ.Добавить(ПолучитьИзВременногоХранилища(Данные.АдресДанных));    
    КонецЦикла;
    
    ПараметрыПроцедуры = Новый Структура;
    ПараметрыПроцедуры.Вставить("МассивВФЗ",МассивВФЗ);
    
    ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
    
    Возврат ДлительныеОперации.ВыполнитьВФоне("Документы.МойДок.ПроцедураВФон",
     ПараметрыПроцедуры, ПараметрыВыполнения);
КонецФункции


Если я МассивДанных отправляю в ПараметрыПроцедуры, хранилища с данными там уже нет (перечитал СП и гугл, все так).

Как быть?

Может запуск ВыполнитьВФоне сделать асинхронно? взлетит?

А если взлетит, то можно тогда и к массивам вернутся.
Макс1С
Цитата(demon14 @ 29.11.19, 11:45) необходимо зарегистрироваться для просмотра ссылки
Если я МассивДанных отправляю в ПараметрыПроцедуры, хранилища с данными там уже нет (перечитал СП и гугл, все так).

Передавайте адрес хранилища, а на сервере читайте
ПолучитьИзВременногоХранилища(<Адрес>)

должно работать и при синхронном вызове и при асинхронном
demon14
Макс1С @ Сегодня, 14:57 необходимо зарегистрироваться для просмотра ссылки ,
Так тоже думал, но нет. Обратно можно и то только результат.

Разные сеансы.

"Примечание:
Временное хранилище, сформированное в одном сеансе, недоступно из другого сеанса.
Исключением является возможность передачи данных из фонового задания в сеанс, инициировавший фоновое задание, с помощью временного хранилища... "
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.