|
Замена COM-подключений на WEB сервисы. Интересная статистика | ☑ | ||
---|---|---|---|---|
0
Ivanich
02.08.23
✎
16:37
|
Конфигурация самописная.
Есть центральная база (ЦБ) и 8 филиалов. В ЦБ формируем "тяжелый" отчет по продажам (опрашиваем ЦБ и филиалы). Использовали СОМ-соединения. Начитавшись, что СОМ - устарела, и что не будет работать под Линуксом, решил переписывать отчеты (их много у нас) под WEB Для ускорения процесса купили на Инфостарте продукт. Если модераторы разрешат, то назову его артикул позже. Вообщем, текст запроса в COM и WEB одинаковый. |
|||
1
Ivanich
02.08.23
✎
16:38
|
Собственно, результаты эксперимента:
Последовательный запуск. В одном сеансе. Сначала web, потом com Данные подготовлены! web Июль 2023 г. Время(сек): 23 Данные подготовлены! com Июль 2023 г. Время(сек): 47 Данные подготовлены! web Апрель 2023 г. - Июль 2023 г. Время(сек): 35 Данные подготовлены! com Апрель 2023 г. - Июль 2023 г. Время(сек): 54 Данные подготовлены! web Январь 2023 г. - Июль 2023 г. Время(сек): 57 Данные подготовлены! com Январь 2023 г. - Июль 2023 г. Время(сек): 59 Данные подготовлены! web Январь 2022 г. - Июль 2023 г. Время(сек): 146 Данные подготовлены! com Январь 2022 г. - Июль 2023 г. Время(сек): 73 Параллельный запуск. 2 сеанса. В 1 сеансе только web. Во 2м только com. Данные подготовлены! web Июль 2023 г. Время(сек): 11 Данные подготовлены! com Июль 2023 г. Время(сек): 46 Данные подготовлены! web Апрель 2023 г. - Июль 2023 г. Время(сек): 36 Данные подготовлены! com Апрель 2023 г. - Июль 2023 г. Время(сек): 53 Данные подготовлены! web Январь 2023 г. - Июль 2023 г. Время(сек): 57 Данные подготовлены! com Январь 2023 г. - Июль 2023 г. Время(сек): 55 Данные подготовлены! web Январь 2022 г. - Июль 2023 г. Время(сек): 148 Данные подготовлены! com Январь 2022 г. - Июль 2023 г. Время(сек): 72 |
|||
2
Ivanich
02.08.23
✎
16:44
|
COM работает стабильно, а WEB - сильно зависит от периода.
Последовательный и параллельный запуск отчетов не влияет на время выполнения каждого типа отчета. Замеры выполнялись на рабочей базе (зарегистрировано 52 активных сеанса) |
|||
3
Garykom
02.08.23
✎
17:07
|
Какая может быть статистика если через COM обычно хреначат портянку последовательно
А через http-сервисы обычно делают какой то API и разом обработка пакетами Если через COM переписать в API-стайл аля веб то все будет в пределах погрешности |
|||
4
Garykom
02.08.23
✎
17:08
|
Ну и часто забывают при COM про передачу (отправку и забор) данных
Т.е. мало запрос выполнить, надо данные чистые (через простые типы) забрать |
|||
5
Prog111
02.08.23
✎
17:16
|
(1) Поподробнее бы...Что измеряли и как. Сдается мне, что Вы не то и не там меряете...
|
|||
6
Ivanich
02.08.23
✎
17:26
|
(4) может не корректно написал. Выполняется запрос + забор данных.
БЫЛО (COM): РезОбразцы = ЗапросОбразцы.Выполнить(); ВыборкаОбразцы = РезОбразцы.Выбрать(); Пока ВыборкаОбразцы.Следующий() Цикл ОбработкаПрерыванияПользователя(); стрТЗ = тзОбразцы.Добавить(); ЗаполнитьЗначенияСвойств(стрТЗ,ВыборкаОбразцы); стрТЗ.НаименованиеБД = стрБД.НаименованиеБД; КонецЦикла; СТАЛО (WEB) //РезОбразцы = ЗапросОбразцы.Выполнить(); РезОбразцы = глЗапрос(Префикс, ЗапросОбразцы); //ВыборкаОбразцы = РезОбразцы.Выбрать(); //Пока ВыборкаОбразцы.Следующий() Цикл Для каждого ВыборкаОбразцы Из РезОбразцы Цикл ОбработкаПрерыванияПользователя(); стрТЗ = тзОбразцы.Добавить(); ЗаполнитьЗначенияСвойств(стрТЗ,ВыборкаОбразцы); стрТЗ.НаименованиеБД = стрБД.НаименованиеБД; КонецЦикла; |
|||
7
Ivanich
02.08.23
✎
17:42
|
(5) фиксирую время до начала цикла опроса баз
выполняются 5 разных запросов к базе получаю данные в 5 ТЗ перехожу к след. базе фиксирую время по выходу из цикла. Вот фрагмент: Тнач = ТекущаяДата(); Для каждого стрБД Из ТаблицаИБ Цикл Состояние("Получаю данные из базы: "+стрБД.НаименованиеБД+" ("+текущБаз+" из "+колвоБаз+")"); //ЗапросМаркетинговыеМероприятия = Открыта.NewObject("Запрос"); ЗапросМаркетинговыеМероприятия = Новый Запрос; //1. Определяем контрагентов, участвующих в маркетинговых мероприятиях ЗапросМаркетинговыеМероприятия.Текст="ВЫБРАТЬ... //РезМаркетинговыеМероприятия = ЗапросМаркетинговыеМероприятия.Выполнить(); РезМаркетинговыеМероприятия = глЗапрос(Префикс, ЗапросМаркетинговыеМероприятия); //2. Получаем планы бюджетные по торговым домам //ЗапросПланБюджетный = Открыта.NewObject("Запрос"); ЗапросПланБюджетный = Новый Запрос; ЗапросПланБюджетный.Текст="ВЫБРАТЬ... //РезПланБюджетный = ЗапросПланБюджетный.Выполнить(); РезПланБюджетный = глЗапрос(Префикс, ЗапросПланБюджетный); //ВыборкаПланБюджетный = РезПланБюджетный.Выбрать(); //3. Получаем данные по образцам! //ЗапросОбразцы = Открыта.NewObject("Запрос"); ЗапросОбразцы = Новый Запрос; ЗапросОбразцы.Текст="ВЫБРАТЬ //РезОбразцы = ЗапросОбразцы.Выполнить(); РезОбразцы = глЗапрос(Префикс, ЗапросОбразцы); //ВыборкаОбразцы = РезОбразцы.Выбрать(); //3.1 Проверяем наличие документов по средней фактич. за месяц //ЗапросРСЦены = Открыта.NewObject("Запрос"); ЗапросРСЦены = Новый Запрос; ЗапросРСЦены.Текст="ВЫБРАТЬ РАЗЛИЧНЫЕ... //РезРСЦены = ЗапросРСЦены.Выполнить(); РезРСЦены = глЗапрос(Префикс, ЗапросРСЦены); //ВыборкаРСЦ = РезРСЦены.Выбрать(); //Пока ВыборкаРСЦ.Следующий() Цикл Для каждого ВыборкаРСЦ Из РезРСЦены Цикл ОбработкаПрерыванияПользователя(); стрТЗ = тзРСЦены.Добавить(); ЗаполнитьЗначенияСвойств(стрТЗ,ВыборкаРСЦ); стрТЗ.НаименованиеБД = стрБД.НаименованиеБД; КонецЦикла; //4. Собственно продажи Данные = Новый ТаблицаЗначений; //веб Запрос = ЗапросПродажиWEB(масПараметров, НеУтвПланы); Данные = глЗапрос(Префикс, Запрос); ЗагрузитьВТаблицуЗначений(Данные, глЗапрос(Префикс, Запрос)); КонецЦикла; Ткон = ТекущаяДата(); Сообщить("Данные подготовлены! web "+ПредставлениеПериода(НачПериода,КонецДня(КонПериода))+" Время(сек): "+(Ткон-Тнач)); |
|||
8
Ivanich
03.08.23
✎
09:28
|
Переделал отчет под "чистую" статистику.
Всё лишнее выкинул. Сравниваю запрос: ТекстЗапроса = "ВЫБРАТЬ | ФактПродажиКомпанииОбороты.Период КАК ПериодМесяц, | ФактПродажиКомпанииОбороты.Номенклатура.Наименование КАК НоменклатураНаименование, | ФактПродажиКомпанииОбороты.СуммаПродажиРубОборот КАК СуммаПродажиРуб |ИЗ | РегистрНакопления.ФактПродажиКомпании.Обороты(&Дата1, &Дата2, Месяц, ) КАК ФактПродажиКомпанииОбороты"; Работаю в копии. 1 пользователь. Внутри одной процедуры сначала выполняется WEB, затем COM: Данные подготовлены! web Апрель 2023 г. - Июль 2023 г. Время(сек): 1 Данные подготовлены! com Апрель 2023 г. - Июль 2023 г. Время(сек): 33 Данные подготовлены! web Январь 2023 г. - Июль 2023 г. Время(сек): 2 Данные подготовлены! com Январь 2023 г. - Июль 2023 г. Время(сек): 32 Данные подготовлены! web Январь 2022 г. - Июль 2023 г. Время(сек): 5 Данные подготовлены! com Январь 2022 г. - Июль 2023 г. Время(сек): 34 |
|||
9
shuhard
03.08.23
✎
09:40
|
(8) чистая победа веб-сервиса, что и ожидалось
|
|||
10
Chai Nic
03.08.23
✎
09:46
|
(8) Надеюсь, время на инициализацию COM-подключения вы посчитали отдельно?
|
|||
11
Chai Nic
03.08.23
✎
09:47
|
(4) Не просто через простые типы, а желательно вообще сериализованные в строку, иначе возможна потеря точности из-за того что в COM нет десятичных дробей, а есть вещественные с плавающей точкой.
|
|||
12
Ivanich
03.08.23
✎
09:52
|
(10) Отдельно не считал. Инициализация СОМ подключения внутри цикла
|
|||
13
Ivanich
03.08.23
✎
10:05
|
(10) База рабочая. 55 сеансов. Тини - отдельно подсчитано время инициализации СОМ
Данные подготовлены! web Апрель 2023 г. - Июль 2023 г. Время(сек): 1 Данные подготовлены! com Апрель 2023 г. - Июль 2023 г. Время(сек): 35, в т.ч Тини = 25 Данные подготовлены! web Январь 2023 г. - Июль 2023 г. Время(сек): 3 Данные подготовлены! com Январь 2023 г. - Июль 2023 г. Время(сек): 32, в т.ч Тини = 26 Данные подготовлены! web Январь 2022 г. - Июль 2023 г. Время(сек): 4 Данные подготовлены! com Январь 2022 г. - Июль 2023 г. Время(сек): 34, в т.ч Тини = 25 |
|||
14
Ivanich
03.08.23
✎
10:16
|
На Инфостарте покупали продукт: 1121106 "Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)"
Привлекло внимание скорость (лёгкость) замены сом на web. Подключили расширение, закомментировали 3 строки, добавили 2 и готово! БЫЛО: РезОбразцы = ЗапросОбразцы.Выполнить(); ВыборкаОбразцы = РезОбразцы.Выбрать(); Пока ВыборкаОбразцы.Следующий() Цикл ОбработкаПрерыванияПользователя(); стрТЗ = тзОбразцы.Добавить(); ЗаполнитьЗначенияСвойств(стрТЗ,ВыборкаОбразцы); стрТЗ.НаименованиеБД = стрБД.НаименованиеБД; КонецЦикла; СТАЛО: //РезОбразцы = ЗапросОбразцы.Выполнить(); //закомментировано 1я РезОбразцы = глЗапрос(Префикс, ЗапросОбразцы); //добавлено 1я строка //ВыборкаОбразцы = РезОбразцы.Выбрать(); //закомментировано 2я //Пока ВыборкаОбразцы.Следующий() Цикл //закомментировано 3я Для каждого ВыборкаОбразцы Из РезОбразцы Цикл //добавлено 2я строка ОбработкаПрерыванияПользователя(); стрТЗ = тзОбразцы.Добавить(); ЗаполнитьЗначенияСвойств(стрТЗ,ВыборкаОбразцы); стрТЗ.НаименованиеБД = стрБД.НаименованиеБД; КонецЦикла; НО! Как показывают данные из (1) этого оказалось недостаточно. Придется запросы переписывать/оптимизировать под WEB... |
|||
15
Ivanich
04.08.23
✎
13:28
|
Не даёт покоя сравнение результатов между (1) и (8)
(1) это же реальная работа, а (8) - эксперимент Поэтому продолжил поиски... |
|||
16
Ivanich
04.08.23
✎
13:30
|
К тексту запроса в (8) добавил Контрагента.
ТекстЗапроса = "ВЫБРАТЬ | ФактПродажиКомпанииОбороты.Период КАК ПериодМесяц, | ФактПродажиКомпанииОбороты.Номенклатура.Наименование КАК НоменклатураНаименование, | СУММА(ФактПродажиКомпанииОбороты.СуммаПродажиРубОборот) КАК СуммаПродажиРуб, | ФактПродажиКомпанииОбороты.ДокументПродажи.Контрагент КАК Контрагент |ИЗ | РегистрНакопления.ФактПродажиКомпании.Обороты(&Дата1, &Дата2, Месяц, ) КАК ФактПродажиКомпанииОбороты | |СГРУППИРОВАТЬ ПО | ФактПродажиКомпанииОбороты.Период, | ФактПродажиКомпанииОбороты.Номенклатура.Наименование, | ФактПродажиКомпанииОбороты.ДокументПродажи.Контрагент"; |
|||
17
Ivanich
04.08.23
✎
13:35
|
Получил:
Данные подготовлены! web Июнь 2023 г. - Июль 2023 г. Время(сек): 7 Данные подготовлены! com Июнь 2023 г. - Июль 2023 г. Время(сек): 35, в т.ч Тини = 26 Данные подготовлены! web Январь 2022 г. - Июль 2023 г. Время(сек): 52 Данные подготовлены! com Январь 2022 г. - Июль 2023 г. Время(сек): 41, в т.ч Тини = 27 т.е. результат соответствует (1). Измерение "ДокументПродажи" - реквизит составного типа (документы: Реализация, ВозвратОтПокупателя, ОтчетКомиссионера) первый вывод был переписать запрос |
|||
18
Ivanich
04.08.23
✎
13:38
|
ТекстЗапроса = "ВЫБРАТЬ
| ВложенныйЗапрос.ПериодМесяц, | ВложенныйЗапрос.НоменклатураНаименование, | СУММА(ВложенныйЗапрос.СуммаПродажиРуб) КАК СуммаПродажиРуб, | ВложенныйЗапрос.Контрагент |ИЗ | (ВЫБРАТЬ | ФактПродажиКомпанииОбороты.Период КАК ПериодМесяц, | ФактПродажиКомпанииОбороты.Номенклатура.Наименование КАК НоменклатураНаименование, | ФактПродажиКомпанииОбороты.СуммаПродажиРубОборот КАК СуммаПродажиРуб, | ВЫРАЗИТЬ(ФактПродажиКомпанииОбороты.ДокументПродажи КАК Документ.РеализацияТоваров).Контрагент КАК Контрагент | ИЗ | РегистрНакопления.ФактПродажиКомпании.Обороты(&Дата1, &Дата2, Месяц, ) КАК ФактПродажиКомпанииОбороты | ГДЕ | ФактПродажиКомпанииОбороты.ДокументПродажи ССЫЛКА Документ.РеализацияТоваров | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ФактПродажиКомпанииОбороты.Период, | ФактПродажиКомпанииОбороты.Номенклатура.Наименование, | ФактПродажиКомпанииОбороты.СуммаПродажиРубОборот, | ВЫРАЗИТЬ(ФактПродажиКомпанииОбороты.ДокументПродажи КАК Документ.ВозвратТоваровОтПокупателя).Контрагент | ИЗ | РегистрНакопления.ФактПродажиКомпании.Обороты(&Дата1, &Дата2, Месяц, ) КАК ФактПродажиКомпанииОбороты | ГДЕ | ФактПродажиКомпанииОбороты.ДокументПродажи ССЫЛКА Документ.ВозвратТоваровОтПокупателя) КАК ВложенныйЗапрос | |СГРУППИРОВАТЬ ПО | ВложенныйЗапрос.ПериодМесяц, | ВложенныйЗапрос.НоменклатураНаименование, | ВложенныйЗапрос.Контрагент"; |
|||
19
Ivanich
04.08.23
✎
13:39
|
Тест-пример улучшенный запрос результат:
Данные подготовлены! web Июнь 2023 г. - Июль 2023 г. Время(сек): 6 Данные подготовлены! com Июнь 2023 г. - Июль 2023 г. Время(сек): 34, в т.ч Тини = 26 Данные подготовлены! web Январь 2022 г. - Июль 2023 г. Время(сек): 50 Данные подготовлены! com Январь 2022 г. - Июль 2023 г. Время(сек): 38, в т.ч Тини = 24 |
|||
20
Ivanich
04.08.23
✎
13:43
|
Результаты (17) и (19) практически совпадают.
Напрашивается предположение, что WEB "плохо" (неоптимально) работает с полями составного типа? |
|||
21
Ivanich
04.08.23
✎
13:46
|
Сейчас в рабочей базе оба отчета: COM и WEB. Не
|
|||
22
Ivanich
04.08.23
✎
13:47
|
Пока не могу дать рекомендации пользователям чтобы стали использовать только WEB
|
|||
23
arsik
04.08.23
✎
14:04
|
(22) А теперь проверь
ВЫРАЗИТЬ(ФактПродажиКомпанииОбороты.ДокументПродажи КАК Документ.ВозвратТоваровОтПокупателя).Контрагент.Наименование и удивишься :) |
|||
24
arsik
04.08.23
✎
14:07
|
Ну или просто сделай, не оптимально - но будет быстрее чем через твой ком.
|
|||
25
arsik
04.08.23
✎
14:10
|
Твои изыскания - это результат непонимания, как работает платформа.
|
|||
26
arsik
04.08.23
✎
14:13
|
Узнай сначала для чего в БСП добавили метод
ОбщегоНазначения.ЗначениеРеквизитаОбъекта() |
|||
27
Ivanich
04.08.23
✎
14:22
|
(24) неоптимальный запрос
Данные подготовлены! web Январь 2022 г. - Июль 2023 г. Время(сек): 12 Данные подготовлены! com Январь 2022 г. - Июль 2023 г. Время(сек): 38, в т.ч Тини = 24 (23) оптимальный Данные подготовлены! web Январь 2022 г. - Июль 2023 г. Время(сек): 14 Данные подготовлены! com Январь 2022 г. - Июль 2023 г. Время(сек): 40, в т.ч Тини = 26 Млять, придется переписывать отчеты. Тупая замена (закомментировать 3 строки, добавить 2) не поможет... |
|||
28
TormozIT
04.08.23
✎
14:50
|
А если применить принцип "Минимум COM вызовов?", то можно ускорить КОМ до скорости вебсервиса, исключая время на инциацию соединения https://infostart.ru/1c/articles/387577/
|
|||
29
Ivanich
09.08.23
✎
15:33
|
(28) показал ссылку сисадминам. Они по ней сходили и сказали: "Технология устаревшая, время тратить не будем". Готовят переход на линукс.
|
|||
30
Ivanich
09.08.23
✎
15:35
|
Перебрал запрос под web-сервисы. Получилось следующее на рабочих базах (параллельный запуск):
Данные подготовлены! com 09.08.2023 14:37:23 Январь 2023 г. - Июль 2023 г. Время(сек): 64 Данные подготовлены! web 09.08.2023 14:37:25 Январь 2023 г. - Июль 2023 г. Время(сек): 43 |
|||
31
Ivanich
09.08.23
✎
15:42
|
Ещё проверил 3 способа получения строки.
1. ФактПродажиКомпанииОбороты.Номенклатура.Наименование web 09.08.2023 15:07:33 Январь 2022 г. - Июль 2023 г. Время(сек): 12 com 09.08.2023 15:08:21 Январь 2022 г. - Июль 2023 г. Время(сек): 37, в т.ч Тини = 22, Тзап = 15 2. ПРЕДСТАВЛЕНИЕ(ФактПродажиКомпанииОбороты.Номенклатура) web 09.08.2023 14:59:54 Январь 2022 г. - Июль 2023 г. Время(сек): 14 com 09.08.2023 15:00:51 Январь 2022 г. - Июль 2023 г. Время(сек): 44, в т.ч Тини = 25, Тзап = 19 3.ФактПродажиКомпанииОбороты.Номенклатура.Представление web 09.08.2023 15:04:59 Январь 2022 г. - Июль 2023 г. Время(сек): 12 com 09.08.2023 15:05:49 Январь 2022 г. - Июль 2023 г. Время(сек): 39, в т.ч Тини = 22, Тзап = 17 1 и 3 показали одинаковый результат. Где-то читал (вроде бы у Хрусталёвой), что Номенклатура.Представление должно быть быстрее |
|||
32
ManyakRus
09.08.23
✎
15:45
|
Запросы это всего лишь 1% от того что умеет COM.
Всё равно COM лучше :-) |
|||
33
lodger
09.08.23
✎
15:51
|
(31) непонятно что от чего ты меряешь, но умозрительно веб должен быть лучше кома.
хотя бы потому, что ws инитится один раз на стороне сервера и сколько то минут стоит горячий для повторных вызовов, и легче параллелится (много разных запросов на один сервис или много одинаковых запросов в разные сервисы). второе очевидное преимущество - кроссплатформенность. то же касается и версий платформы. сервис и клиент могут иметь любые комбинации версий и OS. |
|||
34
Ivanich
09.08.23
✎
16:04
|
(32) я не возражаю. Отработано годами. Заготовки все есть. Почти любую хотелку полдня/день и готово...
НО, пришли другие времена. Готовимся переходить на линукс.... |
|||
35
Ivanich
09.08.23
✎
16:17
|
(33) Беру текст запроса, например:
ТекстЗапроса = "ВЫБРАТЬ | ФактПродажиКомпанииОбороты.Период КАК ПериодМесяц, | ФактПродажиКомпанииОбороты.Номенклатура.Наименование, | ФактПродажиКомпанииОбороты.ДокументПродажи.Контрагент.Наименование КАК Контрагент, | СУММА(ФактПродажиКомпанииОбороты.СуммаПродажиРубОборот) КАК СуммаПродажиРуб |ИЗ | РегистрНакопления.ФактПродажиКомпании.Обороты(&Дата1, &Дата2, Месяц, ) КАК ФактПродажиКомпанииОбороты | |СГРУППИРОВАТЬ ПО | ФактПродажиКомпанииОбороты.ДокументПродажи.Контрагент.Наименование, | ФактПродажиКомпанииОбороты.Период, | ФактПродажиКомпанииОбороты.Номенклатура.Наименование"; и поочереди подставляю в web и com с возвратом результата в виде таблицы значений. базы обхожу в цикле. фиксирую время перед входом в цикл и сразу же по выходу из него запись: web 09.08.2023 15:07:33 Январь 2022 г. - Июль 2023 г. Время(сек): 12 означает, что в web цикл выполнился за 12 секунд запись: com 09.08.2023 15:08:21 Январь 2022 г. - Июль 2023 г. Время(сек): 37, в т.ч Тини = 22, Тзап = 15 означает, что в com цикл выполнился за 37 секунд, в том числе инициализация сом заняла 22 секунды, выполнение запроса 15 секунд |
|||
36
arsik
09.08.23
✎
16:19
|
(34) У тебя длительность без наименования в другом. Где то поделка, ту, которую вы купили пытается получить какие то поля из ссылки.
|
|||
37
Ivanich
09.08.23
✎
16:26
|
(36) проверю, ещё автору через тех.поддержку ИС попробую написать. Может он здесь комментарий оставит...
|
|||
38
lodger
09.08.23
✎
16:36
|
(35) >>базы обхожу в цикле.
можно обходить базы в цикле, но при этом пулять запросы и собирать Обещания(а не ждать пока запрос полностью отработает), а потом преобразовывать ожидания в результаты запросов. асинх в помощь. |
|||
39
Ivanich
09.08.23
✎
17:00
|
(38) >>собирать Обещания. Это Вы про web? Можете пример работы с Обещанием привести. Не сталкивался с этим.
Мы же купили продукт на ИС: 1121106. С целью быстрого перехода с com на web. А получается, что без ревизии текстов запроса не обойтись. Быстро перейти можно. 3 строки комментируешь, 2 добавляешь в (14) показано. Отчет будет работать, но скорее всего медленнее. Это в (1) показано |
|||
40
lodger
09.08.23
✎
17:28
|
(39) ааа.. ооо.. вы использовали WS! тогда (38) отменяется.
кстати, а зачем вы купили то, что в платформе и так есть? ровно так же теми же двумя строками могли и сами переписать. и ровно так же можно было не использовать WS, а заюзать HTTP-сервисы, где асинхи есть в наличии. |
|||
41
Ivanich
09.08.23
✎
17:34
|
(40) цена устроила и скорость перехода для сохранения работоспособности отчетов.
|
|||
42
Ivanich
09.08.23
✎
17:39
|
(39) опыта работы с web нет. В 2016 работал с O-DATA Вопрос по odata но уже всё забылось.
Теперь придется всё восстанавливать... |
|||
43
lodger
09.08.23
✎
17:49
|
(42) odata это самосборный интерфейс в подмножестве HTTP, но http-сервис пишется иначе.
|
|||
44
lodger
09.08.23
✎
17:52
|
идея под http-сервис
можно со стороны клиента разложить запрос на примитивы "текст запроса", "параметры запроса". со стороны сервиса получить примитивы и собрать запрос, выполнить, сериализовать в примитивы и ответить клиенту. получится универсальный транспорт данных для быстрой адаптации корявых COM-запросов. |
|||
45
Ivanich
10.08.23
✎
09:56
|
(44) именно так в продукте и реализовано.
Чтобы не нарушать авторских прав приведу текст частично: Функция Запрос(Текст, Параметры) Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO); Параметры = Сериализатор.ПрочитатьXDTO(Параметры); Запрос = Новый Запрос(Текст); Для каждого Параметр из Параметры Цикл //идет поиск и установка параметров Запрос.УстановитьПараметр(....); КонецЦикла; Выборка = Запрос.Выполнить().Выгрузить(); ОбъектXDTO = Сериализатор.ЗаписатьXDTO(Выборка); Возврат ОбъектXDTO; КонецФункции (36) судя по тексту функции "поля из ссылки" в самом продукте не получаются. |
|||
46
arsik
10.08.23
✎
11:35
|
(45) Сериализатор это делает за вас.
|
|||
47
Elf_80_lvl
10.08.23
✎
11:59
|
Тоже возникла такая задача. Простите если не в тему, вопрос задам тоже.
Задача: А базе А проводится документ и в процессе вызывается сервис, который проводит документ в базе В. Документ проводится какое то время и не хочется ждать. Если ли возможность отработать по схеме: Запустить Вебсервис в базе А, записать документ в базе В, сообщить в базу А что "всё ок", а в фоновом режиме в базе В документ провести? |
|||
48
Hmster
10.08.23
✎
12:14
|
(47) Так в принципе не рекомендуется делать. В процессе проведения документа в базе А создается запись, что надо провести документ в базе В, запускается ФЗ. Которое уже записывает/проводит документ в базе В. Но тут есть нюанс а том, что теперь надо следить проверилсь/создались ли документы в базе В.
|
|||
49
Elf_80_lvl
10.08.23
✎
12:21
|
(48) В процессе проведения документа в базе А создается запись, что надо провести документ в базе В, запускается ФЗ.
А это можно сделать на типовом функционале ERP или нужно добавлять регистр сведений с заданиями свой? |
|||
50
Hmster
10.08.23
✎
13:57
|
(49) регистр сведений, план обмена. План побыстрее будет
|
|||
51
1C_Casual
11.08.23
✎
10:49
|
Добрый день.
Я автор публикации на ИФ. Позволю себе процитировать описание публикации. "Ускорение выполнения запросов к другим информационным базам за счет уменьшения времени подключения (по сравнению с COM)" Общее время выполнения запроса к другой базе складывается (в основном) из двух показателей: - время установки соединения с базой; - время выполнения запроса. В первом пункте WS выигрывает в десятки раз у COM. Время второго будет одинаковым независимо от способа выполнения, т.е. если запрос составлен не оптимально (как в вашем случае), он всегда будет выполняться долго. Далее, в условиях использования сказано: - "Ссылочные параметры, кроме счетов бухгалтерского учета, необходимо менять на строковые, например, вместо «Организация = &Организация» писать «Организация.Код = &КодОрганизации»."; - "Необходимо изменить условие в запросе. «ГДЕ Контрагент = &Контрагент» заменить на «ГДЕ Контрагент.Код = &Код» и передать «Код» в качестве параметра." Т.е. промониторить запросы и переписать параметры в них в любом случае нужно, об этом сказано в описании публикации. Если запросы выполняются в цикле к одной и той же базе (как в ваших тестах, насколько я понял), время выполнения будет отличаться только в первой итерации, при установке соединения, остальные же запросы почти не будут отличаться, т.к. соединение с базой и через COM, и через WS, уже установлено и активно. Если же запрос выполняется в цикле в семи разных базах (для чего и создано данное решение), то здесь время выполнения будет отличаться в десятки, сотни раз. Попробуйте переписать запросы: - вместо получения поля через точку сделать левое соединение к объекту и взять нужное поле оттуда, например, вместо "ДокументПродажи.Контрагент.Наименование" сделать соединение к нужному документу, затем к контрагенту, и из контрагента уже брать наименование; - убрать лишние поля в выборке, особенно ссылочные. |
|||
52
1C_Casual
11.08.23
✎
12:01
|
Плюс для чистоты экспериментов запросы необходимо выполнять в новых сеансах с перерывом от 10 минут (чтобы наверняка отключились инициированные ранее подключения).
Разработка велась на примерно похожей конфигурации, ЦБ и 5 дочерних баз. Не замечал каких-либо особенностей при работе с полями составного типа через данный механизм. Хотя не могу утверждать что их нет. В любом случае при минимальных изменениях в коде удается получить существенный прирост в производительности по сравнению с COM. |
|||
53
Ivanich
11.08.23
✎
15:06
|
(51) по параметрам всё понятно. Я и передаю в запрос только даты.
Итоговый запрос сложный (8 временных таблиц + объединение и вложенный запрос). Поэтому для опытов упрощал текст. Сделал 2 варианта запроса. В 1 варианте в промежуточных временных таблицах есть поля ссылочного типа. Во 2м варианте только поля простых типов. Всегда возвращаются только поля простых типов (дата,строка,число, булево) Запрос делает следующее: 1. ФПКО получаем продажи из регистра накопления по месяцам 2. ЦН01, ЦНВ2, ЦНВ25 срез последних на каждую дату в ФПКО. Цена средней факт.себестоимости из регистра сведений 3. Собираю все вместе и преобразую ссылочные поля в простые |
|||
54
Ivanich
11.08.23
✎
15:07
|
1 вариант. есть поля ссылочного типа во временных таблицах
ВЫБРАТЬ ФактПродажиКомпанииОбороты.Номенклатура КАК Номенклатура, ФактПродажиКомпанииОбороты.Менеджер.Наименование КАК Менеджер, ФактПродажиКомпанииОбороты.ДокументПродажи.Контрагент КАК Контрагент, СУММА(ФактПродажиКомпанииОбороты.КоличествоОборот) КАК КоличествоОборот, СУММА(ФактПродажиКомпанииОбороты.СуммаПродажиРубОборот) КАК СуммаПродажиРубОборот, СУММА(ФактПродажиКомпанииОбороты.СебестоимостьРубОборот) КАК СебестоимостьРубОборот, ФактПродажиКомпанииОбороты.Период КАК Период ПОМЕСТИТЬ ФПКО ИЗ РегистрНакопления.ФактПродажиКомпании.Обороты(&Дата1, &Дата2, Месяц, ) КАК ФактПродажиКомпанииОбороты СГРУППИРОВАТЬ ПО ФактПродажиКомпанииОбороты.Номенклатура, ФактПродажиКомпанииОбороты.Менеджер.Наименование, ФактПродажиКомпанииОбороты.ДокументПродажи.Контрагент, ФактПродажиКомпанииОбороты.Период ИНДЕКСИРОВАТЬ ПО Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЦеныНоменклатуры.Период КАК ПериодСв, ЦеныНоменклатуры.Номенклатура КАК Номенклатура, ЦеныНоменклатуры.Цена ПОМЕСТИТЬ ЦН01 ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ГДЕ ЦеныНоменклатуры.ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦен.СредФактСебестоимость) И ЦеныНоменклатуры.Номенклатура В (ВЫБРАТЬ РАЗЛИЧНЫЕ ФПКО.Номенклатура ИЗ ФПКО КАК ФПКО) И ЦеныНоменклатуры.Период <= &Дата2 ИНДЕКСИРОВАТЬ ПО Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ФПКО.Номенклатура КАК Номенклатура, ФПКО.Период КАК ПериодМесяц, МАКСИМУМ(ЕСТЬNULL(ЦН01.ПериодСв, ДАТАВРЕМЯ(1, 1, 1))) КАК ПериодСв ПОМЕСТИТЬ ЦНВ2 ИЗ ФПКО КАК ФПКО ЛЕВОЕ СОЕДИНЕНИЕ ЦН01 КАК ЦН01 ПО ФПКО.Номенклатура = ЦН01.Номенклатура И ФПКО.Период >= ЦН01.ПериодСв СГРУППИРОВАТЬ ПО ФПКО.Номенклатура, ФПКО.Период ИНДЕКСИРОВАТЬ ПО Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЦН01.Номенклатура КАК Номенклатура, ЦН01.Цена, ЦНВ2.ПериодМесяц ПОМЕСТИТЬ ЦНВ25 ИЗ ЦН01 КАК ЦН01 ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЦНВ2 КАК ЦНВ2 ПО ЦН01.Номенклатура = ЦНВ2.Номенклатура И ЦН01.ПериодСв = ЦНВ2.ПериодСв ИНДЕКСИРОВАТЬ ПО Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ФПКО.Период КАК ПериодМесяц, ФПКО.Менеджер КАК Менеджер, ФПКО.Контрагент.Наименование КАК Контрагент, ФПКО.Номенклатура.Наименование, ЕСТЬNULL(ЦНВ25.Цена, 0) КАК СредСБ, ФПКО.КоличествоОборот КАК КолвоФакт, ФПКО.СуммаПродажиРубОборот КАК СуммаПродажиРубОборот, ФПКО.СебестоимостьРубОборот КАК СебестоимостьРубОборот ИЗ ФПКО КАК ФПКО ЛЕВОЕ СОЕДИНЕНИЕ ЦНВ25 КАК ЦНВ25 ПО ФПКО.Номенклатура = ЦНВ25.Номенклатура И ФПКО.Период = ЦНВ25.ПериодМесяц |
|||
55
Ivanich
11.08.23
✎
15:09
|
2 вариант. Только поля простых типов.
ВЫБРАТЬ ФактПродажиКомпанииОбороты.Менеджер.Наименование КАК Менеджер, СУММА(ФактПродажиКомпанииОбороты.КоличествоОборот) КАК КоличествоОборот, СУММА(ФактПродажиКомпанииОбороты.СуммаПродажиРубОборот) КАК СуммаПродажиРубОборот, СУММА(ФактПродажиКомпанииОбороты.СебестоимостьРубОборот) КАК СебестоимостьРубОборот, ФактПродажиКомпанииОбороты.Период КАК Период, ФактПродажиКомпанииОбороты.Номенклатура.Код КАК НоменклатураКод, ФактПродажиКомпанииОбороты.Номенклатура.Наименование, ФактПродажиКомпанииОбороты.ДокументПродажи.Контрагент.Наименование КАК КонтрагентНаименование ПОМЕСТИТЬ ФПКО ИЗ РегистрНакопления.ФактПродажиКомпании.Обороты(&Дата1, &Дата2, Месяц, ) КАК ФактПродажиКомпанииОбороты СГРУППИРОВАТЬ ПО ФактПродажиКомпанииОбороты.Менеджер.Наименование, ФактПродажиКомпанииОбороты.Период, ФактПродажиКомпанииОбороты.Номенклатура.Код, ФактПродажиКомпанииОбороты.Номенклатура.Наименование, ФактПродажиКомпанииОбороты.ДокументПродажи.Контрагент.Наименование ИНДЕКСИРОВАТЬ ПО НоменклатураКод ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЦеныНоменклатуры.Период КАК ПериодСв, ЦеныНоменклатуры.Цена, ЦеныНоменклатуры.Номенклатура.Код КАК НоменклатураКод, ЦеныНоменклатуры.Номенклатура.Наименование ПОМЕСТИТЬ ЦН01 ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ГДЕ ЦеныНоменклатуры.ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦен.СредФактСебестоимость) И ЦеныНоменклатуры.Период <= &Дата2 И ЦеныНоменклатуры.Номенклатура.Код В (ВЫБРАТЬ РАЗЛИЧНЫЕ ФПКО.НоменклатураКод ИЗ ФПКО КАК ФПКО) ИНДЕКСИРОВАТЬ ПО НоменклатураКод ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ФПКО.Период КАК ПериодМесяц, МАКСИМУМ(ЕСТЬNULL(ЦН01.ПериодСв, ДАТАВРЕМЯ(1, 1, 1))) КАК ПериодСв, ФПКО.НоменклатураКод КАК НоменклатураКод, ФПКО.НоменклатураНаименование ПОМЕСТИТЬ ЦНВ2 ИЗ ФПКО КАК ФПКО ЛЕВОЕ СОЕДИНЕНИЕ ЦН01 КАК ЦН01 ПО ФПКО.Период >= ЦН01.ПериодСв И ФПКО.НоменклатураКод = ЦН01.НоменклатураКод СГРУППИРОВАТЬ ПО ФПКО.Период, ФПКО.НоменклатураКод, ФПКО.НоменклатураНаименование ИНДЕКСИРОВАТЬ ПО НоменклатураКод ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЦН01.Цена, ЦНВ2.ПериодМесяц, ЦН01.НоменклатураКод КАК НоменклатураКод, ЦН01.НоменклатураНаименование ПОМЕСТИТЬ ЦНВ25 ИЗ ЦН01 КАК ЦН01 ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЦНВ2 КАК ЦНВ2 ПО ЦН01.ПериодСв = ЦНВ2.ПериодСв И ЦН01.НоменклатураКод = ЦНВ2.НоменклатураКод ИНДЕКСИРОВАТЬ ПО НоменклатураКод ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ФПКО.Период КАК ПериодМесяц, ФПКО.Менеджер КАК Менеджер, ФПКО.КонтрагентНаименование, ФПКО.НоменклатураНаименование КАК НоменклатураНаименование, ЕСТЬNULL(ЦНВ25.Цена, 0) КАК СредСБ, ФПКО.КоличествоОборот КАК КолвоФакт, ФПКО.СуммаПродажиРубОборот КАК СуммаПродажиРубОборот, ФПКО.СебестоимостьРубОборот КАК СебестоимостьРубОборот ИЗ ФПКО КАК ФПКО ЛЕВОЕ СОЕДИНЕНИЕ ЦНВ25 КАК ЦНВ25 ПО ФПКО.Период = ЦНВ25.ПериодМесяц И ФПКО.НоменклатураКод = ЦНВ25.НоменклатураКод |
|||
56
Ivanich
11.08.23
✎
15:12
|
Результаты:
1. есть ссылки 1й запуск web 11.08.2023 13:50:21 Январь 2023 г. - Июль 2023 г. Время(сек): 21 com 11.08.2023 13:51:05 Январь 2023 г. - Июль 2023 г. Время(сек): 39, в т.ч Тини = 27, Тзап = 12 2. есть ссылки 2й запуск web 11.08.2023 13:55:28 Январь 2023 г. - Июль 2023 г. Время(сек): 10 com 11.08.2023 13:56:11 Январь 2023 г. - Июль 2023 г. Время(сек): 38, в т.ч Тини = 25, Тзап = 13 Разница по web 21 сек и 10 сек - видимо сохраненное подключение |
|||
57
Ivanich
11.08.23
✎
15:17
|
3. только строки в запросе
web 11.08.2023 13:57:52 Январь 2023 г. - Июль 2023 г. Время(сек): 11 com 11.08.2023 13:58:35 Январь 2023 г. - Июль 2023 г. Время(сек): 39, в т.ч Тини = 23, Тзап = 16 11 сек (по сравнению с 10 сек из опыта 2) - чуть медленнее по сравнению с 1 вариантом запроса 4. только строки. выждал 12 минут, похоже подключения сохранились. web 11.08.2023 14:10:33 Январь 2023 г. - Июль 2023 г. Время(сек): 12 com 11.08.2023 14:11:17 Январь 2023 г. - Июль 2023 г. Время(сек): 40, в т.ч Тини = 23, Тзап = 17 |
|||
58
Ivanich
11.08.23
✎
15:25
|
Вывод:
В промежуточных временных таблицах ссылочные поля допускаются (и даже чуть быстрее) И ещё: В запросах для web убрал уничтожение временных таблиц. //|УНИЧТОЖИТЬ ФПКО //|; //| //|//////////////////////////////////////////////////////////////////////////////// //|УНИЧТОЖИТЬ ЦНВ2 //|; //| //|//////////////////////////////////////////////////////////////////////////////// //|УНИЧТОЖИТЬ ЦНВ25 |
|||
59
Ivanich
11.08.23
✎
15:29
|
(51) Вот это не осилил:
>>вместо получения поля через точку сделать левое соединение к объекту и взять нужное поле оттуда, например, вместо "ДокументПродажи.Контрагент.Наименование" сделать соединение к нужному документу, затем к контрагенту, и из контрагента уже брать наименование; |
|||
60
Ivanich
11.08.23
✎
15:32
|
все тесты проводил на рабочих базах (центральная + 8 филиалов)
|
|||
61
Ivanich
11.08.23
✎
15:38
|
Похоже в тесте надо выделять:
1. Время подключения 2. Время выполнения запроса 3. Время получения результата запроса С com можно сделать, а с web - надо подумать 1C_Casual - подскажи с web там, похоже, в общем модуле надо добавлять |
|||
62
arsik
11.08.23
✎
16:04
|
(59) Это работает с составными типами. Для несоставных типов без разницы.
|
|||
63
1C_Casual
11.08.23
✎
16:33
|
Это все отдельная тема - оптимизация запросов. По существу - каких-то особенных требований для выполнения запросов через WS нет. Действуют те же правила, что и для обычных запросов в этой базе, или запросов через COM. Единственное - не получится получить ссылку на элемент объекта метаданных, отсутствующий в этой базе. Например, через COM можно было получить ссылку на элемент справочника "Аккаунты", и потом из этой ссылки получать реквизиты при обходе результатов запроса. А в случае с WS поля из этой ссылки необходимо получать в самом запросе.
(61) Без доработки WS этого не сделать. (59) Как сейчас: ВЫБРАТЬ РегистрСведений.ДокументПродажи.Контрагент.Наименование Как должно быть (примерно): ВЫБРАТЬ Контрагенты.Наименование ИЗ РегистрСведений ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИмяДокумента КАК ИмяДокумента ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты ПО ИмяДокумента.Контрагент = Контрагенты.Ссылка ПО РегистрСведений.ДокументПродажи = ИмяДокумента.Ссылка |
|||
64
Ivanich
14.08.23
✎
16:10
|
Для COM вычисляю время трех этапов из (61) так:
Тини - время подключения (инициализации) Тзап - время выполнения запроса Тчтн - время получения результата (чтение таблицы значений) Тини = 0; Тзап = 0; Тчтн = 0; Тнач = ТекущаяДата(); Для каждого стрБД Из ТаблицаИБ Цикл СтрокаПути="Srvr="""+СокрЛП(стрБД.ИмяСервера)+""";Ref="""+СокрЛП(стрБД.ИмяБД)+....; V8 = Новый COMОбъект("v83.COMConnector"); Т1 = ТекущаяДата(); Попытка Открыта = V8.Connect(СтрокаПути); Исключение Сообщить("Ошибка открытия ИБ: "+СтрокаПути+" "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное); Продолжить; КонецПопытки; Т2 = ТекущаяДата(); Тини = Тини +(Т2-Т1); //время инициализации Т1 = ТекущаяДата(); ЗапросОбразцы = Открыта.NewObject("Запрос"); ЗапросОбразцы.УстановитьПараметр("Дата1",НачПериода); ЗапросОбразцы.УстановитьПараметр("Дата2",КонецДня(КонПериода)); ЗапросОбразцы.Текст = ТекстЗапроса; РезОбразцы = ЗапросОбразцы.Выполнить(); Т2 = ТекущаяДата(); //время окончания выполнения запроса ВыборкаОбразцы = РезОбразцы.Выбрать(); Пока ВыборкаОбразцы.Следующий() Цикл ОбработкаПрерыванияПользователя(); стрТЗ = тзИтПродажи.Добавить(); ЗаполнитьЗначенияСвойств(стрТЗ,ВыборкаОбразцы); стрТЗ.НаименованиеБД = стрБД.НаименованиеБД; КонецЦикла; Т3 = ТекущаяДата(); //время окончания чтения результата Тзап = Тзап + (Т2-Т1);//время выполнения запроса Тчтн = Тчтн + (Т3-Т2);//время чтения результата КонецЦикла; Ткон = ТекущаяДата(); Сообщить("com "+Ткон+" "+ПредставлениеПериода(НачПериода,КонецДня(КонПериода)) +" Время(сек): "+(Ткон-Тнач)+", в т.ч Тини = "+Тини+", Тзап = "+Тзап+", Тчтн = "+Тчтн); |
|||
65
Ivanich
14.08.23
✎
16:12
|
Для WS:
Тини = 0; Тзап = 0; Тчтн = 0; Тнач = ТекущаяДата(); Для каждого стрБД Из ТаблицаИБ Цикл Префикс = СокрЛП(стрБД.прWEB); мВрем = Новый Массив; ЗапросОбразцы = Новый Запрос; ЗапросОбразцы.УстановитьПараметр("Дата1",НачПериода); ЗапросОбразцы.УстановитьПараметр("Дата2",КонецДня(КонПериода)); ЗапросОбразцы.Текст = ТекстЗапроса; РезОбразцы = глЗапросТ(Префикс, ЗапросОбразцы, мВрем); Т1 = ТекущаяДата(); //начало чтения результата Для каждого ВыборкаОбразцы Из РезОбразцы Цикл ОбработкаПрерыванияПользователя(); стрТЗ = тзИтПродажи.Добавить(); ЗаполнитьЗначенияСвойств(стрТЗ,ВыборкаОбразцы); стрТЗ.НаименованиеБД = стрБД.НаименованиеБД; КонецЦикла; Т2 = ТекущаяДата(); //время окончания чтения результата Тини = Тини + мВрем[0]; Тзап = Тзап + мВрем[1]; Тчтн = Тчтн + (Т2-Т1); //время чтения результата КонецЦикла; Ткон = ТекущаяДата(); Сообщить("web "+Ткон+" "+ПредставлениеПериода(НачПериода,КонецДня(КонПериода)) +" Время(сек): "+(Ткон-Тнач)+", в т.ч Тини = "+Тини+", Тзап = "+Тзап+", Тчтн = "+Тчтн); |
|||
66
Ivanich
14.08.23
✎
16:20
|
Для расчета времени установки соединения и времени выполнения запроса внес изменения в глобальный модуль
Создал копию функции запроса: глЗапросТ(ПрефиксБазы, Запрос, мВремя) в массиве мВремя возвращаю: мВремя[0] - время инициализации мВремя[1] - время выполнения запроса Рассчитываю: Тини = 0; Тзап = 0; мВремя = Новый Массив; мВремя.Добавить(0); //инициализация мВремя.Добавить(0); //запрос // Определим Web-сервис Т1 = ТекущаяДата(); Попытка WebСервис = WSСсылки[ПрефиксБазы].СоздатьWSПрокси(Метаданные.WebСервисы.WS.ПространствоИмен, Метаданные.WebСервисы.WS.Имя, Метаданные.WebСервисы.WS.Имя + "Soap", Неопределено, 60); Исключение Возврат РезультатЗапроса; КонецПопытки; // Пройдем авторизацию и установим сериализатор WebСервис.Пользователь = "..."; WebСервис.Пароль = "..."; Сериализатор = Новый СериализаторXDTO(WebСервис.ФабрикаXDTO); Т2 = ТекущаяДата(); // Выполним запрос к удаленной базе и вернем ТЗ Попытка Ответ = WebСервис.Запрос(Запрос.Текст, Сериализатор.ЗаписатьXDTO(Запрос.Параметры)); Исключение Сообщить("Ошибка при выполнении запроса в базе " + ПрефиксБазы + " через Web-сервис:" + Символы.ПС + ОписаниеОшибки()); Возврат РезультатЗапроса; КонецПопытки; хххОтвет = Сериализатор.ПрочитатьXDTO(Ответ); Т3 = ТекущаяДата(); Тини = Т2 - Т1; Тзап = Т3 - Т2; мВремя[0] = Тини; //иниц мВремя[1] = Тзап; //запрос Возврат хххОтвет; |
|||
67
Ivanich
14.08.23
✎
16:22
|
Анализирую "тяжелый" запрос:
ВЫБРАТЬ ФактПродажиКомпанииОбороты.Номенклатура КАК Номенклатура, ФактПродажиКомпанииОбороты.Менеджер.Наименование КАК Менеджер, ФактПродажиКомпанииОбороты.ДокументПродажи.Контрагент КАК Контрагент, СУММА(ФактПродажиКомпанииОбороты.КоличествоОборот) КАК КоличествоОборот, СУММА(ФактПродажиКомпанииОбороты.СуммаПродажиUSDОборот) КАК СуммаПродажиUSDОборот, СУММА(ФактПродажиКомпанииОбороты.СебестоимостьUSDОборот) КАК СебестоимостьUSDОборот, СУММА(ФактПродажиКомпанииОбороты.СуммаПродажиРубОборот) КАК СуммаПродажиРубОборот, СУММА(ФактПродажиКомпанииОбороты.СебестоимостьРубОборот) КАК СебестоимостьРубОборот, ФактПродажиКомпанииОбороты.Период КАК Период ПОМЕСТИТЬ ФПКО ИЗ РегистрНакопления.ФактПродажиКомпании.Обороты(&Дата1, &Дата2, Месяц, ) КАК ФактПродажиКомпанииОбороты СГРУППИРОВАТЬ ПО ФактПродажиКомпанииОбороты.Номенклатура, ФактПродажиКомпанииОбороты.Менеджер.Наименование, ФактПродажиКомпанииОбороты.ДокументПродажи.Контрагент, ФактПродажиКомпанииОбороты.Период ИНДЕКСИРОВАТЬ ПО Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЦеныНоменклатуры.Период КАК ПериодСв, ЦеныНоменклатуры.Номенклатура КАК Номенклатура, ЦеныНоменклатуры.Цена ПОМЕСТИТЬ ЦН01 ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ГДЕ ЦеныНоменклатуры.ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦен.СредФактСебестоимость) И ЦеныНоменклатуры.Номенклатура В (ВЫБРАТЬ РАЗЛИЧНЫЕ ФПКО.Номенклатура ИЗ ФПКО КАК ФПКО) И ЦеныНоменклатуры.Период <= &Дата2 ИНДЕКСИРОВАТЬ ПО Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ФПКО.Номенклатура КАК Номенклатура, ФПКО.Период КАК ПериодМесяц, МАКСИМУМ(ЕСТЬNULL(ЦН01.ПериодСв, ДАТАВРЕМЯ(1, 1, 1))) КАК ПериодСв ПОМЕСТИТЬ ЦНВ2 ИЗ ФПКО КАК ФПКО ЛЕВОЕ СОЕДИНЕНИЕ ЦН01 КАК ЦН01 ПО ФПКО.Номенклатура = ЦН01.Номенклатура И ФПКО.Период >= ЦН01.ПериодСв СГРУППИРОВАТЬ ПО ФПКО.Номенклатура, ФПКО.Период ИНДЕКСИРОВАТЬ ПО Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЦН01.Номенклатура КАК Номенклатура, ЦН01.Цена, ЦНВ2.ПериодМесяц ПОМЕСТИТЬ ЦНВ25 ИЗ ЦН01 КАК ЦН01 ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЦНВ2 КАК ЦНВ2 ПО ЦН01.Номенклатура = ЦНВ2.Номенклатура И ЦН01.ПериодСв = ЦНВ2.ПериодСв ИНДЕКСИРОВАТЬ ПО Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ФПКО.Период КАК ПериодМесяц, ФПКО.Номенклатура КАК Номенклатура, ФПКО.Менеджер КАК Менеджер, ФПКО.Контрагент КАК Контрагент, ЕСТЬNULL(ЦНВ25.Цена, 0) КАК СредСБ, ФПКО.КоличествоОборот КАК КолвоФакт, 0 КАК КолвоПлан, ФПКО.СуммаПродажиРубОборот КАК СуммаПродажиРубОборот, ФПКО.СебестоимостьРубОборот КАК СебестоимостьРубОборот, ФПКО.СуммаПродажиUSDОборот КАК СуммаПродажиUSDОборот, ФПКО.СебестоимостьUSDОборот КАК СебестоимостьUSDОборот ПОМЕСТИТЬ ЦНВ3 ИЗ ФПКО КАК ФПКО ЛЕВОЕ СОЕДИНЕНИЕ ЦНВ25 КАК ЦНВ25 ПО ФПКО.Номенклатура = ЦНВ25.Номенклатура И ФПКО.Период = ЦНВ25.ПериодМесяц ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ НАЧАЛОПЕРИОДА(ПланыПродажКомпанииОбороты.Период, МЕСЯЦ) КАК ПериодМесяц, ПланыПродажКомпанииОбороты.Номенклатура, ПланыПродажКомпанииОбороты.Менеджер.Наименование, ПланыПродажКомпанииОбороты.Клиент, СУММА(ПланыПродажКомпанииОбороты.КоличествоОборот) КАК КоличествоОборот ПОМЕСТИТЬ ЦНпл01 ИЗ РегистрНакопления.ПланыПродажКомпании.Обороты(&Дата1, &Дата2, Регистратор, ) КАК ПланыПродажКомпанииОбороты ГДЕ НЕ ПланыПродажКомпанииОбороты.Регистратор ССЫЛКА Документ.ПланПродажКомпании СГРУППИРОВАТЬ ПО НАЧАЛОПЕРИОДА(ПланыПродажКомпанииОбороты.Период, МЕСЯЦ), ПланыПродажКомпанииОбороты.Номенклатура, ПланыПродажКомпанииОбороты.Менеджер.Наименование, ПланыПродажКомпанииОбороты.Клиент ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СтадииВзаимоотношенийСКонтрагентамиСрезПоследних.Контрагент, СтадииВзаимоотношенийСКонтрагентамиСрезПоследних.Стадия.Порядок КАК СтадияП, СтадииВзаимоотношенийСКонтрагентамиСрезПоследних.КлассПостоянногоКлиента.Порядок КАК КлассПорядок ПОМЕСТИТЬ СВК ИЗ РегистрСведений.СтадииВзаимоотношенийСКонтрагентами.СрезПоследних( &Дата2, Контрагент В (ВЫБРАТЬ РАЗЛИЧНЫЕ ФПКО.Контрагент ИЗ ФПКО КАК ФПКО)) КАК СтадииВзаимоотношенийСКонтрагентамиСрезПоследних ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВложенныйЗапрос.ПериодМесяц, ВложенныйЗапрос.Менеджер, ВложенныйЗапрос.Номенклатура, ВложенныйЗапрос.Контрагент, СУММА(ВложенныйЗапрос.СредСБ) КАК СредСБ, СУММА(ВложенныйЗапрос.КолвоФакт) КАК КолвоФакт, СУММА(ВложенныйЗапрос.КолвоПлан) КАК КолвоПлан, СУММА(ВложенныйЗапрос.СуммаПродажиРубОборот) КАК СуммаПродажиРубОборот, СУММА(ВложенныйЗапрос.СебестоимостьРубОборот) КАК СебестоимостьРубОборот, СУММА(ВложенныйЗапрос.СуммаПродажиUSDОборот) КАК СуммаПродажиUSDОборот, СУММА(ВложенныйЗапрос.СебестоимостьUSDОборот) КАК СебестоимостьUSDОборот ПОМЕСТИТЬ ЦНВ4 ИЗ (ВЫБРАТЬ ЦНВ3.ПериодМесяц КАК ПериодМесяц, ЦНВ3.Номенклатура КАК Номенклатура, ЦНВ3.Менеджер КАК Менеджер, ЦНВ3.Контрагент КАК Контрагент, ЦНВ3.СредСБ КАК СредСБ, ЦНВ3.КолвоФакт КАК КолвоФакт, ЦНВ3.КолвоПлан КАК КолвоПлан, ЦНВ3.СуммаПродажиРубОборот КАК СуммаПродажиРубОборот, ЦНВ3.СебестоимостьРубОборот КАК СебестоимостьРубОборот, ЦНВ3.СуммаПродажиUSDОборот КАК СуммаПродажиUSDОборот, ЦНВ3.СебестоимостьUSDОборот КАК СебестоимостьUSDОборот ИЗ ЦНВ3 КАК ЦНВ3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЦНпл01.ПериодМесяц, ЦНпл01.Номенклатура, ЦНпл01.МенеджерНаименование, ЦНпл01.Клиент, 0, 0, ЦНпл01.КоличествоОборот, 0, 0, 0, 0 ИЗ ЦНпл01 КАК ЦНпл01) КАК ВложенныйЗапрос СГРУППИРОВАТЬ ПО ВложенныйЗапрос.ПериодМесяц, ВложенныйЗапрос.Менеджер, ВложенныйЗапрос.Номенклатура, ВложенныйЗапрос.Контрагент ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЦНВ4.ПериодМесяц, ЦНВ4.Менеджер, ЦНВ4.Номенклатура.Код КАК НоменклатураКод, ЦНВ4.Номенклатура.Наименование КАК НоменклатураНаименование, ЦНВ4.Контрагент.Код КАК КонтрагентКод, ЦНВ4.Контрагент.Наименование КАК Контрагент, ЦНВ4.СредСБ, ЦНВ4.КолвоФакт, ЦНВ4.КолвоПлан, ЦНВ4.СуммаПродажиРубОборот КАК СуммаПродажиРуб, ЦНВ4.СебестоимостьРубОборот КАК СебестоимостьРуб, ЦНВ4.СуммаПродажиUSDОборот КАК СуммаПродажиUSD, ЦНВ4.СебестоимостьUSDОборот КАК СебестоимостьUSD, ЕСТЬNULL(СВК.СтадияП, 99) КАК СтадияПорядок, ЕСТЬNULL(СВК.КлассПорядок, 99) КАК КлассПорядок, ЕСТЬNULL(СВК.Контрагент.ABC_КлассКлиента.Порядок, 99) КАК КонтрагентABCПорядок, Константы.ПрефиксНомеров КАК ИБ, ВЫБОР КОГДА ЕСТЬNULL(Константы.СтранаРезидента.Код, "643") = "643" ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ КАК ИнОрг, ЦНВ4.Контрагент.ГруппыКонтрагентов.Наименование КАК ГруппыКонтрагентов ИЗ ЦНВ4 КАК ЦНВ4 ЛЕВОЕ СОЕДИНЕНИЕ СВК КАК СВК ПО ЦНВ4.Контрагент = СВК.Контрагент, Константы КАК Константы |
|||
68
Ivanich
14.08.23
✎
16:30
|
Результаты:
1-й запуск web 14.08.2023 15:50:01 Январь 2023 г. - Июль 2023 г. Время(сек): 49, в т.ч Тини = 14, Тзап = 31, Тчтн = 3 com 14.08.2023 15:51:16 Январь 2023 г. - Июль 2023 г. Время(сек): 64, в т.ч Тини = 36, Тзап = 15, Тчтн = 13 Вроде бы всё понятно: инициализация : web 14 сек, com 36 сек время выполнения запроса: web 31 сек, com 15 сек получение результата : web 3 сек, com 13 сек Возможно, неправильно разделил в web выполнения и чтения результата? |
|||
69
Ivanich
14.08.23
✎
16:38
|
2-й запуск:
web 14.08.2023 15:52:51 Январь 2023 г. - Июль 2023 г. Время(сек): 31, в т.ч Тини = 0, Тзап = 29, Тчтн = 2 com 14.08.2023 15:53:50 Январь 2023 г. - Июль 2023 г. Время(сек): 50, в т.ч Тини = 27, Тзап = 10, Тчтн = 13 никаких изменений не вносил. 1й запуск завершен в 15:51:16, 2й запуск начал в 15:52:51 web соединение осталось в кэше, поэтому Тини =0 инициализация : web 0 сек, com 27 сек время выполнения запроса: web 29 сек, com 10 сек получение результата : web 2 сек, com 13 сек так как текст запроса одинаковый, то возможно com запрос использует кэш от web? |
|||
70
Ivanich
14.08.23
✎
16:47
|
3-й запуск. Изменил период получения данных с 7 месяцев (01.01.23-31.07.23) до 19 (01.01.22-31.07.23)
web 14.08.2023 15:56:28 Январь 2022 г. - Июль 2023 г. Время(сек): 92, в т.ч Тини = 0, Тзап = 81, Тчтн = 11 com 14.08.2023 15:58:21 Январь 2022 г. - Июль 2023 г. Время(сек): 79, в т.ч Тини = 34, Тзап = 17, Тчтн = 28 инициализация : web 0 сек, com 34 сек время выполнения запроса: web 81 сек, com 17 сек получение результата : web 11 сек, com 28 сек Даже если есть ошибка в разделении выполнения запроса / чтение результата, то 81+11=92 и 17+28=45 то web в 2 раза проигрывает com на большой выборке |
|||
71
Ivanich
14.08.23
✎
17:23
|
Поменял местами порядок выполнения запросов. Сначала com, потом web.
com 14.08.2023 17:11:32 Январь 2022 г. - Июль 2023 г. Время(сек): 54, в т.ч Тини = 25, Тзап = 16, Тчтн = 13 web 14.08.2023 17:13:15 Январь 2022 г. - Июль 2023 г. Время(сек): 84, в т.ч Тини = 8, Тзап = 71, Тчтн = 5 Запрос на com 16+13=29 в 2,5 раза обогнал web 71+5=76 число строк в итоговой таблице значений: 93521 Платформа 1С:Предприятие 8.3 (8.3.20.2184) + Postgre SQL Так что же? На больших выборках web уступает com? |
|||
72
Ivanich
15.08.23
✎
10:10
|
Проверил предположения из (71) про большие выборки. Выбрал текст запроса оптимальный. "Месяц" заменил на "Час" чтобы увеличить количество записей в итоговой ТЗ.
ТекстЗапроса = "ВЫБРАТЬ | ФактПродажиКомпанииОбороты.Период КАК ПериодМесяц, | ФактПродажиКомпанииОбороты.Менеджер.Наименование КАК Менеджер, | ФактПродажиКомпанииОбороты.Номенклатура.Наименование КАК НоменклатураНаименование, | ФактПродажиКомпанииОбороты.ДоговорВзаиморасчетовПокупателя.Наименование КАК Договор, | ФактПродажиКомпанииОбороты.СуммаПродажиРубОборот КАК СуммаПродажиРуб |ИЗ | РегистрНакопления.ФактПродажиКомпании.Обороты(&Дата1, &Дата2, Час, ) КАК ФактПродажиКомпанииОбороты"; Размер выборки оценивал по размеру файла: ЗначениеВФайл("C:\111\tzData.txt",тзИтПродажи); |
|||
73
Ivanich
15.08.23
✎
10:16
|
Результаты:
Победа COM: com 15.08.2023 9:46:55 Январь 2019 г. - Июль 2023 г. Время(сек): 79, в т.ч Тини = 36, Тзап = 10, Тчтн = 33, строк= 216 296 web 15.08.2023 9:48:22 Январь 2019 г. - Июль 2023 г. Время(сек): 81, в т.ч Тини = 0, Тзап = 65, Тчтн = 15, строк= 216 296 размер файла: 85417кб Победа WEB: com 15.08.2023 9:51:11 Июнь 2019 г. - Июль 2023 г. Время(сек): 79, в т.ч Тини = 38, Тзап = 14, Тчтн = 27, строк= 193 412 web 15.08.2023 9:52:24 Июнь 2019 г. - Июль 2023 г. Время(сек): 68, в т.ч Тини = 0, Тзап = 55, Тчтн = 11, строк= 193 412 размер файла: 76343кб На больших выборках (от 80Мб) com начинает выигрывать у web |
|||
74
Ivanich
15.08.23
✎
10:23
|
Вот в общем-то и всё. В любом случае COM уходит в прошлое. Ветку можно закрывать.
|
|||
75
ManyakRus
15.08.23
✎
10:46
|
Я всё равно не верю что web может выигрывать чем com.
У web только подключение может быть быстрее. Наверно чтото неправильно тестировали. "COM уходит в прошлое" - только потому что у нас на работе линукс :-( жалко COM, он очень хороший |
|||
76
Chai Nic
15.08.23
✎
11:05
|
(75) "жалко COM, он очень хороший"
На самом деле он плохой, но привычный. Для 1с следовало бы сделать нативный межбазовый объектно-процедурный коннектор без недостатков COM. Но к сожалению не сделали. Вместо этого предложили использовать костыли в виде веб-сервисов.. |
|||
77
lodger
15.08.23
✎
11:07
|
(76) а ты заглядывал, как в типовом обмене работает "непосредственное соединение"?
|
|||
78
Chai Nic
15.08.23
✎
11:09
|
(77) Вроде бы там COM, или что?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |