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

11.04.13

Интеграция - Внешние источники данных

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

Предисловие

Решали ли Вы задачи интеграции на платформе 1С:Предприятие? Если да, то Вам наверняка приходилось настраивать обмен данными между информационными базами 1С:Предприятия или с другими информационными системами через COM-соединение. С ростом интенсивности использования подобного обмена начинает вставить вопрос оптимизации - сокращение времени на выполнение обмена или даже создания обмена в реальном времени. 

В подобных условиях использовать COM-объект соединения становится проблематичным, ведь при каждом подключении к другой базе он полностью загружает конфигурацию. А если в качестве конфигурации выступает, скажем, "Управление производственным предприятием", где размер конфигурации давно превысил 200 МБ? Тогда время на инициализацию соединения будет значительным. А использовать COM-соединение для обмена по "тонким" каналам связи будет вообще не возможно!

В статье рассмотрим три способа кэширования COM-объекта соединения с целью оптимизации скорости подключения и обмена.

 

Подробнее

Для наглядного представления путей решения подобной задачи обратимся к следующей схеме:

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

Самым простым, но наименее универсальным является способ кэширования объекта соединения в глобальной переменной модуля формы. Такой способ подойдет, если COM-соединение используется редко в какой-либо обработке или другом объекте конфигурации. Для постоянного использования соединения этот способ вряд ли подойдет, ведь при открытии формы будет необходимо вновть инициализировать соединение, что займет значительное время из-за загрузки конфигурации подключаемой базы. Практический пример использования такого способа Вы можете посмотреть в статье "Поддержка COM-соединения. Часть №1".

 

В противовес первому способу по сложности предлагается кэшировать COM-соединение на отдельной машине, веб-сервере. Например, можно создать веб-сервис, который будет инициализировать соединение через COM-объект при первом обращении. Далее подключаемые к веб-сервису клиенты смогут работать с кэшированным соединением, выполняя все необходимые методы объекта. С точки зрения производительности и экономии лицензий сервера 1С:Предприятия это идеальный вариант, но его выбор обоснован только в том случае, если в дальнейшем работа с этим соединением будет интенсивным. Иначе получится, что мы поставим купим и настроим отдельную машину с веб-сервером, который будет кэшировать соединение для нескольких пользователей. А это не рационально. Статью о практической реализации такого способа кэширования COM-соединения Вы можете посмотреть здесь: "Поддержка COM-соединения. Часть №2".

 

Но что, если использоваться COM-соединение будет часто, но не настолько, чтобы тратиться на реализации последнего предложенного варианта, при этому использовать глобальные переменные модуля формы также не вариант - соединение должно кэшироваться не для одной формы, а для нескольких объектов (обработка, отчет, документ). Тогда более правильнее было бы использовать вариант "золотой середины" - кэшировать соединение во временном хранилище в рамках каждого отдельного сеанса, которому это соединение необходимо. Этот вариант действительно подходит для большинства возникающих подобных задач. Небольшой пример его использования продемонстрирован в статье "Поддержка COM-соединения. Часть №3. Золотая середина".

 

Заключение

Использование COM-соединение для интеграции прикладных решений на платформе 1С:Предприятие между собой и с другими программными продуктами позволяет решать сложнейшие задачи по созданию единой информационной системы предприятия. 

Надеюсь, что статья поможет Вам найти решение по оптимизации работы COM-соединения и совершенствовании интеграции на Вашем предприятии.

 

См. также

SALE! 20%

Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2. Переносятся документы, справочная информация и остатки

Обмен между базами 1C Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) в продаже с 2015 года, постоянно работаем над их развитием | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

45650 36520 руб.

04.08.2015    159658    363    267    

345

SALE! 15%

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 22572 руб.

12.06.2017    134913    722    291    

388

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22441    19    1    

22

SALE! 20%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0. Переносятся документы, начальные остатки и справочники

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | В продаже с 2019г. | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

