Пример подключения к информационной базе через COMConnector


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

общий концепт подключения такой, если кому нужен только механизм

СтрокаПодключения = "";
Если Не АутентификацияWindows Тогда
Если НЕ ПустаяСтрока(Пользователь) Тогда
СтрокаПодключения = СтрокаПодключения + ";Usr = """ + Пользователь + """";
КонецЕсли;
Если НЕ ПустаяСтрока(Пароль) Тогда
СтрокаПодключения = СтрокаПодключения + ";Pwd = """ + Пароль + """";
КонецЕсли;
КонецЕсли;
СтрокаПодключения = СтрокаПодключения + ";";

//V8 или V81 или V83
ВерсияПлатформы = "V83";

Попытка
ProgID = ВерсияПлатформы +".COMConnector";
COMПодключение = Новый COMОбъект(ProgID);
COMОбъект = COMПодключение.Connect(СтрокаПодключения);
Исключение
СтрокаСообщенияОбОшибке = "При попытке соединения с COM-сервером произошла ошибка:" + Символы.ПС
+ ОписаниеОшибки();
Сообщить(СтрокаСообщенияОбОшибке);
Возврат Неопределено;
КонецПопытки;

Возврат COMОбъект;

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

ОбъектПодключения = ПодключитсяКИнформационнойБазе();

Если НЕ ОбъектПодключения = Неопределено Тогда
Сообщить("Подключение выполнено! " + ТекущаяДата());

Для Каждого ЭлМетаданных ИЗ ОбъектПодключения.Метаданные.Документы Цикл
Запрос = ОбъектПодключения.NewObject("Запрос");
Текст = "ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК КоличествоДокументов
|ИЗ
| Документ."+ЭлМетаданных.Имя+" КАК Документ";
Запрос.Текст = Текст;
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ВсегоДокументов = Выборка.КоличествоДокументов;
Сообщить(ЭлМетаданных.Имя + " - " + ВсегоДокументов);
Прервать;
КонецЦикла;

КонецЕсли;

при ошибке "Ошибка при вызове конструктора (COMОбъект): -2147221005(0x800401F3)" не забываем регистрировать библиотеку, через

regsvr32     bincomcntr.dll

 

для БСП есть вот такой способ подключения.
БСП, Общий модуль, ОбщегоНазначенияКлиентСервер 

Функция УстановитьВнешнееСоединение(Параметры, СтрокаСообщенияОбОшибке = "", ОшибкаПодключенияКомпоненты = Ложь) Экспорт

ps: спасибо комментатору awk

20 Comments

  1. dsdred

    Похоже мамонт по имени COM еще долго не вымрет…

    Reply
  2. zabaluev

    100500 раз об одном и том же. Что здесь нового?

    Reply
  3. awk

    БСП, Общий модуль, ОбщегоНазначенияКлиентСервер

    // Устанавливает внешнее соединение с информационной базой по переданным параметрам подключения и возвращает указатель
    // на это соединение.
    //
    // Параметры:
    //  Параметры — Структура — параметры для установки внешнего соединения с информационной базой.
    //                          Свойства см. в функции
    //                          ОбщегоНазначенияКлиентСервер.СтруктураПараметровДляУстановкиВнешнегоСоединения):
    //
    //    * ВариантРаботыИнформационнойБазы             — Число — Вариант работы информационной базы: 0 — файловый; 1 —
    //                                                            клиент-серверный;
    //    * КаталогИнформационнойБазы                   — Строка — Каталог информационной базы для файлового режима работы;
    //    * ИмяСервера1СПредприятия                     — Строка — Имя сервера1С:Предприятия;
    //    * ИмяИнформационнойБазыНаСервере1СПредприятия — Строка — Имя информационной базы на сервере1С:Предприятия;
    //    * АутентификацияОперационнойСистемы           — Булево — Признак аутентификации операционной системы при создании
    //                                                             внешнего подключения к информационной базе;
    //    * ИмяПользователя                             — Строка — Имя пользователя информационной базы;
    //    * ПарольПользователя                          — Строка — Пароль пользователя информационной базы.
    //
    //  СтрокаСообщенияОбОшибке — Строка — если в процессе установки внешнего соединения возникает ошибка,
    //                                     то подробное описание ошибки помещается в этот параметр.
    //  ОшибкаПодключенияКомпоненты — Булево — (возвращаемый параметр) устанавливается Истина, если была ошибка при подключении.
    //
    // Возвращаемое значение:
    //  COMОбъект, Неопределенно — в случае успешной установки внешнего соединения возвращается указатель на COM-объект соединения;
    //    в случае ошибки возвращается Неопределенно.
    //
    Функция УстановитьВнешнееСоединение(Параметры, СтрокаСообщенияОбОшибке = «», ОшибкаПодключенияКомпоненты = Ложь) Экспорт

    Показать

    Reply
  4. azhilichev
    ВсегоДокументов = Запрос.Выполнить().Выбрать().Количество();

    Занавес…

    Reply
  5. IncomeGroup

    (4) это для примера.

    Reply
  6. IncomeGroup

    (3) о, это полезно, об этом я не знал, спасибо.

    Reply
  7. azhilichev

    (5)Дело не в том, «подожгло» или «не подожгло». Вы выкладываете статью. Скорее всего позиционируете ее как обучающую. И скорее всего код, который в статье, используете в своей работе. Есть большая вероятность, что кто-то позаимствует код из вашего примера. Давайте я объясню, что меня «подожгло».

    Вы используете очень неэффективную проверку количества объектов в таблице:

    ВсегоДокументов = Запрос.Выполнить().Выбрать().Количество();

    Предположим, что у вас SQL-база. Здесь вы выбираете все ссылки на документы из таблицы. Эти данные передаются с сервера БД на сервер 1С. Хорошо, если таблицы по размеру небольшие. Плохо, если в таблицах сотни миллионов или миллиарды записей. Все это кэшируется и память сервера 1С неслабо засирается. Далее вы берете этот дохулион записей и просите платформу посчитать количество.

    Правильно будет делать так:

    «ВЫБРАТЬ
    КОЛИЧЕСТВО(*) КАК КоличествоДокументов
    ИЗ
    Документ.[Имя_Вашего_Документа] КАК [Псевдоним_Таблицы]»
    
    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();

    И тогда Выборка.КоличествоДокументов как раз и будет содержать определяемое значение. При этом подходе мы просим СУБД посчитать для нас количество записей в таблице.

    Reply
  8. Denis_CFO

    (7) Спасибо, за простое разъяснение.

    Reply
  9. IncomeGroup

    (7) Все ж обучение не в этом, но да правильное замечание, учту.

    Reply
  10. jaa_cool

    (1)Просто не вымрут те, у кого при слове WS/HS округляются глаза… зачем что-то новое, когда на коленке все работает

    Reply
  11. dsdred

    (10)Линукс бы им в помощь ))

    Для ускорения процесса изучения нормальных современных методик.

    Reply
  12. jaa_cool

    (11)Ага, Slackware, а не какой-то там халявный redhat подобный гыгы

    Reply
  13. awk

    (7) Эх… Махнув перо в г…но, накину и я на вентилятор… :))))

    Правильно (а точнее безопастнее) будет:

    
    Если Выборка.Следующий() Тогда
    
    
    Reply
  14. azhilichev

    (13) А в чем опасность?

    Выборка.Следующий();

    Запрос на получение количества без выборки каких-либо других данных и без соединений с другими таблицами всегда вернет 1 запись. Даже если строк в таблице нету, то в этой единственной записи будет значение 0.

    Reply
  15. IncomeGroup

    (14) в типовых кстати такое есть, от ситуации зависит.

    Reply
  16. awk

    (14) Все так, все так…. Пока так… А завтра? Добавили группировку, соединение и вуаля… Выборка.Следующий() = Ложь, а Выборка.КоличествоДокументов = Неопределено…

    Reply
  17. IncomeGroup

    (16) напишите письмо в фирму 1С, возможно вас послушают.

    Reply
  18. awk

    (17) Вот сейчас не совсем понял. Зачем? Что фирма 1С должна сделать? Если вы думаете, что пример надуман, то нет. Он из жизни… И ошибка: «преобразование к значению типа Число не может быть выполнено», правилась мной на этой неделе.

    Reply
  19. azhilichev

    (16) Это проблема не исходного решения. А того, кто доработал решение, даже не осмыслив, что он дорабатывает и какой объем правок надо сделать.

    Reply
  20. awk

    (19) Эту проблему можно избежать, просто проверив результат запроса. Обнаружить же такую ошибку, не имея модульных тестов , зачастую просто не реально. Но это уже перфекционизм, реакция на ваше:

    позиционируете ее как обучающую

    Сам такой… Прочитал ваш пост, как в зеркало посмотрел.

    Reply

Leave a Comment

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