Имя: Пароль:
1C
 
Вопрос про сервера ...
,
0 lamme
 
25.09.20
15:02
Что есть
сервер 1 (скульный. отдельновыделенный. только скуль. и все. мощный. красивый. блестящий .. )
сервер 2 (для клиентов рдп)

УТ11,4
платформа 1С:Предприятие 8.3 (8.3.17.1549)

Что делается
На клиенте идет чтение ексель файла в 25 000 строк и заполнение табличной части этоже обработки


// это на клиенте

Попытка
        ex = ПолучитьCOMобъект("","Excel.Application");
    Исключение
        Сообщить("Excel Application не создан!!");
        Возврат;
    КонецПопытки;
    
    Попытка
        ex.workbooks.open(Файл,1);
    Исключение
        Сообщить("Файл перемещен или удален!");
        Возврат;
    КонецПопытки;
    
    RCount = ex.ActiveSheet.UsedRange.Rows.Count();
    Для j = 2 по RCount цикл
        Если СокрЛП(ex.ActiveSheet.Cells(j,1).Value)="" Тогда
            Продолжить;
        КонецЕсли;
        
        Нстр = объект.Товары.Добавить();
        Нстр.СкладСтрока                = ex.ActiveSheet.Cells(j,1).Value;


и тд и тп


вот если весь файл так прочитать - то 50 мин занимает время.
если добавить строку


        Нстр = объект.Товары.Добавить();
        Нстр.СкладСтрока                = ex.ActiveSheet.Cells(j,1).Value;
Нстр.СкладСсылка = найтиСкладПоимениНаСервере(Нстр.СкладСтрока)



и


&НаСервере
Функция ОпределитьСклад(имясклпда)
    
        РезПСклада = Справочники.Склады.НайтиПоНаименованию(имясклпда,истина);
        Если    РезПСклада = Справочники.Склады.ПустаяСсылка() тогда
            НовыйСклад = Справочники.Склады.СоздатьЭлемент();
            НовыйСклад.Наименование = имясклпда;
            НовыйСклад.Записать();
            СкладСылка=  НовыйСклад.ссылка;

        иначе
            СкладСылка=  РезПСклада.ссылка;
        конецесли;
возврат      СкладСылка
конецфункции


то время увеличивается на стотыщ дохринилиново часов (конкретно - 4ч - 50%)
косяк знаю
1. нельзя дергать сервер в цикле
2. надо на скуль сервере читать файл, передавая его через хранилище (повторю - на скуль-севрере нет екселя)

но ..
отладчик показывает - что
Нстр.СкладСсылка = найтиСкладПоимениНаСервере(Нстр.СкладСтрока)
занимает 62% времени при чтении одной строки.
(сама процедура поиска и возврата значения - где-то в конце временной таблицы замера производительности)

я правильно понимаю - это передача с клиента на сервер текстовой строки столько времени жрет ?
1 lamme
 
25.09.20
15:02
или я что то не понимаю ?
2 lamme
 
25.09.20
15:04
не ..  я конечно где-то видел
как ексель читают иным методом .
гораздо продуктивнее
но он вроде на сервере делается и все так же - через открыть ексель и массивом его прочитать ..
так что тот не подходит
3 Ёпрст
 
25.09.20
15:05
(0) ну создай соответствие складов твоим строкам, и только если в соответствии нема - ищи на сервере, клади в соответствие.
4 lamme
 
25.09.20
15:08
это понятн
это методы оптимизации.
не в этом вопрос.
а в том - чезатормоза такие при передаче с клиента на сервер
это у платформы баг
это ппц как настроена сеть
или тупые сервера
или кривые руки мои
?
5 polosov
 
25.09.20
15:13
(0) Читай эксель в ТабличныйДокумент. Будь мужиком, блеат!
6 H A D G E H O G s
 
25.09.20
15:15
(4) Руки
7 lamme
 
25.09.20
15:17
(6)
обоснуй

