Версия для печати темы (https://pro1c.org.ua/index.php?s=48039869af01334f4d1d270d5bea9711&showtopic=55472)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Передача данных клиент/сервер

Автор: demon14 29.11.19, 8:50

Загрузка из эксель, (Бухгалтерия 2.1.3.1, 8.3.13.1690)

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

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

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

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

Автор: pablo 29.11.19, 9:16

Рассмотрите вариант с передачей файлов на сервер и там уже выполняйте все операции.

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

Автор: demon14 29.11.19, 9:24

pablo @ Сегодня, 8:59 * ,

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

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

Строковый тип не самый легкий?

Автор: pablo 29.11.19, 9:37

1. Какую длину имеют строки в Вашем массиве?2. Число во внутреннем представлении занимает меньше байт, чем строка.

Автор: demon14 29.11.19, 9:59

Цитата(pablo @ 29.11.19, 9:37) *
2. Число во внутреннем представлении занимает меньше байт, чем строка.

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

колонка символьная с самыми длинными строками 50-100

Автор: demon14 29.11.19, 11:45

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

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

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

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

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

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

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


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

Как быть?

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

А если взлетит, то можно тогда и к массивам вернутся.

Автор: Макс1С 29.11.19, 14:57

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

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

должно работать и при синхронном вызове и при асинхронном

Автор: demon14 29.11.19, 15:36

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

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

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua