Компьютерные уроки

1c 8 com соединение. Узкое место в COM-соединении

Один из вариантов обмена данными между базами 1С это обмен через COM соединение.

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

Можно создать два вида COM объектов для приложения 1С. Это V82.Application и V82.COMConnector . В случае с V82.Application запускается практически полноценный экземпляр приложения 1С. в случае использования V82.COMConnector запускается небольшая серверная часть.
Скорость работы в этом случае выше, но некоторые функции могут быть недоступны. В частности работа с формами и с общими модулями для которых не установлено свойство работы с внешними соединениями. Преимущественно надо использовать V82.COMConnector и только в случае нехватки функционала V82.Application . Особенно сильно разница в скорости работы может быть заметна на базах большого объема.

Итак, приступим

  1. Создадим COM объект
    • для V82.Application Соединение = Новый COMОбъект("V82.Application" ) ;
    • для V82.COMConnector Соединение = Новый COMОбъект("V82.COMConnector" ) ;
  2. Сформируем строку подключения
    • для серверного варианта базы СтрокаСоединения = "Srvr = " "ИмяСервера" ";Ref = " "ИмяБазы" ;
    • для файлового варианта базы СтрокаСоединения = "File = " "ПутьКБазе" "; Usr = ИмяПользователя; Pwd = Пароль" ;
  3. Выполняем подключение к базе Попытка Подключение = Соединение. Connect(СтрокаСоединения) ; Исключение Сообщение = Новый СообщениеПользователю; Сообщение. Текст = + ОписаниеОшибки() ; Сообщение. Сообщить() ; КонецПопытки ;
  4. Разрываем соединение с базой Соединение = Неопределено ;

    Для объекта V82.Application выполнять разрыв соединения обязательно, в противном случае останется висеть незавершенный сеанс, который потом придется удалять вручную. В случае с V82.COMConnector соединение разрывается автоматически при завершении процедуры в которой выполнялось подключение.И есть еще один маленький момент.

    Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках.

А теперь соберем весь код в кучу

Соединение = Новый COMОбъект("V82.Application" ) ; //Соединение = Новый COMОбъект("V82.COMConnector"); СтрокаСоединения = "Srvr = " "Server1C" ";Ref = " "MyBase" "; Usr = Петя; Pwd = 123" ; //СтрокаСоединения = "File = ""С:\MyBase""; Usr = Петя; Pwd = 123"; Попытка Подключение = Соединение. Connect(СтрокаСоединения) ; Исключение Сообщение = Новый СообщениеПользователю; Сообщение. Текст = "Не удалось подключиться к базе" + ОписаниеОшибки() ; Сообщение. Сообщить() ; КонецПопытки ; Соединение = Неопределено ;

Для вида подключения V82.Application метод применяется для COM объекта, который создавался изначально, а для V82.COMConnector метод применяется к подключению. далее работа с запросом идет стандартными средствами 1С. в коде это выглядит так:

Запрос = Подключение. NewObject("Запрос" ) ; // для V82.COMConnector Запрос = Соединение. NewObject("Запрос" ) ; // для V82.Application Запрос. Текст = "ВЫБРАТЬ | ДолжностиОрганизаций.Код, | ДолжностиОрганизаций.Наименование |ИЗ | Справочник.ДолжностиОрганизаций КАК ДолжностиОрганизаций" ; Результат = Запрос. Выполнить () ; Выборка = Результат. Выбрать() ; Пока Выборка. Следующий() Цикл КонецЦикла ;

Для версии 1С:Предприятие 8.3 все остается без изменений за исключением того, что при создании COMОбъектов надо использовать «V83.COMConnector» или «V83.Application» .

Печать (Ctrl+P)

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

com соединение

Можно создать два вида COM объектов для приложения 1С. Это ole соединения V83.Application и com соединения V83.COMConnector . В случае с V83.Application запускается практически полноценный экземпляр приложения 1С. В случае использования V83.COMConnector запускается небольшая серверная часть. Скорость работы в этом случае выше, но некоторые функции могут быть недоступны. В частности работа с формами и с общими модулями для которых не установлено свойство работы с внешними соединениями. Преимущественно надо использовать V83.COMConnector и только в случае нехватки функционала V83.Application . Особенно сильно разница в скорости работы может быть заметна на базах большого объема. Для платформе 8.2 используется V82.Application или V82.COMConnector

Установить OLE соединение

Соединение = Новый COMОбъект(“V83.Application” ) ;

Установить COM соединение

Соединение = Новый COMОбъект(“V83.COMConnector” ) ;

Строка подключения

//Для варианта клиент- сервер
СтрокаСоединения = “Srvr = “ “ИмяСервера” “;Ref = “ “ИмяБазы” ;
//Для варианта файлового режима:
СтрокаСоединения = “File = “ “ПутьКБазе” “; Usr = ИмяПользователя; Pwd = Пароль” ;
Попытка
Подключение = Соединение. Connect (СтрокаСоединения) ;
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение. Текст = “Не удалось подключиться к базе” + ОписаниеОшибки() ; Сообщение. Сообщить() ;
КонецПопытки ;

Разрыв соединения

Соединение = Неопределено ;
Для объекта V83.Application выполнять разрыв соединения обязательно, в противном случае останется висеть незавершенный сеанс, который потом придется удалять вручную. В случае с V83.COMConnector соединение разрывается автоматически при завершении процедуры в которой выполнялось подключение.И есть еще один маленький момент. Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках.

Метод NewObject()

Для создания нового объекта можно воспользоваться методом NewObject(), например:

для V83.COMConnector

ЗапросCOM = Подключение. NewObject(“Запрос “ ) ;
ТаблицаCOM = Подключение. NewObject(“ТаблицаЗначений” ) ;
МассивCOM = Подключение. NewObject(“Массив” ) ;

УидCOM =Подключение.NewObject

для V83.Application

ЗапросOLE = Соединение. NewObject(“Запрос “ ) ;
ТаблицаOLE = Соединение. NewObject (“ТаблицаЗначений” ) ;
МассивOLE = Соединение.NewObject (“Массив” ) ;
УидCOM =Соединение.NewObject (“УникальныйИдентификатор”,СтрокаУИД);

ЗапросCOM. Текст = “ВЫБРАТЬ
| ДолжностиОрганизаций.Код,
| ДолжностиОрганизаций.Наименование
|ИЗ | Справочник.ДолжностиОрганизаций
КАК ДолжностиОрганизаций” ;

Результат = ЗапросCOM. Выполнить () ;
Выборка = Результат. Выбрать () ;
Пока Выборка. Следующий() Цикл
КонецЦикла ;
Можно также использовать менеджеры объектов конфигурации:
СправочникCOM = Подключение. Справочники. ИмяСправочника;
ДокументCOM = Подключение. Документы. ИмяДокумента;
РегистрCOM = Подключение . РегистрыСведений . ИмяРегистра ;

Получение и сравнение перечисления через COM соединение

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

ЭлементПеречисления = Подключение.Справочники.Справочник1.НайтиПоКоду(1).Реквизит1;

ВозможныеЗначения = ЭлементПеречисления.Метаданные().ЗначенияПеречисления;

НомерЭлементаПеречисления = ВозможныеЗначения.Индекс(ВозможныеЗначения.Найти(Соединение.XMLString(ЭлементПеречисления)));

Если НомерЭлементаПеречисления = 0 Тогда Сообщить(“ЗначениеПеречисления1” );

ИначеЕсли НомерЭлементаПеречисления = 1 Тогда Сообщить (“ЗначениеПеречисления2”);

КонецЕсли;

Получение объекта через COM по идентификатору

Через менеджеры объектов конфигурации получаем com объект, например:
ДокументCOM = Соединение. Документы. ИмяДокумента;

Затем получаем строку уникального идентификатора:

СтрокаУИД =Соединение.string (ДокументCOM.УникальныйИдентификатор ())

Идентификатор = Новый УникальныйИдентификатор(СтрокаУИД) ;
СсылкаПоИдентификатору = Документы[ИмяДокумента].ПолучитьСсылку(Идентификатор);

Если нужно найти com объект по документ по идентификатору, то тогда нужно написать так:

УидCOM = Соединение.NewObject (“УникальныйИдентификатор”,СтрокаУИД );
СсылкаПоИдентификатору = Соединение.Документы[ИмяДокумента].ПолучитьСсылку(УидCOM);

)Все верно

Одновременно, я видел не раз, когда просто "взлетали" публикации которые не тянули даже на 10 баллов.
Почему так происходило? Видимо потому, что кому то они явно пришлись по душе.


Я про это и говорю, что было бы неплохо не читая статью по рейтингу понять насколько она тебе нужна, или оценить ее не так примитивно +/-. Насчет пришлась по душе я бы скорректировал так: она так много набрала из-за того что так звезды сложились и на сайте собралось много народу и многим понравилось, сами понимаете это дело случая т.к. как только статья уходит с главной страницы то ее уже можно найти только по запросу, а так голосуют все мимо проходящие. И поддерживать на главной, насколько я понимаю, позволяют как раз постоянные комментарии = раскрутка статьи.
Именно для этого и ставят магазины на проходных улицах - ведь часто важно не качество и актуальность товара, а проходимость места, люди гуляя часто покупают то что выкинут на следующий день, просто ради процесса. Это давно всем известная болезнь - шопомания. Или просто увеличения потока увеличивает вероятность нужного покупателя.

А плюсы и минусы... - это всего лишь некое "спасибо" за потраченное время и труд


Т.е. минус тоже считается за "спасибо"? Я вот и хотел узнать ваше отношение к тому нужно ли ставить в таких случаях его, и как интересно считают другие? Ставить ли его когда статья вредная/плохая или когда она тебе просто бесполезная/пустая.
На мой взгляд статья смахивает на просто повышение рейтинга, т.к.:
1. Приведенные мной проблема с типами вообще проигнорирована автором, хотя он не поленился написать кучу комментов.
2. В статье явная неточность: сказано что можно только так

V82 = Новый COMобъект("V82.ComConnector"); Код = КонтрагентСОМ.Code;


а вот я спокойно делаю при помощи обработки вот так:

Сообщить(База.Справочники.Контрагенты.НайтиПоНаименованию("ООО").Код);


и все нормально! А подключение выбираю V82.ComConnector
Странно как-то что автору совершенно плевать на то что его статья содержит такие проблемы на которые указали, а он не реагирует никак.
3. А ведь есть еще проблема когда выскакивает ошибка "Класс не существует"
4. А есть проблема когда установлена 8.2, а потом установлена 8.1 - попробуйте-ка обменяться по ОЛЕ/COM типовым обменом УТ-БП!
5. Могли бы указать основные обработки на сайте которые позволяют универсально подключаться по ОЛЕ/COM чтобы новички не тратили времени, вы же для них пишите! Та же кстати ее картинка почему то у вас красуется, с чего бы?. А в результате 2 слова по существу, и еще 6 за кадром.

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