34650 27720 руб.

15.04.2019    68402    178    138    

111

SALE! 20%

Перенос данных из ERP 2 / КА 2 в ЗУП 3. Переносятся остатки, документы и справочники

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Воспользовались более 79 предприятий! | Предлагаем приобрести готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | В продаже с 2020г. | Оперативно обновляем правила до актуальных релизов 1С | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

43450 34760 руб.

03.12.2020    34164    80    58    

78

SALE! 10%

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.87.x) и УТ 11.5 (11.5.16.x).

28000 25200 руб.

23.07.2020    46280    196    64    

157

SALE! 10%

Перенос данных из БП 3.0 в УТ 11 / КА 2 / ERP 2. Переносятся начальные остатки, документы и справочники

Обмен между базами 1C Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

В продаже с 2014г. | Воспользовались более 122 предприятий! | Перенос данных из БП 3.0 в УТ 11 | из БП 3.0 в КА 2 | из БП 3.0 в ERP | Сэкономьте свое время - используйте готовое решение для перехода! | Постоянно работаем над развитием переноса данных | Обновляем на новые релизы 1С | Есть фильтр выгрузки по организациям | Переносятся начальные остатки на выбранную дату, документы за период времени и вся возможная справочная информация | Перенос сделан на технологии КД 2 (правила конвертации данных)

50722 45650 руб.

31.10.2014    231385    124    327    

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

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

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

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

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

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

да простят меня за оффтопик, но это заявление уже напоминает бородатый анекдот:
в сокращении:
- Гиви, вот представь, пошел ты в лес, а навстречу тебе медведь. Что будешь делать?
...
- Ну на дерево залезу.
- А нету дерева.
- Как нету дерева?? Это ведь лес!!
- Ну вот такой лес!!
...
За ответы спасибо. Вашу позицию я понял.
16. пользователь 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. пользователь 12.04.13 18:06
(5) a.p.soft, немного не по теме вопрос. В статье идет речь о кэширования COM-объекта соединения, который используется для связи между собой разных баз или для связи с базой 1С:Предприятия из других программ.
Вот подробнее: http://v8.1c.ru/overview/IntegrationCOM.htm

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

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

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

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

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

Автор, уж извините за неграмотность, но если Вы уже используете веб-сервер, зачем Вам вообще com-соединение? Ну наваяйте в 1с свой веб-сервис с нужными методами и разом избавитесь от всех проблем с com-соединением.
20. пользователь 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. пользователь 17.12.18 07:41
(31) посмотрите на даты публикации. Уже сколько времени прошло, были ли тогда нормальные HTTP-сервисы :)
kote; GreenDragon; +2 Ответить
33. GreenDragon 17.12.18 09:42 Сейчас в теме
(32) *Стыдливо удаляюсь в кусты, пытаясь оттереть со лба печать "некропостер"*
YPermitin; +1 Ответить
34. пользователь 17.12.18 23:30
21. galich 162 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 398 06.08.13 13:20 Сейчас в теме
(21) galich, для регламентного задания такой способ подойдет ? В смысле для хранения COM объекта в интервалах между выполнением регламентного задания на сервере ?
24. пользователь 06.08.13 21:08
(22) ZLENKO.PRO, можно, но только способом, где COM-объект кэшируется на веб-сервере. Тогда его использовать можно из любого сеанса.
23. galich 162 06.08.13 19:56 Сейчас в теме
К сожалению, нет. Разные запуски регламентных заданий в разных сессиях запускаются.
Кроме того, регламентные задания запускаются на стороне сервера, а не клиента.
25. пользователь 02.12.13 14:13
Сообщение было скрыто модератором.
...
28. Serginio 938 09.02.16 14:09 Сейчас в теме
Еще один вариант это использование статического поля класса .Net. Так как после загрузки Dll она не выгружается, то и статические поля будут содержать значения пока не выгрузится рабочий процесс
29. =Kollega= 4 16.06.17 16:52 Сейчас в теме
В свое время решал подобную задачу. Проблема была в том, что пользователям время от времени приходилось соединяться с одной базой, для поиска инфы. Кеширования на стороне клиента с одной стороны хорошо, но со стороны лицензий плохо - постоянно не хватало. С другой стороны web-сервера собственного тоже не было, пришлось копать в другую сторону. На Delphi написал собственный простой com-сервер и зарегистрировал его на сервере, где сама 1с-ка крутится. При первом обращении к нему, система его автоматически запускала и он инициировал соединение с удаленной базой. В дальнейшем он просто крутился в памяти сервера, поддерживая com-соединение с базой.
По сути получалось, что ждет только 1-й пользователь, пока установится соединение, остальные получали уже готовое соединение.
GKG; acanta; +2 Ответить
30. intehof 23.06.17 23:22 Сейчас в теме
(29) Если возможно, поделитесь исходниками пожалуйста...
35. alex_bob 246 06.07.20 13:57 Сейчас в теме
Теперь еще возможен вот такой вариант. В марте обновил до v83
36. biimmap 1827 12.08.20 13:40 Сейчас в теме
Только начал кричать УРА... а для платформы 8.3 ПоместитьВоВременноеХранилище. Выдает ошибку. Уже писали в этом посте. а вариант шикарнейший был...
37. пользователь 12.08.20 13:42
(36) уже 7 лет прошло :)

