0. tormozit 5420 09.08.15 18:59 Сейчас в теме

Взаимодействие между базами 1С через COM

Рассмотрено много особенностей взаимодействия между базами 1С по COM технологии

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

Комментарии
Избранное Подписка Сортировка: Древо
1. anig99 2681 10.08.15 10:28 Сейчас в теме
Блин. На 4 дня опоздали со статьей (:
В статье среди проблем надо бы ещё упомянуть про научное представление числа при работе с COM. Понятно, что это прописано на ИТС, но не сразу натыкаешься на это.
7. dgolovanov 10.08.15 19:06 Сейчас в теме
(1) anig99, так написали бы, о чем речь, пусть эта статья будет как закладка - FAQ по теме, в т.ч. и дополненная комментариями?
2. DenisCh 10.08.15 10:49 Сейчас в теме
Спасибо.
Новой (для меня) информации - немного, но всё очень систематизировано.
Добавил в закладки, спасибо ещё раз.
dragonCat; +1 Ответить
3. DexterMorgan777 3 10.08.15 11:31 Сейчас в теме
Спасибо. Добавил в закладки.
4. Yashazz 2376 10.08.15 14:36 Сейчас в теме
Совершенно ничего нового, но какая статья, чёрт побери, прям всем смотреть и учиться так публикации готовить. Приятно видеть грамотную работу. Может, по размышлении свои 5 копеек подкину, а пока однозначный плюс. Вот это уровень, это подход! Браво!
TeMochkiN; bulpi; Taktic; artbear; Fox-trot; Evil Beaver; baton_pk; +7 Ответить
5. Yashazz 2376 10.08.15 15:12 Сейчас в теме
Кстати, коллеги, если я верно помню, в ком-соединении до сих пор не работают функции "Тип" и "ТипЗнч", и только относительно недавно заработала "ЗначениеЗаполнено" (да и то за 8.2 не поручусь). Ну и "Выполнить" тоже не хотела фурычить. Это так?
6. Yashazz 2376 10.08.15 15:30 Сейчас в теме
И ещё, из области экзотики. Был у нас ком-обмен на 8.2 в толстом клиенте, читавший данные из конфы в режиме совместимости 8.1, обычный внутрипроцессный COMConnector. Релиз уже точно не скажу, что-то вроде 19.102.
И была там структура, заполняемая всяким разным, в т.ч. ком-объектами, и хранимая путём кэширования повторного использования, в рамках сеанса. Ну, тогда так сделали. Так вот, вроде бы ком-объекты сохранялись все, НО: последний по времени добавления ключ структуры всегда получал значение предпоследнего, если сам являлся ком-объектом. Т.е. код вида:
стру=Новый Структура;
стру.Вставить("КомОбъект1",ком1);
стру.Вставить("ПростоеЧисло",666);
стру.Вставить("КомОбъект2",ком2);
всегда давал по возвращении этой структуры, что значение в ключе "КомОбъект2" равно 666. Как только последним в структуре оказывался не ком, а нечто иное, эффект пропадал. Два ком-значения, поставленные последним и предпоследним, давали тот же эффект - 1С их приравнивала первому предыдущему не-ком-значению. Если такового не было, то все, кроме последнего, опять были нормальные. Во, чего бывало.
8. DoctorRoza 11.08.15 08:55 Сейчас в теме
Статья рискует быть честно скоммунизжена перепечатана в учебники 1С. :)
wowik; Fynjy; bulpi; maksa2005; CSiER; EmpireSer; Evil Beaver; Yashazz; +8 Ответить
9. avto1c 11.08.15 11:32 Сейчас в теме
Через веб-сервисы значительно быстрее обмен идет, но требует более грамотного сопровождения, в том числе админского при обновлении платформы.
11. tormozit 5420 11.08.15 11:48 Сейчас в теме
(9) С таким утверждением не соглашусь, т.к. оно слишком категоричное. Однако бесспорно обмен через веб-сервисы в каких то случаях будет значительно быстрее аналогичного через COM. В статье в частности указан недостаток COM по сравнению с веб-сервисом "Высокие затраты на подключение/инициализацию, поэтому при отсутствии кеширования неэффективно для частых мелких вызовов". Например, если передавать по одному мелкому объекту за вызов, то веб-сервис будет значительно быстрее COM без кеширования.
artbear; Yashazz; +2 Ответить
12. Yashazz 2376 12.08.15 08:48 Сейчас в теме
(9) avto1c, учитывая, какую кучу барахла тянет с собой SOAP и сколько втихаря бесконтрольно вытворяет - имхо, COM управляемее. Хотя, как уже верно сказали, всё имеет плюсы и минусы.
10. Evil Beaver 5978 11.08.15 11:47 Сейчас в теме
Люто, люто плюсую и выказываю всяческий респект!
13. Gridleak 12.08.15 12:39 Сейчас в теме
Спасибо, все очень четко расписано. Вопрос: какие права должны быть у пользователя, от имени которого работает COM-приложение?
14. tormozit 5420 12.08.15 15:13 Сейчас в теме
(13) Под COM-приложение имеется ввиду Automation-сервер или внепроцессное COM+ приложение? Под "должны быть" имеется ввиду "какие права получит приложение" или "какие права нужны приложению для выполнения какой то задачи"?
15. Gridleak 13.08.15 11:47 Сейчас в теме
В статье, в разделе "Управление COM+ приложениями" через оснастку dcomcnfg.exe, есть фраза "Далее необходимо указать пользователя, от имени которого будет работать COM+ приложение, на закладке Идентификация (Identity)." Меня интересует - какие минимально необходимые права должны быть у этого пользователя?
16. tormozit 5420 13.08.15 12:02 Сейчас в теме
(15) Это определяется тем, какие задачи будут решаться во внешних соединениях. По умолчанию выбрана системная учетная запись <InteraciveUser>, т.е. интерактивно вошедший пользователь. Можно указать LocalService (Локальная служба), как самую безопасную из системых. Можно указать NetworkService (Сетевая служба), если требуется доступ к сетевым ресурсам. Можно создать и назначить новую учетную запись и добавлять ей права по мере необходимости.
17. Gridleak 13.08.15 12:31 Сейчас в теме
18. Dach 254 26.08.15 10:00 Сейчас в теме
Пару лет назад столкнулся вот с чем. Нужно было работать с 32-битным COM на стороне 64-битного сервера.

