Обмен данными между базами 1С через COM соединение
Один из вариантов обмена данными между базами 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 = ""ИмяБазы""; Usr = ИмяПользователя; Pwd = Пароль"; //Для варианта файлового режима: СтрокаСоединения = "File = ""ПутьКБазе""; Usr = ИмяПользователя; Pwd = Пароль"; Попытка Подключение = Соединение.Connect(СтрокаСоединения); Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не удалось подключиться к базе" + ОписаниеОшибки(); Сообщение.Сообщить(); КонецПопытки;
Разрыв соединения
Соединение = Неопределено;
Для объекта V83.Application выполнять разрыв соединения обязательно, в противном случае останется висеть незавершенный сеанс, который потом придется удалять вручную. В случае с V83.COMConnector соединение разрывается автоматически при завершении процедуры в которой выполнялось подключение.И есть еще один маленький момент. Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках.
Метод NewObject()
Для создания нового объекта можно воспользоваться методом NewObject(), например:
// для V83.COMConnector Подключение = Соединение.Connect(СтрокаСоединения); ЗапросCOM = Подключение.NewObject("Запрос"); ТаблицаCOM = Подключение.NewObject("ТаблицаЗначений"); МассивCOM = Подключение.NewObject("Массив"); УидCOM =Подключение.NewObject("УникальныйИдентификатор",СтрокаУИД); //для V83.Application Соединение = Новый COMОбъект("V83.COMConnector"); ЗапросOLE = Соединение.NewObject("Запрос"); ТаблицаOLE = Соединение.NewObject("ТаблицаЗначений"); МассивOLE = Соединение.NewObject("Массив"); УидCOM =Соединение.NewObject("УникальныйИдентификатор",СтрокаУИД);
После создания Com объекта можно далее работать с ним, например
ЗапросCOM.Текст ="ВЫБРАТЬ | ДолжностиОрганизаций.Код, | ДолжностиОрганизаций.Наименование |ИЗ | Справочник.ДолжностиОрганизаций КАК ДолжностиОрганизаций"; Результат = ЗапросCOM.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл // ........ КонецЦикла;
Можно также использовать менеджеры объектов конфигурации:
СправочникCOM = Подключение.Справочники.ИмяСправочника; ДокументCOM = Подключение.Документы.ИмяДокумента; РегистрCOM = Подключение.РегистрыСведений.ИмяРегистра;
Получение и сравнение перечисления через COM соединение
Для сравнения значений элементов перечислений, определенных в конфигурации, необходимо выполнить преобразование этих элементов к одному из примитивных типов, сравнение которых не вызывает трудности. Такими типами могут быть либо числовой, либо строковый тип. Преобразовать значение элемента перечисления к числовому типу можно так
ЭлементПеречисления = Подключение.Справочники.Справочник1.НайтиПоКоду(1).Реквизит1; ВозможныеЗначения = ЭлементПеречисления.Метаданные().ЗначенияПеречисления; НомерЭлементаПеречисления = ВозможныеЗначения.Индекс(ВозможныеЗначения.Найти(Соединение.XMLString(ЭлементПеречисления))); Если НомерЭлементаПеречисления = 0 Тогда Сообщить("ЗначениеПеречисления1"); ИначеЕсли НомерЭлементаПеречисления = 1 Тогда Сообщить("ЗначениеПеречисления2"); КонецЕсли;
Получение объекта через COM по идентификатору
Через менеджеры объектов конфигурации получаем com объект, например :
ДокументCOM = Соединение.Документы.ИмяДокумента;
Затем получаем строку уникального идентификатора :
СтрокаУИД=Соединение.string(ДокументCOM.УникальныйИдентификатор());
Затем в базе данных можно найти по ссылке нужный документ, таким образом:
Идентификатор= Новый УникальныйИдентификатор(СтрокаУИД); СсылкаПоИдентификатору = Документы[ИмяДокумента].ПолучитьСсылку(Идентификатор);
Если нужно найти com объект по идентификатору, то тогда нужно написать так:
УидCOM = Соединение.NewObject("УникальныйИдентификатор",СтрокаУИД); СсылкаПоИдентификатору = Соединение.Документы[ИмяДокумента].ПолучитьСсылку(УидCOM);
ЗАчем же чужие статьи публиковать?
Эта статья не имеет оригинального текста. Она написана специально для пользователя, который задал мне вопрос. Пользователи, с которыми я работают, часто задают мне вопросы. Если у меня нет времени ответить им оригинальным текстом, то ищу текст ответа по найденным материалам в интернете .
Спасибо за статью. Есть проблема с создании документа ЗаказПокупателя в подключенной по COMObject базе. Документ Реализация ТоваровУслуг спокойно создается и заполняется, а для ЗаказПокупателя.СоздатьДокумент() пишет : “Ошибка при вызове метода контекста (СоздатьДокумент)”. В чеи может быть причина?
ХЗ
Хуй знает вообще
Строка
СтрокаСоединения = “File = “”ПутьКБазе””; Usr = ИмяПользователя; Pwd = Пароль”
не заработает, если имя пользователя – строка, тогда необходимо указывать в двойных кавычках, как и пароль. А если число, то нет.