Все поменялось...
38. biimmap 1827 12.08.20 13:48 Сейчас в теме
(37) я понимаю, а новые предложение чтоб COM на сервере кэшировать появились за 7 лет?))) Задача то не отпала!
40. пользователь 12.08.20 13:55
(38) давно с ним не работал.
Коллега ниже предлагает решение, но я честно сомневаюсь что сейчас это возможно.
39. SlavaKron 12.08.20 13:51 Сейчас в теме
(36) Соединение в Структуру, Структуру во временное хранилище.
ПоместитьВоВременноеХранилище(Новый Структура("Соединение", Соединение), Новый УникальныйИдентификатор)
ksuman; GonziK_KIV; kote; Азбука Морзе; user763700; biimmap; +6 Ответить
41. biimmap 1827 12.08.20 14:10 Сейчас в теме
(39)РАБОТАЕТ!!!!!! УРААААААААААААА))). Автор обновляйте статью этим примером!
user763700; YPermitin; +2 Ответить
42. пользователь 12.08.20 14:10
(41) неее, ковыряться в материалах 13 года, я ж не некромант :)
44. ksuman 17 01.04.23 13:23 Сейчас в теме
(39) Здорово, я как раз искал способ кеширования компоненты в 8.3 в обход запрета несериализированных данных, т.к. 8.2 можно было напрямую хранить объекты во Временном хранилище. Для компоненты это также работает.
45. SlavaKron 01.04.23 14:46 Сейчас в теме
(44) Да, но храниться во временном хранилище она будет 20 минут. Вот только не помню, обновляется ли этот таймер при получении из временного хранилища.
43. ogursoft 30.09.21 15:50 Сейчас в теме
Пробую создать com соединение из http сервиса, получаю ошибку:
 {ОбщийМодуль.Глобальный.Модуль(100)}: Ошибка при вызове метода контекста (ПолучитьCOMОбъект)

Как вызвать com объект из http сервиса
46. ksuman 17 01.04.23 18:27 Сейчас в теме
(45) Да, я это учел, мне просто нужно минимизировать количество вызовов на создание объекта компоненты, это сэкономит массу ресурсов. К тому же из контекста формы, объект будет храниться пока жива форма, если передать УИ.
47. Frank_franklin 4 29.05.23 16:44 Сейчас в теме
Не подскажите, где можно посмотреть пример по варианту "можно создать веб-сервис, который будет инициализировать соединение через COM-объект при первом обращении"?
Оставьте свое сообщение