Пример подключения к информационной базе через 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 не будет опубликован. Обязательные поля помечены *