почему мои руки - если
Нстр.СкладСсылка = найтиСкладПоимениНаСервере(Нстр.СкладСтрока)
занимает 62% времени при чтении одной строки.
8 RomanYS
 
25.09.20
15:17
(4) кривые руки. Прочитай файл (если уж приспичило на клиенте), уйди на сервер один раз и обрабатывай.
И даже на сервере делать поиск по справочнику 25к раз - это ппц, закешируй в соответствие как написано в (3)
9 H A D G E H O G s
 
25.09.20
15:18
(7) Потому что контекстный вызов
10 arsik
 
гуру
25.09.20
15:18
(4) Кривые руки &НаСервере заменить на &НаСервереБезКонтекста
11 RomanYS
 
25.09.20
15:18
(7) в цикле с клиента на сервер ходить!? Там хотя бы "без контекста"?
12 lamme
 
25.09.20
15:19
Прочитай файл (если уж приспичило на клиенте) - 25 000 строк на клиенте читает - 1ч -12 000
13 H A D G E H O G s
 
25.09.20
15:19
Как я вижу такие ветки
https://coub.com/view/2jbxaw
14 H A D G E H O G s
 
25.09.20
15:19
(12) Вы криво читаете. Надо через ComSafeArray
15 lamme
 
25.09.20
15:20
(10)
(11)

коллеги
я это понимаю - что чтение в цикле и дерганье сервер - это полный - отрывание рук по самые гланды
но не вэтом ж вопрос.

или в этом - как раз таки - от того - что так часто дергается сервер - вот оно и тормозит ?
16 RomanYS
 
25.09.20
15:21
(15) именно так. В твоем случае мало того что дергается, так ты туда на каждом вызове всю форму таскаешь
17 RomanYS
 
25.09.20
15:22
(12) бред. Читай по-другому. Или найди, что тормозит, и убери
18 lamme
 
25.09.20
15:22
(16)
понял.
---
19 lamme
 
25.09.20
15:24
просто на ут10 такое считвалется за 6 мин
(но- другой сервер)
20 lamme
 
25.09.20
15:24
при таком же считывании
21 RomanYS
 
25.09.20
15:25
(18) Безконтекста даст тебе ускорение в разы,
перевод цикла на сервер - на порядки,
(3) конкретно эту строку может в разы ускорить относительно выполнения уже на сервере
22 lamme
 
25.09.20
15:27
по всем параметрам - сервера вообще спят ..
сеть спит
жесткий - спит
память - не используется
и тд и тп...
а работа через ком ... ну просто жесть
23 lamme
 
25.09.20
15:28
лажно коллеги ..
спасибо за советы и срач )
все как всегда
ничего не меняется
24 polosov
 
25.09.20
15:35
(22) Да забудь ты про ком.
ТабДок = Новый ТабличныйДокумент.Прочитать("Мойфайл.xlsx");

И читаешь через Область
25 polosov
 
25.09.20
15:35
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("Мойфайл.xlsx");
26 lamme
 
25.09.20
15:36
это кому интересно

отладчик
замер производительности
сек за 10 примерно

https://c2n.me/49dhbjZ

как видите -все равномерно считывается
все колонки екселя - в табличную часть обработки ..
нет рывков .. стабильно

и стабильно долго
)
27 lamme
 
25.09.20
15:36
25
а дпльше пример можно ?
28 arsik
 
гуру
25.09.20
15:37
(27) Ой да открой уже для себя гугл.
29 lamme
 
25.09.20
15:37
те какую область установить чтобы считать все 36 колонок екселя
и на энн строк

и как потом  к каждому значению обратиться ?
30 lamme
 
25.09.20
15:38
да. все. отбой
31 lamme
 
25.09.20
15:39
тогда опять не понимаю
одни и те же методы на ут10 и ут11 работаюи по разному ?
32 RomanYS
 
25.09.20
15:43
(31) Конечно по разному. В УТ10 ты сидишь на клиенте периодически подергивая сервер (там кстати тоже твое найтиСклад... это запрос в цикле), а на УФ ты таскаешь форму между сервером и клиентом
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан