0. YPermitin 3026 11.04.13 08:45 Сейчас в теме

Кэширование COM-соединения. Три способа

Статья о трех способах кэширования COM-соединения в 1С:Предприятии 8.x.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. Sergoninfostarru 2 11.04.13 23:47 Сейчас в теме
COM-соединение хорошо использовать при пакетных задачах : перетяжка справочников, документов, остатков и т.д., когда за ОДНО соединение вытягивается максимум информации. В случае постоянного "дёргания" данных из другой БД, скорость значительно снижается. В примерах показан простой вариант, а когда дело доходит до документов, то скорость резко падает.
2. YPermitin 3026 12.04.13 05:36 Сейчас в теме
(1) Sergoninfostarru, возможно Вы правы.

При решении реальной задачи с помощь COM-соединение передаю двоичные данные. Работает быстро. Единственным узким местом была скорость установки соединения. Вот ее и решили.

А почему для документов скорость медленная?
3. gaglo 12.04.13 11:49 Сейчас в теме
Разве нельзя вместо временного хранилища использовать переменную в модуле приложения? Как раз и получится сохранение в рамках отдельного сеанса.
4. YPermitin 3026 12.04.13 11:53 Сейчас в теме
(3) gaglo, фактически это будет тоже самое, что и хранить в переменной модуля формы.
Да, в рамках сеанса, но на стороне клиента. А последнее отрицательно влияет на стабильность. Мало ли какая у клиента линия связи, а COM-соединение такого ой как не любит =)

К тому же тогда необходимо регистрировать COM-объект соединения на клиентской машине.

А временное хранилище сохранит его на стороне сервера.
11. gaglo 14.04.13 08:27 Сейчас в теме
(4) Ну во-первых, не совсем "то же самое", а именно в рамках сеанса, а не на время жизни открытой формы; во-вторых, если все происходит в локальной сети предприятия, то на клиенте или на сервере хранить - безразлично, в-третьих, приходится еще раз пожалеть, что в рубрикации на сайте нет разделений вроде "управляемые / обычные формы / WEB-приложения" (но это не к автору ;-])
Кстати, для меня не явилось очевидным, что по третьему способу и регистрация COM-соединения проходит на стороне сервера...
12. YPermitin 3026 14.04.13 08:46 Сейчас в теме
(11) gaglo, качество локальной сети тоже бывает разной.

В третьем способе нет очевидности =) К кэшированному соединению на веб-сервере можно обращаться как с клиентской, так и с серверной стороны. Все зависит от прав доступа.
15. gaglo 14.04.13 15:51 Сейчас в теме
(12)
качество локальной сети тоже бывает разной

да простят меня за оффтопик, но это заявление уже напоминает бородатый анекдот:
в сокращении:
- Гиви, вот представь, пошел ты в лес, а навстречу тебе медведь. Что будешь делать?
...
- Ну на дерево залезу.
- А нету дерева.
- Как нету дерева?? Это ведь лес!!
- Ну вот такой лес!!
...
За ответы спасибо. Вашу позицию я понял.
16. YPermitin 3026 14.04.13 16:24 Сейчас в теме
(15) gaglo, может для Вас это и анекдот, но когда сталкиваешься с этим на практике, то становится не до шуток.

200 пользователей, из них у части скорость в локальной сети не блещет стабильностью. Вот тогда будете задумываться о правильной реализации.

А если в локалке 10 юзеров, то смысла кэшировать соединение вообще нету)
17. gaglo 14.04.13 16:55 Сейчас в теме
(16)
200 пользователей, из них у части скорость в локальной сети не блещет стабильностью

...имеет смысл задумываться о построении сети, а не пытаться исправить чужие огрехи???
Да, для меня это анекдот... У нас 120 пользователей одновременно. Три больших здания. Сеть проводная плюс WiFi-сегмент. Скорость стабильна. Две работающих системы. COM-соединения присутствуют. Кэшируются в переменной модуля приложения. Пока работает стабильно.
Я же сказал "Вашу позицию я понял". Спасибо!
26. YanTsys 12 09.12.13 09:52 Сейчас в теме
(15) gaglo, это тот где "- я не понял ты чей друг, мой друг, или медведя друг?"
27. gaglo 09.12.13 11:40 Сейчас в теме
5. a.p.soft 54 12.04.13 15:47 Сейчас в теме
Уважаемые, скажите пожалуйста, а предваряющее обработку чтение всего XLS-файла (точнее всех нужных ячеек, во всех строках) - может считаться кешированием COM-соединения, о котором идет речь в статье? В принципе, учитывая возможные практические проблемы я пришел именно к такому способу работы с COM объектами. Реально, это ускоряет скорость работы обработки в несколько раз. Т.е сначала одним циклом всё считывается в массив, а уже потом обработка "пережёвывает" все данные.
6. YPermitin 3026 12.04.13 18:06 Сейчас в теме
(5) a.p.soft, немного не по теме вопрос. В статье идет речь о кэширования COM-объекта соединения, который используется для связи между собой разных баз или для связи с базой 1С:Предприятия из других программ.
Вот подробнее: http://v8.1c.ru/overview/IntegrationCOM.htm

Вы же говорите о кэшировании любого COM-объекта, в частотности для чтения XLS. В принципе описанный подход тоже подойдет, проблем с этим не вижу. Обратите внимание на первые два способа. Думаю последний с веб-сервером будет излишним, чтобы прочитать файл XLS =)
7. seermak 659 12.04.13 21:18 Сейчас в теме
Все хорошо, но: на платформе 8.3 (хоть в совместимости хоть нет) в процедуре СохранитьСоединение(Соединение) в строке ПараметрыСеанса.АдресCOMСоединения = ПоместитьВоВременноеХранилище(Соединение, Новый УникальныйИдентификатор); = рушится с ошибкой "Переданное значение не может быть помещено во временное хранилище". Можно это как-то пояснить или подсказать (если кто знает)
PS в 8.2 проблем нет
coollerinc; jills2001; +2 Ответить
8. YPermitin 3026 12.04.13 22:41 Сейчас в теме
(7) seermak, интересная информация.

Вообще, согласно документации, во временное хранилище можно помещать только те значения, которые серилизуются. COM-объект соединения (да и вообще любой COM-объект) серилизовать нельзя.

В платформе 8.2 не смотря на это можно было сохранить соединение во временное хранилище. Так сказать, недокументированные возможности платформы.

Ну а в версии 8.3 видимо это дело прикрыли.
9. seermak 659 13.04.13 10:46 Сейчас в теме
Да и еще - если платформа установлена в каталог с русскими буквами - соединения по СОМ невозможны (Проверено на себе (с)seermak)
10. YPermitin 3026 13.04.13 11:44 Сейчас в теме
(9) seermak, странный баг.

А зачем использовали каталог с русскими буквами для этого?
13. petrov_al 10 14.04.13 12:21 Сейчас в теме
А почему не используете внешние источники данных?
14. YPermitin 3026 14.04.13 15:32 Сейчас в теме
(13) petrov_al, они могут использоваться только для чтения данных. Для модификации, увы, не получится использовать в отличии от предложенного варианта.
18. aspirator23 396 19.04.13 07:27 Сейчас в теме
Любопытные варианты. Сам использую, но пока только вариант номер 2.
19. bulpi 156 19.04.13 19:33 Сейчас в теме
"Например, можно создать веб-сервис, который будет инициализировать соединение через COM-объект при первом обращении."

Автор, уж извините за неграмотность, но если Вы уже используете веб-сервер, зачем Вам вообще com-соединение? Ну наваяйте в 1с свой веб-сервис с нужными методами и разом избавитесь от всех проблем с com-соединением.
20. YPermitin 3026 22.04.13 05:39 Сейчас в теме
(19) bulpi, веб-сервис, "наваяеный" в 1С будет использовать клиентские лицензии для каждого подключенного сеанса. Если же мы будем кэшировать COM-соединение на веб-сервере и обращаться через него, то лицензия всегда будет использоваться одна. В этом главное отличие.
31. GreenDragon 16.12.18 15:02 Сейчас в теме
(20) Используйте http-сервисы. Лицензия используется только на время соединения. Как правило, это время при адекватной передаче данных, меньше секунды. По-факту, время необходимое от получения пакета данных вэб-сервером до отправки ответа отправителю. Обрабатывать полученные данные вы можете дальше на сервере без потребления какой-либо клиентской лицензии.
Ваш метод:
1. Не кросплатформенный.
2. Отдельное шаманство в случае нескольких установленных платформ - к примеру, несколько версий 8.3
3. Ресурсоёмкость - по факту запускается полный экземпляр приложения.
4. Нестабильность com - на своём опыте познали прелесть подвисающих com-подключений
5. Лицензия потребляется на время жизни com-объекта.

Да и зачем вот это всё, если у вас же публикация: https://infostart.ru/public/427026/ ?
32. YPermitin 3026 17.12.18 07:41 Сейчас в теме
(31) посмотрите на даты публикации. Уже сколько времени прошло, были ли тогда нормальные HTTP-сервисы :)
GreenDragon; +1 Ответить
33. GreenDragon 17.12.18 09:42 Сейчас в теме
(32) *Стыдливо удаляюсь в кусты, пытаясь оттереть со лба печать "некропостер"*
YPermitin; +1 Ответить
34. YPermitin 3026 17.12.18 23:30 Сейчас в теме
21. galich 144 28.05.13 10:02 Сейчас в теме
Самый примитивный вариант хранения созданного COM-объекта:
Создаем общий клиентский модуль, устанавливаем Повторное использование возвращаемых значений "На время сеанса", создаем функцию, типа этой:

Функция ПолучитьСоединениеСБД(СтрокаПодключения) Экспорт
COM = Новый COMОбъект("V82c.Application");
COM.Connect(СтрокаПодключения);
COM.Visible = Ложь;
Возврат COM;
КонецФункции

И каждый раз, когда нужен COM, обращаемся к ней. Если нужно убить COM - делаем ОбновитьПовторноИспользуемыеЗначения(). Не забываем вызвать эту функцию перед завершением работы системы, а то отладка не будет отпускать сервер. ПРОФИТ :)
Chernik; dgolovanov; Nuuq; tehas; Aleksey.Bochkov; YPermitin; +6 Ответить
22. ZLENKO 06.08.13 13:20 Сейчас в теме
(21) galich, для регламентного задания такой способ подойдет ? В смысле для хранения COM объекта в интервалах между выполнением регламентного задания на сервере ?
24. YPermitin 3026 06.08.13 21:08 Сейчас в теме
(22) ZLENKO.PRO, можно, но только способом, где COM-объект кэшируется на веб-сервере. Тогда его использовать можно из любого сеанса.
23. galich 144 06.08.13 19:56 Сейчас в теме
К сожалению, нет. Разные запуски регламентных заданий в разных сессиях запускаются.
Кроме того, регламентные задания запускаются на стороне сервера, а не клиента.
28. Serginio 798 09.02.16 14:09 Сейчас в теме
Еще один вариант это использование статического поля класса .Net. Так как после загрузки Dll она не выгружается, то и статические поля будут содержать значения пока не выгрузится рабочий процесс
29. =Kollega= 1 16.06.17 16:52 Сейчас в теме
В свое время решал подобную задачу. Проблема была в том, что пользователям время от времени приходилось соединяться с одной базой, для поиска инфы. Кеширования на стороне клиента с одной стороны хорошо, но со стороны лицензий плохо - постоянно не хватало. С другой стороны web-сервера собственного тоже не было, пришлось копать в другую сторону. На Delphi написал собственный простой com-сервер и зарегистрировал его на сервере, где сама 1с-ка крутится. При первом обращении к нему, система его автоматически запускала и он инициировал соединение с удаленной базой. В дальнейшем он просто крутился в памяти сервера, поддерживая com-соединение с базой.
По сути получалось, что ждет только 1-й пользователь, пока установится соединение, остальные получали уже готовое соединение.
30. intehof 23.06.17 23:22 Сейчас в теме
(29) Если возможно, поделитесь исходниками пожалуйста...
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Консультант ERP-систем
Москва
Временный (на проект)

Бизнес-аналитик 1С
Москва
зарплата от 90 000 руб. до 150 000 руб.
Полный день

Программист 1С
Москва
зарплата от 140 000 руб.
Полный день

Программист 1С
Санкт-Петербург
Полный день

Программист 1С
Нижневартовск
зарплата от 60 000 руб.
Полный день