Оснастку делал как рекомендовано здесь:

http://www.steeltrace.ru/details/articleid/22/регистрация-1с-com-компонента-для-работы-с-64-битными-приложениями.aspx

Однако, оказалось, что нужно помимо всего прочего, отключить принудительную проверку доступа на закладке "безопасность".
19. tormozit 5420 26.08.15 10:24 Сейчас в теме
(18) Про разрядность у меня вроде бы четко описано в самом начале
Внепроцессное локальное (local)
Должен быть зарегистрирован класс V8X.ComConnector любой разрядности и сборки платформы.

Про
нужно помимо всего прочего, отключить принудительную проверку доступа на закладке "безопасность"

мне неизвестно. Поэтому если уж хочешь поделиться знаниями, то пожалуйста поясни причину, по которой пришлось "отключить принудительную проверку доступа на закладке "безопасность""
20. Dach 254 27.08.15 10:25 Сейчас в теме
(19)

У меня было так:

ОбъектПодключения = "V82.COMConnector";
ТекCOMПодключение = Новый COMОбъект(ОбъектПодключения);

Выдавалась ошибка "доступ запрещен"

Ошибка при вызове конструктора (COMОбъект): Access is denied.: Access is denied.

1С-ка запущена под тем же юзером, под которым компонента запущена, юзер был добавлен в owners компоненты.

Пока проверку доступа не отключил - не работало, почему так - не знаю. Релиз платформы не помню за давностью этой ошибки....
21. alex_4x 80 31.08.15 09:19 Сейчас в теме
Скажите, почему при получении цифровых значений через COM соединение иногда (не всегда) происходит следующее:
Число меняется свою разрядность и значение. Ну например было 100.20 , а по COM соединению получишь 100.199999999
Если сделать округление до нужной точности - то всё будет нормально.
Изменение разрядности не очень удивляет, но то, что происходит такое интеллектуальное изменение числового значения - просто интересен сам факт и почему же так происходит.
Если вы такой эффект не наблюдали - сделайте запрос любой и выполните его через COM на подключенной базе, а результирующую таблицу верните в вызывающий COM соединение 1С.
22. Cyberhawk 111 21.09.15 09:57 Сейчас в теме
(21) alex_4x, это давно известно и нормально (потому что дробные числа в этом случае передаются как double, и при преобразовании туда-обратно накапливается погрешность).
41. alex_4x 80 25.01.16 10:06 Сейчас в теме
(22) Cyberhawk, Ваш ответ предсказуем. Но на секундочку, при преобразовании из инта в дабл или из инта в флоат - никакой погрешности не накапливается, не придумывайте и не смешите.
Погрешность может накопиться при преобразовании из дабл значения, у которого большая точнасть в флоат с меньшей точностью, из флоата и дабла с дробной частью в инт без дробной части.
А предсказуем Ваш ответ потому, что так же это нормальным считает сама контора 1С, также как и многие другие косяки, выдавая это за "фишку". Это косяк, причем этот косяк говорит о том, что данные в процессе передачи некорректно обрабатываются. Я даже могу придумать пример, когда это приведет к фатальному для логики программы результату. Да я думаю и Вы можете придумать, тут ничего сложного нет.
При чем эта ошибка будет присутствовать даже в случае если передается таблица с типизированными типами колонок, если передается результат запроса с типизированными результатами. Короче это просто сказка.
И еще раз. Чтобы снова ту же чушь не писал, уважаемый поросенок на тракторе. От того что это давно известно - совершенно не следует что это нормально.
Если есть аргументы, почему Вы это считаете нормальным, пожалуйста потрудитесь привести эти аргументы. Развернуто и с ссылками на официальную документацию.
LordKim; bulpi; +2 Ответить
23. unoDosTres 07.10.15 09:34 Сейчас в теме
Доброго дня!
никто не сталкивался с такой проблемой по DCOM

код следующий
КомСоединитель = Новый COMОбъект(“V83.ComConnector”, ИмяКомпьютера);
ВнешнееСоединение = КомСоединитель.Connect(СтрокаСоединения);


Когда использую в первой строке Только ИмяКомпьютера (без указания порта кластера сервера 1с ), например se-1011 то ком Объект создается, но Connect не проходит (т.е. в переменную ВнешнееСоединение передается Неопределено), по правильной строке соединения( имею ввиду что пароль логин и реквизиты базы верные), а когда начинаю в первой строке кода писать не только ИмяКомпьютера но и Порт кластера сервера 1с (se-1011:1541), то выдает ошибку "Сервер RPC недоступен". подскажите как вообще правильно просто указывать имяКопьютера без порта или обязательно с портом, как вообще осущесnвить Внепроцессное нелокальное ком соединение, о котором упоминается в статье?
24. tormozit 5420 07.10.15 10:03 Сейчас в теме
(23) ИмяКомпьютера должно содержать буквально имя компьютера. Подключение к нему COM механизм выполняет через RPC протокол, у которого есть фиксированный порт для установки соединения. Поэтому порт там указывать не нужно.
unoDosTres; +1 Ответить
25. unoDosTres 07.10.15 10:11 Сейчас в теме
(24)
тогда не пойму почему не проходит соединение, если просто по ком пробовать соединение проходит, т.е. вот так
КомСоединитель = Новый COMОбъект(“V83.ComConnector”);
ВнешнееСоединение = КомСоединитель.Connect(СтрокаСоединения);

а как указал в (23) с той же строкой соединения в переменную ВнешнееСОединение возвращается неопределено?
26. unoDosTres 07.10.15 10:40 Сейчас в теме
может быть строка соединения должна быть какой то другой, у меня сейчас примерно вот так

СтрокаСоединения    = "Srvr=""se-1011:1541"";"+"Ref=""Baza1"";Usr=""ExternalUsr"";Pwd=""123456789"";";  

с такой строкой спокойно подключается по локальному КОМ, может нужно ключи какие то в строкусоединения дописывать для Dcom?
30. tormozit 5420 07.10.15 12:19 Сейчас в теме
(26) Никаких отличий в строке соединения к серверу 1с не требуется, т.к. она применяется непосредственно внутри процесса на DCOM сервере.
27. unoDosTres 07.10.15 11:03 Сейчас в теме
что заметил из отладки так это вот что

если создавать ком объект вот так
КомСоединитель = Новый COMОбъект(“V83.ComConnector”
, то вот что по нему в отладчике выходит


а если создавать вот так
КомСоединитель = Новый COMОбъект(“V83.ComConnector”, ИмяКомпьютера);

то в отладчике следующая картина

почему порты кластера серверов не заполняются при dcom?
28. tormozit 5420 07.10.15 11:38 Сейчас в теме
(27) Это порты по умолчанию. Если создать объект локально на том компьютере, который выступает в роли DCOM сервера, то какие будут значения?
unoDosTres; +1 Ответить
29. unoDosTres 07.10.15 12:09 Сейчас в теме
(28)

Если создать объект локально на том компьютере, который выступает в роли DCOM сервера то следующие

31. tormozit 5420 07.10.15 12:23 Сейчас в теме
(27) Какая версия платформы и операционная система? Возможно причина в сетевом экране.
32. unoDosTres 07.10.15 12:24 Сейчас в теме
ИЗначально я пробовал с базы на земле подключится к базе в облаке, Сейчас попробовал подключится в обратную сторону по Дком с облака на Землю, так подключение проходит, видимо в облаке что то недонастроено по службе Дком, спасибо за помощь, Сергей, буду копать в настройках Дком на стороне облака
33. tormozit 5420 07.10.15 12:29 Сейчас в теме
(32) Не забудь поделиться с нами результатами раскопок.
34. unoDosTres 08.10.15 14:16 Сейчас в теме
(33)
в результате помог почему то снос службы КОМ (именно КОМ а не дком) и повтрная его установка.

вообще обменом dCOM оказался недоволен, само соединение происходит относительно быстро порядка 5-7 секунд, (использовал dCOM для ХМЛ обмена), а вот само создание документов на основе правил занимает много времени, интервал между созданием документов от 30 сек до 1 минуты (в итоге порядка 38 объектов в базу грузилось минут 13), в то время если это выполнять вручную выгрузить в файл ХМЛьку потом открыть универсальный обмен и загрузить ХМЛьку в базе приемнике это занимает порядка 20--30 сек в общем.
ранее когда обе базы находились на земле обмен по Com происходил тоже быстро. печаль в общем, придется пробовать веб-сервис видимо, а так не хочется
35. tormozit 5420 08.10.15 14:30 Сейчас в теме
(34) Странно. Вроде бы я в статье причины наблюдаемых тобой неудобств описал. Обойти их можно применяя принцип "минимум COM-вызовов". Очевидно ты его не стал применять. Мы же его успешно и широко применяем. Поэтому веб-сервисы делаем только там, где они сильно выигрывают.
36. unoDosTres 08.10.15 21:35 Сейчас в теме
(35)
ну да тут ты прав, использование просто универсального обмена никакого отношения к принципу "минимума com-вызовов" не имеет ) там конечно же все шуруется через обращение к ком объекту и вызывает как и описано в статье "маршалинг и демаршалинг"
37. unoDosTres 11.10.15 12:58 Сейчас в теме
(35) еще раз внимательно перечитал статью.
в общем переделал алгоритм обмена в типовой универсальной обработке обмена ХМЛ, там основной косяк был в том что сколько объектов выгружалось (чтение в фалеобмена ПКО и ПКС..) столько раз и происходило обращение к комОбъекту, этот код был перенесен на сторону базы приемника (создано две новые экспортные процедуры и вызовз одной из них был сделан единожды как обращение ком), что значительно ускорило обмен. также было в обработке дописан вариант соединения по DCOM (это значительно ускорило соединение земля-облако с 5 минут время упало до 5 секунд по сравнению с обычным Com). в результат изменения обмен по нужным правилам обмена удалось сократить до 2 минут. спасибо за статью, Сергей
38. tormozit 5420 14.12.15 18:42 Сейчас в теме
Добавлен раздел "Настройка DCOM-сервера / Настройка сетевого экрана"
39. tormozit 5420 17.12.15 19:12 Сейчас в теме
Добавлен раздел "Привязка COM классов к dll-файлам"
40. tormozit 5420 27.12.15 00:57 Сейчас в теме
Добавлен раздел "Подключение Automation-сервера (OLE)"
42. tormozit 5420 26.01.16 16:57 Сейчас в теме
Добавлен раздел "COM классы платформы"
43. tormozit 5420 09.02.16 17:49 Сейчас в теме
В разделе "Минимизация количества COM-вызовов" добавлен пример универсальной передачи файла.
44. tank68 17 24.03.16 10:08 Сейчас в теме
При обновлении сервера 1с не однократно нарывался что не корректно регистрируются DLL спасают
regsvr32 "C:\Program Files\1cv8\Папка с версией\bin\comcntr.dll"
regsvr32 "C:\Program Files (x86)\1cv8\\Папка с версией\bin\comcntr.dll"
Например если версия 8.3.6.2014 то выглядит так:
regsvr32 "C:\Program Files\1cv8\8.3.6.2014\bin\comcntr.dll"
45. tormozit 5420 13.05.16 17:26 Сейчас в теме
Прошу поправить меня в новом абзаце, если он не точен
Привязка имен классов к dll-файлам кэшируется (запоминается) в процессе ОС. Поэтому, если процесс обратился к COM-классу, то он закэшировал (запомнил) привязку. Если после этого измененить (зарегистрировать) в реестре новую привязку, то чтобы такой процесс ее увидел, потребуется его перезапуск.

46. dr2c 39 16.01.17 12:40 Сейчас в теме
Обновил платформу до 8.3.9.2033
Сервер у нас х64 на Лине.
При попытке произвести обмены между базами (стандартные или универсальный xml) стали появляться сообщения "При попытке соединения с COM-сервером произошла следующая ошибка:
{Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(13798)}: Ошибка при вызове конструктора (COMОбъект): -2147221005(0x800401F3): Недопустимая строка с указанием класса"
regsvr32 делал.
Данный метод (регистрации 1С в качестве COM+ приложения)- для сервера на Win.
А, что делать с Lin?
47. dr2c 39 16.01.17 12:45 Сейчас в теме
(46) А может линь и не причем. сейчас попробовал обменяться м/у двумя файловыми базами- тоже самое...
gubanoff; +1 Ответить
48. disa_da 17.03.17 13:59 Сейчас в теме
"2. Разные сборки платформы клиента и сервера при одинаковом издании платформы
a. Для обхода для каждой отличной от COM-клиента сборки платформы назначаем и настраиваем DCOM сервер"

Уточните, пожалуйста, способ решения проблемы подключения к разным версиям платформы одного издания на одном сервере (например, 8.3.5 и 8.3.6):
- что значит "назначаем и настраиваем DCOM сервер"?
- как после этого будет выглядеть создание COM объекта ("Новый COMОбъект("КакоеДругоеИмяАНеV83.ComConnector)")?
49. trio-tlt 15.07.17 09:49 Сейчас в теме
Сергей, прошу добавить в статью:

Компонента comcntr.dll и другие компоненты платформы используют несколько статически линкуемых библиотек, например, core83.dll. В процесс возможно загрузить только один экземпляр такой библиотеки. Поэтому, например, из платформы 8.3.8 не получится воспользоваться comcntr.dll версии 8.3.9.
Другими словами из клиента 1С 8.3.8 не получится подключиться базе на сервере 8.3.9 без дополнительных трудностей. Клиент 1С 8.3.8 при запуске подгружает core83.dll версии 8.3.8, и при попытке создать СОМ объект версии 8.3.9 получается ошибка "Версия компоненты 'comcntr' (8.3.8.2167) отличается от версии корневого модуля 'core83' (8.3.9.2466)".
Обойти это можно, если создавать СОМ объект ВНЕ процесса клиента 1С:
1) Создать внепроцессное СОМ+ приложение(см. этой статье)
2) Использовать V83.Application - здесь создается отдельный процесс, в рамках которого comcntrl.dll и core83.dll будут одной версии.
50. trio-tlt 15.07.17 10:50 Сейчас в теме
Решил свою проблему "Версия компоненты 'comcntr' (8.3.8.2167) отличается от версии корневого модуля 'core83' (8.3.9.2466)"
Сделал отдельное СОМ+ приложение (см главу "Управление COM+ приложениями 1С") и все получилось.

Огромное спасибо!
51. identificator 18 16.07.17 19:41 Сейчас в теме
Не получается получить свойство Метаданные.Версия по COM-соединению V83.ComConnector
Возникает ошибка
52. b-dm 169 07.08.17 15:27 Сейчас в теме
Отличная статья,прекрасно объяснено!
53. agaraev 18.03.18 18:45 Сейчас в теме
Спасибо за статью! Очень помогло!
54. wowik 574 01.07.18 10:34 Сейчас в теме
в баннере мой заначек, я его сам когда-то рисовал) - https://infostart.ru/public/164976/
55. kholkin 54 10.06.19 11:08 Сейчас в теме
Подскажите, а есть какие-то статьи, публикации, дополнительные источники информации по "неизвестной ошибке". Как можно диагностировать точную причину ее возникновения, может быть как-то настроить ТЖ? У заказчика периодически возникают такие ошибки, но не можем понять в чем причина.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

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

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

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

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

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