Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Передача данных клиент/сервер , Чтение пакета файлов excel с последующей обработкой на сервере          
demon14 Подменю пользователя
сообщение 29.11.19, 8:50
Сообщение #1

Общительный
**
Группа: Пользователи
Сообщений: 10
Из: Київ
Спасибо сказали: 0 раз
Рейтинг: 0

Загрузка из эксель, (Бухгалтерия 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
Сообщение #2

Старейшина
********
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0

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

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

Сообщение отредактировал pablo - 29.11.19, 9:05


Signature
Правильно поставленный вопрос содержит до 90% ответа.

demon14 Подменю пользователя
сообщение 29.11.19, 9:24
Сообщение #3

Общительный
**
Группа: Пользователи
Сообщений: 10
Из: Київ
Спасибо сказали: 0 раз
Рейтинг: 0

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

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

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

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

pablo Подменю пользователя
сообщение 29.11.19, 9:37
Сообщение #4

Старейшина
********
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0

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


Signature
Правильно поставленный вопрос содержит до 90% ответа.

demon14 Подменю пользователя
сообщение 29.11.19, 9:59
Сообщение #5

Общительный
**
Группа: Пользователи
Сообщений: 10
Из: Київ
Спасибо сказали: 0 раз
Рейтинг: 0

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

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

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

demon14 Подменю пользователя
сообщение 29.11.19, 11:45
Сообщение #6

Общительный
**
Группа: Пользователи
Сообщений: 10
Из: Київ
Спасибо сказали: 0 раз
Рейтинг: 0

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

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

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

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

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

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

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


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

Как быть?

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

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

Макс1С Подменю пользователя
сообщение 29.11.19, 14:57
Сообщение #7

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 189
Из: Днепр
Спасибо сказали: 62 раз
Рейтинг: 58.6

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

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

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

demon14 Подменю пользователя
сообщение 29.11.19, 15:36
Сообщение #8

Общительный
**
Группа: Пользователи
Сообщений: 10
Из: Київ
Спасибо сказали: 0 раз
Рейтинг: 0

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

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

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

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 29.03.24, 9:11
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!