1С comconnector

В этой статье я расскажу о многих особенностях взаимодействия между базами 1С по COM технологии, накопленных за годы развития и использования интеграционного коммерческого продукта 2iS:Интеграция нашей компании 2iS.

Термины

ОС — операционная система

COM-клиент — процесс(поток) ОС, запросивший создание COM-объекта

COM-сервер — COM-объект, созданный по запросу клиента

Com-соединитель — COM-объект V8X.ComСonnector для создания внешних соединений с базами 1С

Automation-сервер — он же OLE-сервер, COM-объект V8X.Application для создания приложений 1С

Издание платформы — подстрока до 2-й точки версии платформы (например 8.2, 8.3)

Сборка платформы — полная строка версии платформы (например 8.2.19.130, 8.2.16.352)

Подключение внешнего соединения

Рассмотрим алгоритм подключения внешнего соединения в деталях

  1. Создание COM-объекта Com-соединитель (Имя класса — V8X.ComConnector). Варианты:
  2. Внутрипроцессное (inproc)
  3. Должен быть зарегистрирован класс V8X.ComConnector той же разрядности, что и COM-клиент
  4. Если издание платформы COM-клиента совпадает с изданием платформы COM-сервера, то также требуется равенство сборки платформы COM-клиента и COM-сервера.
  5. Он регистрируется при установке платформы с опцией «Внешнее соединение». В любой момент его можно зарегистрировать командой «Regsvr32 comcntr.dll» в каталоге исполняемых файлов платформы.
  6. COM-объект создается в памяти COM-клиента
  7. Затраты на создание примерно — 0.01(первое)/0.001(второе) cек
  8. Пример
  9. Внепроцессное локальное (local)
  10. Должен быть зарегистрирован класс V8X.ComConnector любой разрядности и сборки платформы. Необходимо настроить через dcomcnfg.exe COM+ приложение с активацией «серверное приложение»/»Server apllication». Подробнее рассмотрено далее.
  11. COM-объект создается в памяти служебного хост-процесса (dllhost.exe) на компьютере COM-клиента
  12. Затраты на создание примерно — 0.06(первое)/0.03(второе) сек
  13. Пример
    КомСоединитель = Новый COMОбъект(«V83.ComConnector”);
    ВнешнееСоединение = КомСоединитель.Connect(СтрокаСоединения);
  14. Внепроцессное нелокальное (DCOM)
  15. На нелокальном компьютере должен быть зарегистрирован класс V8X.ComConnector любой разрядности и сборки платформы. Необходимо настроить на нелокальном компьютере через dcomcnfg.exe COM+ приложение с активацией «Cерверное приложение»/»Server apllication». Подробнее рассмотрено далее.
  16. Необходимо настроить на нелокальном компьютере роль «Сервер приложений»/»Application server» и включить нелокальный доступ COM+, выбрав опцию «Сетевой доступ к COM+»/”COM+ network access”. Подробнее рассмотрено далее.
  17. COM-объект создается в памяти служебного хост-процесса (dllhost.exe) на другом компьютере
  18. Затраты на создание примерно
  19. Экспериментальные данные

На графике видно, что длительность создания этого COM-объекта прямо пропорциональна задержке канала и коэффициент пропорциональности составляет примерно 24. Можно предположить, что при создании этого COM-объекта происходит 24 вызова через канал.

  1. Пример
    КомСоединитель = Новый COMОбъект(«V83.ComConnector”, ИмяКомпьютера);
    ВнешнееСоединение = КомСоединитель.Connect(СтрокаСоединения);
  2. Выполнение метода Connect (создание внешнего соединения)
  3. Создание сеанса — 1 сек
  4. Инициализация сеанса — сек
  5. ПередНачаломРаботыСистемы (только для Automation-сервера)
  6. ПриНачалеРаботыСистемы
  7. Инициализация параметров сеанса
  8. Подгрузка нужных метаданных

Затраты на COM-вызовы

Каждый раз, когда мы обращаемся во встроенном языке к свойству или методу COM-объекта (выполняем COM-вызов), происходит ряд дополнительных действий по сравнению с обращением к родному объекту встроенного языка. Если COM-сервер находится в другом локальном процессе, то при этом еще сначала выполняется перенос всех параметров из COM-клиента в COM-сервер и в конце выполняется обратный перенос параметров в COM-клиент. Для такого переноса информация естественно должна быть сериализована на стороне отправителя и затем десериализована на стороне получателя, что в совокупности с некоторыми другими действиями получило название маршалинга и демаршалинга. В нелокальном режиме (DCOM) такой перенос будет еще тратить время на сетевые коммуникации и при первом обращении к новому COM-объекту на передачу его «скелета», и поэтому задержка канала будет играть решающую роль (Подробнее о COM вызовах, DCOM в википедии, Технический обзор DCOM,)

Соотношение затрат на вызов по типам расположения COM-сервера

  1. Минимальные для внутрипроцессного Com-сервера
  2. Средние для локального внепроцессного Com-сервера
  3. От средних до больших для нелокального внепроцессного Cоm-сервера в зависимости от качества канала связи

Минимизация количества COM-вызовов

  1. Создаем базовую внешнюю обработку с набором общих методов для приема вызовов от COM-клиента на стороне COM-сервера
  2. Теперь нам не нужно изменять конфигурацию базы COM-сервера, чтобы использовать там сложный функционал.
  3. В нашем продукте мы назвали ее «Сервисный процессор». На ее передачу и инициализацию уходит около 1 сек
  4. Проектируем взаимодействие с COM-сервером по принципу «минимум COM-вызовов”, т.е. готовим все нужное на стороне COM-клиента и передаем в качестве параметров одного большого вызова»
  5. Создаем встроенную обработку для выполнения такого вызова в COM-клиенте
  6. Передача агрегатных объектов
  7. Сериализуем все входные параметры на стороне COM-клиента
  8. Десериализуем все входные параметры на стороне COM-сервера
  9. Сериализуем все выходные параметры на стороне COM-сервера
  10. Десериализуем все выходные параметры на стороне COM-клиента
  11. В нашем продукте мы назвали ее «Выполнение сервиса инфобазы»
  12. Для многократных COM-вызовов предусматриваем регулируемую частоту
  13. Например, информационные вызовы могут выполняться с изменяемой частотой

Обратная связь

При использовании принципа «минимум COM-вызовов» значительную часть времени код будет выполняться в чужом контексте, что серьезно усиливает некоторые неудобства COM-вызовов:

  1. Нельзя прервать поток COM-Клиента и его соединение с сервером приложений 1С, пока не завершится вызов COM-сервера
  2. У COM-Клиента нет информации о прогрессе выполнения вызова в COM-сервере

Для борьбы с этими неудобствами можно организовать обратную связь от COM-сервера к COM-клиенту, передав COM-Серверу ссылку на общий модуль COM-клиента и периодически вызывая через нее COM-клиент. Нужно отметить, что есть ошибки платформы (https://partners.v8.1c.ru/forum/t/1382465/m/1382465), проявляющиеся при создании ссылок на один общий модуль более чем в одном COM-севере сеанса. Поэтому пока лучше очищать ссылки на общий модуль во всех удерживаемых COM-серверах перед помещением в новый. В обратных вызовах можно передавать:

  1. информацию о прогрессе выполнения
  2. накопленные сообщения пользователю (получать функцией ПолучитьСообщенияПользователю(Истина))

Схема принципа «минимум COM-вызовов”

Такая схема дружественна к большим задержкам каналов связи. Поэтому она во многом похожа на вызов веб-сервиса. А следовательно используя ее для COM взаимодействия, вы значительно снижаете затраты на возможные переходы между COM и веб-сервисом в обоих направлениях.

Отладка

При использовании принципа «минимум COM-вызовов» облегчить отладку выполнения кода на COM-сервере можно, сделав опциональное модальное окно подключения к базе в COM-клиенте. В этом окне должны быть возможности задания одноразовых параметров подключения, выполнения вспомогательных функций и просмотра информации о подключенном сеансе. Ниже в качестве примера показано такое окно из нашего продукта

Чтобы включить возможность отладки внешних соединений, в подкаталоге conf нужно создать файл comcntrcfg.xml с соответствующим содержимым. В окне подключения можно сделать кнопку/флажок для программного создания такого файла. Однако много версий платформы содержат ошибку, из-за которой предметы отладки внешних соединений не видны в отладчике даже с этим корректно настроенным файлом. На платформе 8.3 эти проблемы вроде бы решены.

Пример файла comcntrcfg.xml:

Также нельзя забывать о необходимости запускать конфигуратор для отладки с той же (до регистра букв) строкой соединения, что и предмет отладки. Поэтому в этом диалоге нужно сделать кнопку для запуска конфигуратора COM-сервера с правильной строкой соединения.

В какой-то мере обойти проблему невидимости предмета отладки внешнего соединения и ряд других неудобств можно путем однократного выполнения кода на толстом клиенте с заменой режима «Внешнее соединение» на «Automation-сервер» (приложение), т.е. используя COM класс V8X.Application и включенную видимость. Поэтому в окне подключения нужны параметры для выбора режима подключения.

После создания подключения на стороне COM-клиента обычно требуется подключение отладчика базы COM-сервера и установка там точки останова в нужном месте. Поэтому в окне подключения нужно расположить кнопку подключения отладчика/конфигуратора COM-сервера. Если COM-сервер запущен в режиме видимого приложения, то для подключения отладчика можно воспользоваться асинхронным вызовом исключения в нем. Из диалога с ошибкой в приложении COM-сервера через кнопку «Конфигуратор» можно будет открыть конфигуратор и в большинстве случаев сразу подключить отладчик. Если подключение отладчика таким способом недоступно, то оператору поможет отображение информации о сеансе (его номера) в базе COM-сервера. Также нужна кнопка открытия в открытом отладчике файла внешней обработки, которая будет выполняться в нем.

Управление COM классами и COM+ приложениями 1С

  1. Внешнее соединение (V8X.ComConnector)
  2. Регистрация: Regsvr32 comcntr.dll
  3. Отмена регистрации: Regsvr32 comcntr.dll /u
  4. Automation-сервер (V8X.Application)
  5. Регистрация — 1cv8.exe /regserver
  6. Отмена регистрации — 1cv8.exe /unregserver

Управление COM+ приложениями

Осуществляется через оснастку dcomcnfg.exe. Для регистрации 1С в качестве COM+ приложения необходимо открыть оснастку «dcomcnfg». В ней в ветке «Службы компонентов»-«Компьютеры»-«Мой компьютер»-«Приложения COM+»(COM+ Applications) необходимо добавить новое приложение (application). При добавлении можно указать любое имя. Далее необходимо указать пользователя, от имени которого будет работать COM+ приложение, на закладке Идентификация (Identity). Также нужно задать доступ к приложению для всех пользователей путем добавления, если отсутствует, роли с любым именем в ветке Роли (Roles), и добавления в ее ветку Пользователи (Users) пользователя Все (Everyone). После добавления приложения необходимо создать новую компоненту. Для этого в ветке «Компоненты» созданного приложения необходимо выбрать пункт меню «Создать»-«Компонент». При создании выбрать импорт уже зарегистрированных компонентов и найдите в списке (желательно 64-битную) компоненту 1С (V8x.COMConnector.1).

В нашем продукте имеется инструмент «Управление COM классами 1С» для просмотра/регистрации/изменения всех COM классов и COM+ приложений 1С на указанном компьютере:

Настройка DCOM-сервера

Для Windows 2008 Server нужно добавить роль «Сервер приложений» (Application server). Для этого необходимо открыть панель управления компьютером, щелкнуть правой кнопкой мыши в ветки «Роли» и выбрать пункт меню «Добавить роль».

Появится око в котором необходимо выбрать роль «Сервер приложений»/»Application server». На этапе выбора ролей сервера приложений необходимо указать пункт «Сетевой доступ к COM+»/»COM+ network access». Если это не сделать, то при попытке создания COM-объекта вы будете получать ошибку «Ошибка при вызове конструктора (COMОбъект): The component or application containing the component has been disabled».

Проблемы

  1. Высокие затраты на подключение/инициализацию
  2. Удержание com-серверов — эффективное средство борьбы
  3. Временное хранилище. Производитель не рекомендует, но деваться больше некуда. http://infostart.ru/public/331683/
  4. Повторное использование возвращаемых значений. Очищаются каждые 20 мин
  5. Разные сборки платформы клиента и сервера при одинаковом издании платформы
  6. Для обхода для каждой отличной от COM-клиента сборки платформы назначаем и настраиваем DCOM сервер
  7. Отсутствие информации о типах вложенных в COM-объекты объектов 1С (вместо типа объекта 1С везде получаем тип «COMОбъект») и отсутствие контекстной подсказки по ним
  8. Для обхода применяем принцип «минимум COM-вызовов»
  9. При передаче исключения из COM-сервера оно принимает краткую форму из-за ошибки платформы
  10. Для обхода оборачиваем каждый вызов на стороне COM-сервера в попытку и в исключении перевызываем исключение с полным описанием ошибки
  11. При создании COM-объекта ошибка «Версия компоненты «comcntr» (8.X.XX.XXX) отличается от версии корневого модуля «core82» (8.X.YY.YYY)”
  12. Для обхода создаем COM+ приложение с внепроцессной активацией. Тогда COM-сервер будет создаваться в отдельном процессе и совпадения версий этих модулей не потребуется.
  13. Медленные каналы (большие задержки)
  14. Каждой подсети за отдельным медленным каналом назначаем и настраиваем свой DCOM сервер и при обращении к базам за этим каналом COM-серверы создаем на этом компьютере, минимизируя количество и объемы вызовов Com-клиентCom-сервер
  15. Кешируем (повторно используем) COM-серверы
  16. Невозможно разорвать соединение рабочего процесса, в котором ожидается завершение вызова COM-сервера
  17. Для обхода можно использовать создание COM-объектов в выделенных хост-процессах, настроив соответствующим образом COM+ приложение, и регистрировать идентификаторы этих процессов в привязке к сеансам COM-клиентов. Тогда при необходимости завершить серверное соединение такого сеанса можно сначала убить процесс COM-сервера, а потом и сам сеанс.
  18. При обращении к COM-объекту может возникать ошибка «Неизвестная ошибка». Возможные причины:
  19. Com-сервер перестал существовать. Возможные причины:
  20. Переполнение стека
  21. Невосстановимая ошибка
  22. Хост-процесс завершился
  23. Потеря связи с нелокальным COM-сервером
  24. Совпадение имен свойств и методов без параметров объекта создает неоднозначность обращения к ним через COM
  25. Например, если у справочника есть реквизит ПолноеНаименование, то из-за наличия метода ПолноеНаименование() обращение к реквизиту ПолноеНаименование через COM может привести к вызову метода ПолноеНаименование()
  26. Для обхода используем принцип «минимум COM-вызовов”

Com-технология VS веб-сервисы в локальной сети

  1. Рассмотренные выше сложности с взаимодействием разных сборок платформы 1C, требующие для своего решения сервисный механизм
  2. Высокие затраты на подключение/инициализацию, поэтому при отсутствии кеширования неэффективно для частых мелких вызовов
  3. Привязка к семейству операционных систем (платформе) Windows

Преимущества

  1. Отсутствие необходимости изменять конфигурацию баз, к которым подключаемся
  2. Широкая функциональность
  3. Проще отладка
  4. Не требуется разворачивать и поддерживать веб-сервер

Захват клиентских лицензий

В большинстве случаев всем клиентским приложениям, частным случаем которого являются Automation-сервер и с оговорками является внешнее соединение, в одном сеансе ОС требуется всего лишь одна на всех лицензия. Однако если клиентскому приложению не удалось получить аппаратную лицензию (от локального HASP или сетевого HASP) и программную лицензию (платформы или базовой конфигурации), то предпринимается попытка получить отдельную лицензию с сервера 1С:Предприятия. Сервер 1С:Предприятия может выдать лицензию только, если в свойствах базы разрешена выдача лицензий сервером 1С:Предприятия. В таком случае каждое клиентское приложение и внешнее соединение может захватывать свою собственную лицензию. Если вы хотите подробнее узнать об описанных особенностях, вы можете бесплатно скачать конфигурацию и демонстрационную базу продукта, для чего необходимо оформить предварительный заказ на Инфостарте на продукт 2iS:Интеграция. Несмотря на наличие в конфигурации защищенного модуля, 99% программного кода конфигурации открыто, то есть Вы можете изучить реализацию описанных приемов.

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

Пример работы через COM-соединение мы рассматривали в одной из предыдущих статей . Сегодня рассмотрим действия в системе, необходимые для использования COM-компоненты.

Регистрация в системе

После установки платформы на комьютер COM-компонент должен быть установле автоматически установщиком. Файл внешней компоненты располагается в каталоге:

C:\Program Files\1cv82\\bin\comcntr.dll

Таким образом, при установке новке новой версии платформы компонент будет установлен новый и находится в соответствующей директории. Для использования COM-компоненты она должна быть зарегистрирована в операционной системе.

Бывают ситуации, когда программа установки не может автоматически зарегистрировать DLL в операционной системе, поэтому это приходится делать вручную. Также при установке новой версии платформы поверх уже установленной может понадобиться зарегистрировать comcntrl.dll из каталога установленной версии.

Выполнить действия вручную можно с помощью командой строки, запущенной от имени администратора, следующим образом:

regsvr32 comcntrl.dll

запущенной в вышеуказанном каталоге.

Часто бывает нужно получить данные из разных баз, которые, что вовсе не редкость работают на разных платформах. Это может быть и регулярный обмен данными между базами. Также могут быть какие-то разовые обработки по переносу данных. Это могут быть и отчеты, собирающие данные из разных баз и формирующие требуемый итог на выходе.

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

Ситуация первая. При попытке подключения через COM -соединение к базе-источнику выдается сообщение об ошибке. Что-то вроде: «Ошибка при вызове конструктора (COMObject): -2147221164(0x80040154): Класс не зарегистрирован «.
Для устранения подобной ошибки перво-наперво нужно зарегистрировать библиотеку клиента — приемника. Причем для разных версий клиентов одной версии платформы нужно регистрировать свою библиотеку. То есть для разных сборок платформы версии 8.3 нужно заново регистрировать версию библиотеки нужного релиза платформы. Для платформы версии 8.2 такой же подход.
Библиотека регистрируется следующим образом. Запускается Командная строка из-под Администратора, в ней пишется команда

Regsvr32 «\bin\comcntr.dll ,

Например, regsvr32 «c:\Program Files (x86)\1cv8\8.3.5.1119\bin\comcntr.dll» и команда выполняется. Все открытые приложения 1С при этом лучше закрыть. При успешной регистрации будет выдано сообщение об успехе. Если выдается сообщение об ошибке, то нужно проверить путь, по которому находится библиотека, и все права.
Также эту команду можно поместить в cmd- файл и запустить его с правами Администратора.

Если такая ошибка выпадает при попытке подключить к БД на платформе 7.7, то следует проверить реестр на предмет наличия регистрации 7.7-коннектора. В разделе HKEY_CLASSES_ROOT должны присутствовать ветки, изображенные на картинке:

Для правильной регистрации 7.7-коннектора следует один раз запустить 1С Предприятие 7.7 от имени Администратора.

Ситуация вторая. При попытке установить COM -соединение выпадает ошибка с сообщением о несоответствии версии клиента БД-источника. В этом случае проблема решается регистрацией правильной версии библиотеки comcntr.dllтак, как это было описано выше.

Ситуация третья. При попытке подключения через COM -соединение к базе-источнику на платформе 1С 7.7 ошибок не выдается, но обработка «намертво» «зависает». При снятии задачи соединение через консоль управления серверами 8.х остается и не сбрасывается никакими ухищрениями, кроме перезапуска службы сервера 1С. Такое явление происходит, когда осуществляется попытка соединения из БД на платформе 8.х к БД на платформе 7.7 из сеанса сервера. Четко определенных причин такого поведения программы здесь не приводится. Рекомендация одна — использовать вызов подключения из сеанса клиента (& НаКлиенте).

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

1. Заходим в Панель управления → Администрирование → Службы компонентов.
2. Переходим к ветке Компьютеры → Мой компьютер → Приложения COM+.

3. В контекстном меню выбираем Создать → Приложение. Откроется Мастер установки приложений COM+. Выбираем «Создать новое приложение».

4. Имя нового приложения лучше написать чтобы было понятно о чем речь: V8_ComConnector, способ активации — «серверное приложение».

5. На следующем шаге устанавливаем «Текущий пользователь». Нажимаем «Далее».В ветке созданного приложения переходим на ветку «Роли» открываем роль «CreatorOwner» и далее в разделе «Пользователи» создаем пользователя — учетную запись под которой работает сервер 1С.
6. В ветке созданного приложения переходим на ветку «Компоненты» и создаем компонент: Создать — Компонент Выбираем «Установка новых компонентов», и в диалоге выбираем нужную DLL-ку (в данном примере: \bin\comcntr.dll).
7. В контекстном меню выбираем «Свойства». В открывшемся окне переходим на вкладку «Безопасность».
8. Снимаем галку «Принудительная проверка доступа для приложений». Ставим галку «Применить политику программных ограничений». Устанавливаем Уровень ограничений — «Неограниченный»


9. Нажимаем «ОК».

Как в Windows x32(x86)/x64 зарегистрировать компоненту com-соединения comcntr.dll 1С 8.

Ответ на данный вопрос актуален в контексте натройки обменов между базами 1С с помощью прямого подключения. Один из вариантов установки/регистрации компоненты com-соединения приведен на странице: На ней описан вариант установки компоненты при установке/переустановке компонентов платформы 1С: Предприятие из стандартного пакета установки. Но случается и так, что все-таки com-компонента по каким-то таинственным пирчинам все же не регистрируется при вышеуказанной операции.

На это есть альтернативный вариант с помощью командной строки операционной системы. Забегая немного вперед, и чтобы обезопасить себя от ошибок при регистрации com-компоненты comcntr.dll через командную строку, подобных приведенной на скрине

Чтобы избежать ошибки «Модуль comcntr.dll загружен, но не удалось выполнить вызов DllRegisterServer, код ошибки 0x80070005» запускайте командную строку с правами администратора

В системе с разрядностью x32(x86) для платформы 1С: Предприятие 8.2

C:\Program Files (x86)\1cv82\\bin> regsvr32 comcntr.dll

Где — номер текущего используемого релиза плафтормы 1С 8.

Для платформы 1С: Предприятие 8.3 командная строка для регистрации com-компоненты будет выглядеть примерно так:

C:\Program Files (x86)\1cv8\\bin> regsvr32 comcntr.dll

На скрине, приведенном ниже в качестве пирмере для случая регистрация comcntr.dll в ОС x86 значение — «8.3.9.1818»

Теперь рассмотрим вариант для системы с разрядностью x64 для платформы 1С: Предприятие 8.2, альтернативный вариант:

C:\Windows\SysWOW64>regsvr32 «C:\Program Files (x86)\1cv82\\bin\comcntr.dll»

Для Windows x64 регистирация com-соединения 1С 8.3 может выглдяеть так:

C:\Windows\SysWOW64>regsvr32 «C:\Program Files (x86)\1cv8\\bin\comcntr.dll»

Если все-таки приведенный материал не помог, предлагается обратиться к альтернативным публикациям: Регистрация comcntr.dll-компоненты в 64-битной версии Microsoft Windows и Регистрация компоненты comcntr.dll для COM соединения с 1С 8 в 32-битной операционной системе

© www.. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.

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

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

Upd . Дополнение: если на Windows-сервере 64-бит стоит Сервер 1С Предприятие 64-бит (в дистрибутиве windows64.rar),
то такой проблемы не будет. Уставщик позволяет поставить COM-коннектор без установки самого севера. Это полезно, когда приложение реализовано на платформе 8.3, а COM-соединение нужно к базам на 8.2.

За дополнение спасибо brix8x .

Приведен алгоритм настройки системы, со скрином к каждому действию.

2. Регистрация компоненты comcntr.dll

5. Старт сервера 1С. (обязательно:)

Вызываем консоль

Регистрируем компоненту. Компонента отсутствует, если установлен только сервер 1С. Почему-то 1С публикует ее только в составе клиента.

За дополнение спасибо shur52 .

Запускаем службу компонентов. Описывается для Windows Server 2008 R2 Standart.

В ветке Components добавляем новую компоненту comcntr.dll

ВАЖНО!!! После установки нужно немного изменить свойства. Эта тонкость нигде не описана, без нее у меня не работало!

Перезапуск физического сервера

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

Для подключения и работы с ком соединением рекомендуется объявить переменную к которой будет подствлено значение соединение и проверять на данное подключение в каждой процедуре, ниже приведен текст процедуры/функции и способы подключения в конфигурациях

СтруктураПодключения — эта переменная в которой имеется Строка соединения с СОМ объектом

Перем Коннект; Процедура ПолучитьИмяКонфигурацииИсточника() Если Коннект = Неопределено Тогда Если Не ПодключитьИБ() Тогда Сообщить(«Не удалось установить подключение к ИБ!!!»); Возврат ; КонецЕсли; КонецЕсли; Если Коннект.Метаданные.DetailedInformation = «Бухгалтерия предприятия, редакция 2.0» ИЛИ Коннект.Метаданные.DetailedInformation = «1С:Учет в управляющих компаниях ЖКХ, ТСЖ и ЖСК» ИЛИ Коннект.Метаданные.DetailedInformation = «Бухгалтерия строительной организации, редакция 2.0» ТОгда ИмяКонфигурацииИсточника = «БП20»; ИначеЕсли Коннект.Метаданные.DetailedInformation = «Комплексная автоматизация, редакция 1.1» ТОгда ИмяКонфигурацииИсточника = «КА11»; Иначе ИмяКонфигурацииИсточника = «БП30»; КонецЕсли; КонецПроцедуры Функция ПодключитьИБ(СтруктураПодключения = Неопределено) Экспорт //Открыта = Ложь; Если Не СтруктураПодключения = Неопределено Тогда СтруктураНастроек = СтруктураПодключения; Иначе СтруктураНастроек = Новый Структура(«COMАутентификацияОперационнойСистемы,COMВариантРаботыИнформационнойБазы,COMИмяИнформационнойБазыНаСервере1СПредприятия,COMИмяПользователя,COMИмяСервера1СПредприятия,COMКаталогИнформационнойБазы,COMПарольПользователя»,COMАутентификацияОперационнойСистемы,COMВариантРаботыИнформационнойБазы,COMИмяИнформационнойБазыНаСервере1СПредприятия,COMИмяПользователя,COMИмяСервера1СПредприятия,COMКаталогИнформационнойБазы,COMПарольПользователя); КонецЕсли; Результат = УстановитьВнешнееСоединениеСБазойCOM(ЗаполнитьПараметрыПодключенияВнешнегоСоединения(СтруктураНастроек)); Коннект = Результат.Соединение; Если Коннект = Неопределено Тогда // Ошибка установки соединения. Сообщить(«» + Результат.КраткоеОписаниеОшибки + «. » + Результат.ПодробноеОписаниеОшибки); Возврат Ложь; Иначе Если Не ЗначениеЗаполнено(ИмяКонфигурацииИсточника) Тогда ПолучитьИмяКонфигурацииИсточника(); КонецЕсли; Возврат Истина; КонецЕсли; //Возврат Открыта; КонецФункции // Возвращает шаблон структуры параметров для установки внешнего соединения. // Параметрам необходимо задать требуемые значения и передать. // В метод ОбщегоНазначения.УстановитьВнешнееСоединение(). // Функция СтруктураПараметровДляУстановкиВнешнегоСоединения() Экспорт СтруктураПараметров = Новый Структура; СтруктураПараметров.Вставить(«ВариантРаботыИнформационнойБазы», 0); СтруктураПараметров.Вставить(«КаталогИнформационнойБазы», «»); СтруктураПараметров.Вставить(«ИмяСервера1СПредприятия», «»); СтруктураПараметров.Вставить(«ИмяИнформационнойБазыНаСервере1СПредприятия», «»); СтруктураПараметров.Вставить(«АутентификацияОперационнойСистемы», Ложь); СтруктураПараметров.Вставить(«ИмяПользователя», «»); СтруктураПараметров.Вставить(«ПарольПользователя», «»); Возврат СтруктураПараметров; КонецФункции Функция ЗаполнитьПараметрыПодключенияВнешнегоСоединения(НастройкиТранспорта) ПараметрыПодключения = СтруктураПараметровДляУстановкиВнешнегоСоединения(); ПараметрыПодключения.ВариантРаботыИнформационнойБазы = НастройкиТранспорта.COMВариантРаботыИнформационнойБазы; ПараметрыПодключения.КаталогИнформационнойБазы = НастройкиТранспорта.COMКаталогИнформационнойБазы; ПараметрыПодключения.ИмяСервера1СПредприятия = НастройкиТранспорта.COMИмяСервера1СПредприятия; ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия = НастройкиТранспорта.COMИмяИнформационнойБазыНаСервере1СПредприятия; ПараметрыПодключения.АутентификацияОперационнойСистемы = НастройкиТранспорта.COMАутентификацияОперационнойСистемы; ПараметрыПодключения.ИмяПользователя = НастройкиТранспорта.COMИмяПользователя; ПараметрыПодключения.ПарольПользователя = НастройкиТранспорта.COMПарольПользователя; Возврат ПараметрыПодключения; КонецФункции Функция ИмяCOMСоединителя() Если ПодключенияВариант = Неопределено ТОгда Какая8 = СтрЗаменить(COMПодключенияВариант, «.», «»); Иначе Какая8 = СтрЗаменить(ПодключенияВариант, «.», «»); КонецЕсли; Возврат «v» + Какая8 + «.COMConnector»; КонецФункции // Устанавливает внешнее соединение с информационной базой по переданным параметрам подключения и возвращает указатель // на это соединение. // // Параметры: // Параметры — Структура — параметры для установки внешнего соединения с информационной базой. // Свойства см. в функции // ОбщегоНазначенияКлиентСервер.СтруктураПараметровДляУстановкиВнешнегоСоединения): // // * ВариантРаботыИнформационнойБазы — Число — Вариант работы информационной базы: 0 — файловый; 1 — // клиент-серверный; // * КаталогИнформационнойБазы — Строка — Каталог информационной базы для файлового режима работы; // * ИмяСервера1СПредприятия — Строка — Имя сервера1С:Предприятия; // * ИмяИнформационнойБазыНаСервере1СПредприятия — Строка — Имя информационной базы на сервере1С:Предприятия; // * АутентификацияОперационнойСистемы — Булево — Признак аутентификации операционной системы при создании // внешнего подключения к информационной базе; // * ИмяПользователя — Строка — Имя пользователя информационной базы; // * ПарольПользователя — Строка — Пароль пользователя информационной базы. // // Возвращаемое значение: // Структура — // * Соединение — COMОбъект, Неопределено — указатель на COM-объект соединения или Неопределено в // случае ошибки; // * КраткоеОписаниеОшибки — Строка — краткое описание ошибки; // * ПодробноеОписаниеОшибки — Строка — подробное описание ошибки; // * ОшибкаПодключенияКомпоненты — Булево — флаг ошибки подключения COM. // Функция УстановитьВнешнееСоединениеСБазойCOM(Параметры) Экспорт Результат = Новый Структура; Результат.Вставить(«Соединение»); Результат.Вставить(«КраткоеОписаниеОшибки», «»); Результат.Вставить(«ПодробноеОписаниеОшибки», «»); Результат.Вставить(«ОшибкаПодключенияКомпоненты», Ложь); #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда ЭтоLinux = ОбщегоНазначения.ЭтоLinuxСервер(); КраткоеОписаниеОшибки = НСтр(«ru = ‘Прямое подключение к информационной базе недоступно на сервере под управлением ОС Linux.'»); #Иначе ЭтоLinux = ЭтоLinuxКлиент(); КраткоеОписаниеОшибки = НСтр(«ru = ‘Прямое подключение к информационной базе недоступно на клиенте под управлением ОС Linux.'»); #КонецЕсли Если ЭтоLinux Тогда Результат.Соединение = Неопределено; Результат.КраткоеОписаниеОшибки = КраткоеОписаниеОшибки; Результат.ПодробноеОписаниеОшибки = КраткоеОписаниеОшибки; Возврат Результат; КонецЕсли; Попытка COMConnector = Новый COMObject(ИмяCOMСоединителя()); // «V83.COMConnector» Исключение Информация = ИнформацияОбОшибке(); СтрокаСообщенияОбОшибке = НСтр(«ru = ‘Не удалось подключится к другой программе: %1′»); Результат.ОшибкаПодключенияКомпоненты = Истина; Результат.ПодробноеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ПодробноеПредставлениеОшибки(Информация)); Результат.КраткоеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, КраткоеПредставлениеОшибки(Информация)); Возврат Результат; КонецПопытки; ФайловыйВариантРаботы = Параметры.ВариантРаботыИнформационнойБазы = 0; // Проверка корректности указания параметров. ОшибкаПроверкиЗаполнения = Ложь; Если ФайловыйВариантРаботы Тогда Если ПустаяСтрока(Параметры.КаталогИнформационнойБазы) Тогда СтрокаСообщенияОбОшибке = НСтр(«ru = ‘Не задано месторасположение каталога информационной базы.'»); ОшибкаПроверкиЗаполнения = Истина; КонецЕсли; Иначе Если ПустаяСтрока(Параметры.ИмяСервера1СПредприятия) Или ПустаяСтрока(Параметры.ИмяИнформационнойБазыНаСервере1СПредприятия) Тогда СтрокаСообщенияОбОшибке = НСтр(«ru = ‘Не заданы обязательные параметры подключения: «»Имя сервера»»; «»Имя информационной базы на сервере»».'»); ОшибкаПроверкиЗаполнения = Истина; КонецЕсли; КонецЕсли; Если ОшибкаПроверкиЗаполнения Тогда Результат.ПодробноеОписаниеОшибки = СтрокаСообщенияОбОшибке; Результат.КраткоеОписаниеОшибки = СтрокаСообщенияОбОшибке; Возврат Результат; КонецЕсли; // Формирование строки соединения. ШаблонСтрокиСоединения = «»; Если ФайловыйВариантРаботы Тогда СтрокаБазы = «File = «»&КаталогИнформационнойБазы»»»; СтрокаБазы = СтрЗаменить(СтрокаБазы, «&КаталогИнформационнойБазы», Параметры.КаталогИнформационнойБазы); Иначе СтрокаБазы = «Srvr = «»&ИмяСервера1СПредприятия»»; Ref = «»&ИмяИнформационнойБазыНаСервере1СПредприятия»»»; СтрокаБазы = СтрЗаменить(СтрокаБазы, «&ИмяСервера1СПредприятия», Параметры.ИмяСервера1СПредприятия); СтрокаБазы = СтрЗаменить(СтрокаБазы, «&ИмяИнформационнойБазыНаСервере1СПредприятия», Параметры.ИмяИнформационнойБазыНаСервере1СПредприятия); КонецЕсли; Если Параметры.АутентификацияОперационнойСистемы Тогда СтрокаАутентификации = «»; Иначе Если СтрНайти(Параметры.ИмяПользователя, «»»») Тогда Параметры.ИмяПользователя = СтрЗаменить(Параметры.ИмяПользователя, «»»», «»»»»»); КонецЕсли; Если СтрНайти(Параметры.ПарольПользователя, «»»») Тогда Параметры.ПарольПользователя = СтрЗаменить(Параметры.ПарольПользователя, «»»», «»»»»»); КонецЕсли; СтрокаАутентификации = «; Usr = «»&ИмяПользователя»»; Pwd = «»&ПарольПользователя»»»; СтрокаАутентификации = СтрЗаменить(СтрокаАутентификации, «&ИмяПользователя», Параметры.ИмяПользователя); СтрокаАутентификации = СтрЗаменить(СтрокаАутентификации, «&ПарольПользователя», Параметры.ПарольПользователя); КонецЕсли; СтрокаСоединения = СтрЗаменить(ШаблонСтрокиСоединения, «», СтрокаБазы); СтрокаСоединения = СтрЗаменить(СтрокаСоединения, «», СтрокаАутентификации); Попытка Результат.Соединение = COMConnector.Connect(СтрокаСоединения); Исключение Информация = ИнформацияОбОшибке(); СтрокаСообщенияОбОшибке = НСтр(«ru = ‘Не удалось подключиться к другой программе: %1′»); Результат.ОшибкаПодключенияКомпоненты = Истина; Результат.ПодробноеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ПодробноеПредставлениеОшибки(Информация)); Результат.КраткоеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, КраткоеПредставлениеОшибки(Информация)); КонецПопытки; Возврат Результат; КонецФункции // Основная функция для использования внешнего соединения при обмене. // // Параметры: // СтруктураНастроек — структура настроек транспорта COM обмена. // Функция УстановитьВнешнееСоединениеСБазой(СтруктураНастроек) Экспорт Результат = УстановитьВнешнееСоединениеСБазойCOM(ЗаполнитьПараметрыПодключенияВнешнегоСоединения(СтруктураНастроек)); ВнешнееСоединение = Результат.Соединение; Если ВнешнееСоединение = Неопределено Тогда // Ошибка установки соединения. Возврат Результат; КонецЕсли; // Дополнительно проверяем возможность работы с внешней базой. Попытка НетПолныхПрав = Не ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.РольДоступнаПолныеПрава(); Исключение НетПолныхПрав = Истина; КонецПопытки; Если НетПолныхПрав Тогда Результат.ПодробноеОписаниеОшибки = НСтр(«ru = ‘Пользователю, указанному для подключения к другой программе, должны быть назначены роли «»Администратор системы»» и «»Полные права»»‘»); Результат.КраткоеОписаниеОшибки = Результат.ПодробноеОписаниеОшибки; Результат.Соединение = Неопределено; Иначе Попытка СостояниеНеДопустимо = ВнешнееСоединение.ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы(); Исключение СостояниеНеДопустимо = Ложь КонецПопытки; Если СостояниеНеДопустимо Тогда Результат.ПодробноеОписаниеОшибки = НСтр(«ru = ‘Другая программа находится в состоянии обновления.'»); Результат.КраткоеОписаниеОшибки = Результат.ПодробноеОписаниеОшибки; Результат.Соединение = Неопределено; КонецЕсли; КонецЕсли; Возврат Результат; КонецФункции

Часто возникает необходимость проверка наличия реквизита или свойства объекта, при этом понятия не имееш есть данный реквизит или нет

но использование Попытки .. Исключение .. КонецПопытки не желательно то в даном варианте можно использовать подстановку реквизита в структуру

и тем самым использовать следующую процедуру:

// Проверяет наличие реквизита или свойства у произвольного объекта без обращения к метаданным. // // Параметры: // Объект — Произвольный — объект, у которого нужно проверить наличие реквизита или свойства; // ИмяРеквизита — Строка — имя реквизита или свойства. // // Возвращаемое значение: // Булево. // Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт КлючУникальности = Новый УникальныйИдентификатор; СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности); ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект); Возврат СтруктураРеквизита <> КлючУникальности; КонецФункции

Теперь вопрос который многих интересует: «Мы получили СОМ объект тоесть ТИП(«СомОбъект»), какое значение и что с ним делать?

для этого приходят метаданные и мы можем получить любую информацию используя метаданные не только текущей конфигурации, но и конфигурации источника к примеру РеквCOM это реквизит который мы должны изучить:

_СтрокаXML = Коннект.XMLString(РеквCOM); // УникальныйИдентификатор объекта

УИД объекта имеет определенный формат даных поэтому для выяснения что мы имеем то необходимо доп проверка

т.к. _СтрокаXML имеет формат «00000000-0000-0000-0000-000000000000» то актуальна проверка

Если СтрНайти(_СтрокаXML, «-«, , , 4) = 24 Тогда //Всего скорее это ГУИД //*********** ИначеЕсли СтрДлина(_СтрокаXML) = 48 Тогда //Хранилище значения //************ Иначе //Перечисление //************ КонецЕсли;

Рассмотрим что можно получить от объекта если по нему есть УИД

_ПолныйТипОбъекта = РеквCOM.GetObject().Metadata().FullName(); СтрокиТипа = СтрЗаменить(_ПолныйТипОбъекта, «.», Символы.ПС); _ТипОбъекта = СтрПолучитьСтроку(СтрокиТипа, 1); _ИдентификаторCOM = СтрПолучитьСтроку(СтрокиТипа, 2); //Для получения менеджера объекта нужно воспользоваться доп процедурой _МенеджерОбъекта = ПолучитьМенеджерОбъекта(_ИдентификаторCOM); Функция ПолучитьМенеджерОбъекта(СсылкаОб) Экспорт Если ТипЗнч(СсылкаОб) = Тип(«Строка») Тогда СсылкаПоиска = _ПолучитьПустуюСсылкуПоИдентификаторуОбъекта(СсылкаОб); Иначе СсылкаПоиска = СсылкаОб; КонецЕсли; //Попытка Если СсылкаПоиска <> Неопределено Тогда ИмяОбъекта = СсылкаПоиска.Метаданные().Имя; Иначе Возврат Неопределено; КонецЕсли; //Исключение // Возврат Неопределено; //КонецПопытки; ТипСсылки = ТипЗнч(СсылкаПоиска); Если Справочники.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда Возврат Справочники; ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда Возврат Документы; ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда Возврат БизнесПроцессы; ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда Возврат ПланыВидовХарактеристик; ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда Возврат ПланыСчетов; ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда Возврат ПланыВидовРасчета; ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда Возврат Задачи; ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда Возврат ПланыОбмена; ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда Возврат Перечисления; Иначе Возврат Неопределено; КонецЕсли; КонецФункции Функция _ПолучитьПустуюСсылкуПоИдентификаторуОбъекта(ОбъектМетаданных) Экспорт ТипМД = _ПолучитьТипПоИдентификатору(ОбъектМетаданных); ПустаяСсылка = «»; Если ТипМД = «Справочник» Тогда Команда1С = «ПустаяСсылка = Справочники.»+ОбъектМетаданных+».ПустаяСсылка()»; ИначеЕсли ТипМД = «Документ» Тогда Команда1С = «ПустаяСсылка = Документы.»+ОбъектМетаданных+».ПустаяСсылка()»; ИначеЕсли ТипМД = «Перечисление» Тогда Команда1С = «ПустаяСсылка = Перечисления.»+ОбъектМетаданных+».ПустаяСсылка()»; ИначеЕсли ТипМД = «ПланВидовРасчета» Тогда Команда1С = «ПустаяСсылка = ПланыВидовРасчета.»+ОбъектМетаданных+».ПустаяСсылка()»; Иначе Возврат Неопределено; КонецЕсли; Выполнить (Команда1С); Возврат ПустаяСсылка; КонецФункции

Имея данные объекта мы можем использовать их в конфигурациях переноса создав процедуру сопоставления объектов, здесь можно будет уже

развернуться как Вам больше нравится

В случае если наш объект является ХранилищеЗначений то для переноса данного объекта либо получение значения можно воспользоваться функцией

//***************************** //рабочая процедура и в ней код обработки ИначеЕсли _ТипОбъекта = «ХранилищеЗначения» Тогда Возврат ПереносХранилища(РеквCOM); //***************************** Функция ПереносХранилища(РеквCOM) Попытка ДвоичныеДанные = РеквCOM.Get(); Исключение Возврат Неопределено; Конецпопытки; Если «» + ДвоичныеДанные = «COMОбъект» Тогда Попытка ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); ДвоичныеДанные.Write(ИмяВременногоФайла); ДвоичныеДанныеВозврат = Новый ДвоичныеДанные(ИмяВременногоФайла); УдалитьФайлы(ИмяВременногоФайла); Возврат Новый ХранилищеЗначения(ДвоичныеДанныеВозврат); Исключение Возврат Неопределено; КонецПопытки; Иначе Возврат Неопределено; КонецЕсли; КонецФункции

Если объект является перечислением то вместо УИД кода будет выведено наименование перечисления

Также для получения списка реквизитов объекта СОМ используется обращение

РеквCOM.Metadata().Attributes // Список реквизитов РеквCOM.Metadata().Attributes.Find(«Реквизит») // Поиск реквизита в объекте // если реквизит не найден возвращает значение НЕОПРЕДЕЛЕНО РеквCOM.Metadata().StandardAttributes // Список стандартных реквизитов РеквCOM.Metadata().TabularSections // Список табличных частей

Для работы с удаленой базой через COM соединение также часто возникает необходимость получения функциональных опций объекта

для этих целей можно использовать функцию которая выведет список соответствий функциональных опций

// Доступность объектов метаданных по функциональным опциям. Функция ДоступностьОбъектовПоОпциямCOM() Экспорт Если Коннект = Неопределено Тогда Если Не ПодключитьИБ() Тогда Сообщить(«Не удалось установить подключение к ИБ!!!»); Возврат Новый Соответствие КонецЕсли; КонецЕсли; Параметры = Новый Структура; ДоступностьОбъектов = Новый Соответствие; Для Каждого ФункциональнаяОпция Из Коннект.Метаданные.ФункциональныеОпции Цикл Значение = -1; Для Каждого Элемент Из ФункциональнаяОпция.Состав Цикл Если Значение = -1 Тогда Значение = ПолучитьФункциональнуюОпцию(ФункциональнаяОпция.Имя, Параметры); КонецЕсли; Если Значение = Истина Тогда ДоступностьОбъектов.Вставить(Элемент.Объект, Истина); Иначе Если ДоступностьОбъектов = Неопределено Тогда ДоступностьОбъектов.Вставить(Элемент.Объект, Ложь); КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; Возврат ДоступностьОбъектов; КонецФункции //Рабочая процедура Функция ОбъектМетаданныхДоступенПоФункциональнымОпциямCOM(ОбъектМетаданныхCOM) Экспорт Возврат ДоступностьОбъектовПоОпциямCOM() <> Ложь; КонецФункции

Так же при работе с переносом документов возникает необходимость определения списка регистров движения данного документа

МетаданныеДокументаCOM = ДокCom.MetaData(); Регистры = ЗаполнитьТаблицуРегистровCOM(МетаданныеДокументаCOM); УстановитьПривилегированныйРежим(Истина); РегистрыСДвижениями = ПолучитьМассивИспользуемыхРегистровCOM(ДокCom, МетаданныеДокументаCOM.Движения); Функция ЗаполнитьТаблицуРегистровCOM(МетаданныеДокументаCOM) Если Коннект = Неопределено Тогда Если Не ПодключитьИБ() Тогда Сообщить(«Не удалось установить подключение к ИБ!!!»); Возврат Новый ТаблицаЗначений КонецЕсли; КонецЕсли; МетаданныеРегистровНакопленияCOM = Коннект.Metadata.РегистрыНакопления; МетаданныеРегистровСведенийCOM = Коннект.Metadata.РегистрыСведений; ВидРегистраОстаткиCOM = Коннект.Metadata.СвойстваОбъектов.ВидРегистраНакопления.Остатки; Регистры = Новый ТаблицаЗначений; Регистры.Колонки.Добавить(«ТипРегистра», ОбщегоНазначения.ОписаниеТипаСтрока(20)); Регистры.Колонки.Добавить(«Имя», ОбщегоНазначения.ОписаниеТипаСтрока(100)); Регистры.Колонки.Добавить(«Синоним», ОбщегоНазначения.ОписаниеТипаСтрока(100)); Регистры.Колонки.Добавить(«ЕстьДвижения», Новый ОписаниеТипов(«Булево»)); Регистры.Колонки.Добавить(«РегистрОстатков», Новый ОписаниеТипов(«Булево»)); Регистры.Колонки.Добавить(«Записывать», Новый ОписаниеТипов(«Булево»)); Для каждого МетаданныеРегистраCOM Из МетаданныеДокументаCOM.Движения Цикл Если Лев(МетаданныеРегистраCOM.Имя, 7) = «Удалить» Тогда Продолжить КонецЕсли; //Если Не ОбъектМетаданныхДоступенПоФункциональнымОпциямCOM(МетаданныеРегистраCOM) Тогда // Продолжить; //КонецЕсли; СтрокаРегистра = Регистры.Добавить(); СтрокаРегистра.Имя = МетаданныеРегистраCOM.Имя; ПолноеИмя = МетаданныеРегистраCOM.ПолноеИмя(); ПозицияТочки = Найти(ПолноеИмя, «.»); ТипРегистра = Лев(ПолноеИмя, ПозицияТочки — 1); СтрокаРегистра.ТипРегистра = ТипРегистра; СтрокаРегистра.Синоним = МетаданныеРегистраCOM.Синоним; Если ТипРегистра = «РегистрНакопления» Тогда СтрокаРегистра.РегистрОстатков = МетаданныеРегистраCOM.ВидРегистра = ВидРегистраОстаткиCOM; КонецЕсли; КонецЦикла; // Сначала показывается регистр бухгалтерии, затем регистры накопления, затем — сведений Регистры.Сортировать(«ТипРегистра, Синоним»); Возврат Регистры; КонецФункции Функция ПолучитьМассивИспользуемыхРегистровCOM(Регистратор, Движения, МассивИсключаемыхРегистров = Неопределено) Экспорт Если Коннект = Неопределено Тогда Если Не ПодключитьИБ() Тогда Сообщить(«Не удалось установить подключение к ИБ!!!»); Возврат Новый ТаблицаЗначений КонецЕсли; КонецЕсли; Запрос = Коннект.NewObject(«Query»); Запрос.УстановитьПараметр(«Регистратор», Регистратор); Результат = Новый Массив; МаксимумТаблицВЗапросе = 256; СчетчикТаблиц = 0; СчетчикДвижений = 0; ВсегоДвижений = Движения.Количество(); ТекстЗапроса = «»; Для Каждого Движение Из Движения Цикл СчетчикДвижений = СчетчикДвижений + 1; ПропуститьРегистр = МассивИсключаемыхРегистров <> Неопределено И МассивИсключаемыхРегистров.Найти(Движение.Имя) <> Неопределено; Если Не ПропуститьРегистр Тогда Если СчетчикТаблиц > 0 Тогда ТекстЗапроса = ТекстЗапроса + » |ОБЪЕДИНИТЬ ВСЕ |»; КонецЕсли; СчетчикТаблиц = СчетчикТаблиц + 1; ТекстЗапроса = ТекстЗапроса + » |ВЫБРАТЬ ПЕРВЫЕ 1 |»»» + Движение.Имя + «»» КАК ИмяРегистра | |ИЗ » + Движение.ПолноеИмя() + » | |ГДЕ Регистратор = &Регистратор |»; КонецЕсли; Если СчетчикТаблиц = МаксимумТаблицВЗапросе Или СчетчикДвижений = ВсегоДвижений Тогда Запрос.Текст = ТекстЗапроса; ТекстЗапроса = «»; СчетчикТаблиц = 0; Если Результат.Количество() = 0 Тогда Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(«ИмяРегистра»); Иначе Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Результат.Добавить(Выборка.ИмяРегистра); КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции

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

Надеюсь, кому-нибудь данная статья будет полезна!

Спасибо за внимание) !!!

Cклонения по падежам  6
  НаКлиенте Процедура Команда1(Команда) ФИО = » Иванов Иван Иванович» ; Падеж = 2; Пол = 1; Результат = СклонениеФИО(ФИО, Падеж, пол); Сообщить(Результат); КонецПроцедуры НаСервере Функция СклонениеФИО(ФИО, Падеж, пол) Результат = » » ; v7plus.dll — отсутствует CLSID либо отсутствует интерфейс llnitDone  0
 При выгрузке отчетности в 1С 7.7 программа ругается на v7plus.dll и указывает, что отсутствует интерфейс llritDone. Что делать? 1) Поудалять нафиг все v7plus.dll из каталогов ИБ и папок пользователей 2) Оставить только в bin каталоге и зарегить чер V82.COMConnector.1: Не найдена лицензия COM-соединением  1
 При подключении из одной базы к другой через COM внезапно стала появляться следующая ошибка: «V82.COMConnector.1: Не найдена лицензия COM-соединением», хотя никаких изменений на серверах не делалось. Релиз платформы был 8.2.13. Обновил до 14-го – не База 1С при запуске уходит в дамп и вылетает  1
  В последнее время частенько обращаются пользователи у которых после замены или ремонта компьютера 1С не запускается, а точнее при открытии уходит в dump и вылетает. Как правило, решение одно: Отключить аппаратное ускорение видеокарты В Window Внутренняя ошибка компоненты DBENG8  0
 Ошибка СУБД: Внутренняя ошибка компоненты dbeng8 по причине: Внутренняя ошибка компоненты dbeng8 Решение: 1: Тестирование исправление базы 2: Проверка базы используя chdbfl.exe 3: Обновить версию Платформы 4: Обновить dbeng8.dll в

COM соединение служит для установки соединения с другими базами 1С. В этой статье узнаем основы работы с этим классом, как выполнять запросы через COM соединение и разберем несколько примеров.

  • Как создать COM объект?
  • Примеры работы с COM объектом
  • Основы принципы работы с COM соединением

Для чего нужно COM Соединение?

Этот объект используется для установки соединения с другими базами 1С. Например, Вам нужно сделать выгрузку справочника «Контрагенты» из одной базы, в другую или получить какие либо данные из другой базы 1С. Вы сможете это реализовать при помощи COM Соединения.

Как создать COM объект?

В начале надо узнать, какая версия 1С у вас, из этого и будем исходить при создании COM объекта.

  • Для 1С 8.2: COMConnector= Новый COMОбъект(«V82.COMConnector»);
  • Для 1С 8.3: COMConnector= Новый COMОбъект(«V83.COMConnector»);

Функция ПолучитьПодключение(СтрокаПодключения)
Попытка
//Создаем COM Объект
V83COMConnector= Новый COMОбъект(«V83.COMConnector»);
//Выполняем подключение к информационной базе
База = V83COMConnector.Connect(СтрокаПодключения);
Возврат База;
Исключение
Сообщить(ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции

Переменная «СтрокаПодключения» может быть двух видов:

В результате выполнения этой функции мы получим COM Объект через который можно обращаться к подключаемой базе.

Примеры работы с COM объектом

Для примера рассмотрим ситуацию, когда нам нужно через COM соединение создать склад:

Обратите внимание что «ВидСклада» мы указали через переменную «COMСоединение».

Так же часто требуется выполнить запрос через COM соединение, разберем пример на основе тех же складов:

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

Основы принципы работы с COM соединением

  • Все объекты, полученные через COM соединения, имеют тип COMОбъект, из за этого мы можем передать только простые типы, такие как: число. строка, дата, булево.
  • Для того чтобы получить элементы справочников, ссылки на документы и т.д. нужно использовать стандартные функции языка 1С. Например: НайтиПоРеквизиту(); НайтиПоНаименованию(); Выборкой; Запросами и т.д..
  • В результате каждого подключения будет задействована одна лицензия.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *