V8: COM-соединение. Три кита работы с COM-объектами

01.01.2024

Один из вариантов обмена данными между базами 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);

Вопрос: Парсинг сайта через COM IE 11


Доброго времени суток.!
Вопрос до боли известный, необходимо забрать инфу с сайта. Но есть нюансы:
1. Нет возможности зайти сразу на страницу авторизации (сначала заходим на домашнюю страницу, нажимаем ссылку LogIn, получаем форму авторизации и только потом логинимся).
2. На сайте нужно через поисковую строку искать данные, далее читать их и искать еще (данные могут быть на русском и английском, т.е. если данные для поиска на русском, то искать нужно в "русской версии" сайта, а это еще один переход по ссылке на другую страницу. С английским такая же тема).

В итоге:
- заходим на домашнюю страницу - логинимся - ищем данные - (переходим на др. версию сайта, если нужно) - забираем их.

Проблема:
Не считываются данные в свойство "document" при переходе по ссылке.
Возникает в двух моментах:
- когда переходим по ссылке, чтобы залогиниться (это не кнопка, а просто ссылка);
- когда меняем язык на сайте (тоже ссылка).

Примечание
Если перед переходом по ссылке на этапе авторизации получить ссылку, закрыть ком и открыть снова с переходом через метод IE.navigate("ссылка"), тогда данные в свойство "document" ложатся нормально. Но проделать тоже самое при смене языка на сайте уже не получится, т.к. нужно логиниться снова и плюс не хотелось бы вот именно так решать эту задачку.

Вот код:

&НаКлиенте Процедура УстановитьОжиданиеИЕ(IE, ВторойВызов=Ложь) Если НЕ IE.Busy Тогда Д = ТекущаяДата() + 3; Пока Д >= ТекущаяДата() Цикл Если IE.Busy Тогда Прервать; КонецЕсли; КонецЦикла; КонецЕсли; Пока IE.Busy Цикл КонецЦикла; Пока IE.ReadyState < 4 Цикл КонецЦикла; Попытка Если IE.Document.ReadyState = Null Тогда IE.Refresh(); УстановитьОжиданиеИЕ(IE); КонецЕсли; Пока IE.Document.ReadyState <> "complete" Цикл КонецЦикла; Исключение Если ВторойВызов Тогда Возврат; Иначе Ссылка = IE.LocationURL; IE.Quit(); IE = ПолучитьCOM("InternetExplorer.Application"); IE.Navigate(Ссылка); УстановитьОжиданиеИЕ(IE, Истина); КонецЕсли; КонецПопытки; КонецПроцедуры &НаКлиенте Функция ВыполнитьАвторизациюПользователя(IE, Ссылка, Логин, Пароль, Авторизован=Ложь, СЧ=0) Попытка Elements = IE.Document.GetElementsByName("username"); Если Elements.Length = 1 Тогда Для Каждого El Из Elements Цикл El.Value = Логин; КонецЦикла; КонецЕсли; Elements = IE.Document.GetElementsByName("password"); Если Elements.Length = 1 Тогда Для Каждого El Из Elements Цикл El.Value = Пароль; КонецЦикла; КонецЕсли; IE.Document.GetElementById("ID").Click(); УстановитьОжиданиеИЕ(IE); Авторизован = Истина; Исключение Если СЧ > 3 Тогда Возврат Ложь; КонецЕсли; IE.Quit(); IE.Navigate(Ссылка); УстановитьОжиданиеИЕ(IE); СЧ = СЧ + 1; Если ВыполнитьАвторизациюПользователя(IE, Ссылка, Логин, Пароль, СЧ) Тогда Возврат Истина; КонецЕсли; КонецПопытки; Возврат Авторизован; КонецФункции &НаКлиенте Процедура Закачать(Команда) СпТаблиц = ПолучитьСписокТаблицДляЗагрузки(); Если СпТаблиц = Ложь Тогда Возврат; КонецЕсли; IE = ПолучитьCOM("InternetExplorer.Application"); Для Каждого Строка Из СпТаблиц.SOURCE_LIST Цикл РА = Строка.ID; Ресурс = Строка.RESOURCE; IE.Navigate(Ресурс); УстановитьОжиданиеИЕ(IE); Попытка Если Строка.NEW_PAGE_IN_LOGIN = 1 Тогда Classes = IE.Document.GetElementsByClassName("ИмяКласса"); Если Classes.Length = 1 Тогда Для Каждого Class Из Classes Цикл Ресурс = Class.All(0).Href; Прервать; КонецЦикла; Попытка IE.Quit(); IE = IE.Navigate(Ресурс); УстановитьОжиданиеИЕ(IE); Исключение Сообщить("Подключение к сайту «" +Строка.NAME + "» не удалось!"); Прервать; КонецПопытки; Иначе Сообщить("Подключение к сайту «" +Строка.NAME + "» не удалось!"); Прервать; КонецЕсли; КонецЕсли; Если НЕ ВыполнитьАвторизациюПользователя(IE, Ресурс, Строка.LOGIN, Строка.PASSWORD) Тогда Сообщить("Авторизация пользователя на сайте «" + Строка.NAME + "» не выполнена!"); Прервать; КонецЕсли; Ресурс = IE.LocationURL; СписокЛиц = СпТаблиц.FACE_CODES.НайтиСтроки(Новый Структура("SOURCE", РА)); СписокНеНайденных = Новый Массив; Для Каждого Лицо Из СписокЛиц Цикл ИмяЛица = Лицо.NAME_IN_SITE; ЭтоРусский = КодСимвола(ИмяЛица, 1) >= 1040; ТекРесурс = ?(ЭтоРусский, СтрЗаменить(Ресурс, "en_US", "ru_RU"), СтрЗаменить(Ресурс, "ru_RU", "en_US")); Если ТекРесурс <> IE.LocationURL Тогда RootClasses = IE.Document.GetElementsByClassName("ИмяКласса"); Если RootClasses.Length = 1 Тогда Для Каждого RootClass Из RootClasses Цикл Classes = RootClass.Children; Прервать; КонецЦикла; AmGroup = False; RuGroup = False; Для Каждого Class Из Classes Цикл Если НРег(Class.ClassName) = "dropdown-header" Тогда AmGroup = Найти(Class.InnerText, "Americans") > 0; RuGroup = Найти(Class.InnerText, "Europe") > 0; ИначеЕсли НРег(Class.ClassName) <> "selected" Тогда Если AmGroup И Найти(Class.All(0).InnerText, "English") > 0 ИЛИ RuGroup И Найти(Class.All(0).InnerText, "Russia") > 0 Тогда IE.Navigate(Class.All(1).Href); УстановитьОжиданиеИЕ(IE); Прервать; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; IE.Document.GetElementById("ИД").Value = ИмяЛица; FindButton = IE.Document.GetElementById("ИД"); FindButton.Focus(); FindButton.Click(); Попытка УстановитьОжиданиеИЕ(IE); //Обход полученных данных Исключение СписокНеНайденных.Добавить(Лицо); Продолжить; КонецПопытки; КонецЦикла; Исключение Сообщить("Ошибка:" + Символы.ПС + ОписаниеОшибки()); Прервать; КонецПопытки; КонецЦикла; IE.Quit(); КонецПроцедуры

Ответ:

Тема очень интересная, но вот лично у меня, к сожалению, нет ни опыта, ни даже возможности хоть как то разобраться в этой проблеме. Если сможете раздобыть информацию на эту тему, то поделитесь ей пожалуйста.
--- Объединение сообщений, 29 апр 2016 ---

Я так понимаю доступа к SQl базе нет?

--- Объединение сообщений, 29 апр 2016 ---

Ну хотя если парсинг, то какой доступ

Вопрос: COM-соединение 1С 8.3 - 1С 8.3 Есть ли возможность зайти в отладчик в соединении


Хотел спросить форумчан если ли вообще такая возможность отладки когда подключаюсь по СОМ-соединению с помощью обработки из одной базы на платформе 8.3.6 (БП 3.0) к модулю внешнего соединения самописной базы (тоже работающей на платформе 8.3.6) и вызываю из него экспортные процедуры с помощью обработки? Базы пока файловые и находятся на одном ПК, но планируется серверный вариант. До этого времени использовал конструкции приведенные ниже для передачи на выполнение произвольного кода по СОМ-соеднению, а также регистрации ошибок. Вот фрагменты процедур в самописной базе в модуле внешнего соединения:

Функция ИсполнитьВн(КодВыполнить, ВспомПараметр= "") Экспорт
ПроверкаБезопасности();// Защита от попытки выполнения вредоносного кода при внешнем подключении от имени другого пользователя Ответ = "0 "//Если ничего не нужно будет возвращать, то при отсутствии ошибок в коде  //вернется просто ОК  //Т.к. переданный код может быть с ошибками, то завернем его исполнение в попытку. Попытка Выполнить(КодВыполнить);// Выполнение кода как строки на другом компьютере по COM-Соединению (Модуль внешнего соединения базы Весы) Исключение  //если все таки ошибка, то вернем ее текст Ответ = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки ; Возврат Ответ; КонецФункции Функция ТестСвязи(ВхПараметр, ВыхПараметр) Экспорт ПроверкаБезопасности();// Защита от попытки выполнения вредоносного кода при внешнем подключении от имени другого пользователя. ВыхПараметр = "Есть связь с базой весы по COM-Соединению!"; Возврат Истина ; КонецФункции
Из БП 3.0 выполняю такой фрагмент:
Попытка
Ком = Новый COMObject("V83.COMConnector"); Соединение = Ком.Connect ("File=""C:\1 c\Базы_1С\Весы""; Usr =""КомОбмен""; Pwd =""1 "";"); СказатьПользователю("Тест пройден! Есть соедение с базой весов"); Исключение Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); СказатьПользователю("Нет КОМ-соединения с базой Весов! Подробно "+Ошибка); Ком=Неопределено ; Возврат ; КонецПопытки ; Вых = ""; Вх = "1 "; Если Соединение.ТестСвязи(Вх, Вых) Тогда СказатьПользователю("Тест связи с конфигурацией весы успешный! Ответ: "+Вых); Иначе СказатьПользователю("Тест связи с конфигурацией весы неудачный! Ответ: "+Вых); КонецЕсли ;
Понимаю, конечно что в оператор Выполнить(СтрокаКода1С8) зайти не удастся, но есть ли такая возможность при вызове удаленной процедуры модуля внешнего подключения из основной базы Соединение.ТестСвязи(Вх, Вых) зайти в ее код в этой же сессии отладчика в функцию ПроверкаБезопасности() их вызывающей процедуры?
Уже смотрел документацию что смог найти по этому вопросу. Ставил везде в обоих конфигурациях опции по разрешению отладки и точки останова. Запускал оба конфигуратора.
Есть ли вообще такая возможность в данной ситуации отладить допустим процедуру ПроверкаБезопасности() и дальше на стороне модуля внешнего подключения?

Вопрос: Неправильный IP-адрес в COM соединении


Есть обработка, которая перекидывает документы через V83.ComСonnector между серверами. Сервер 1 (версия 1С 8.2.19.90) всегда подключается к Серверу 2 (версия 8.3.8.2033). В строке соединения прописан IP адрес сервера 2 и работало все хорошо. На самом сервере 1 видел также установленную платформу как на сервере 2, версии 8.3.9.2033 (если это важно).

Проблема в том, что на Сервере 2 поменялся IP адрес, обработка конечно же перестала работать и когда я прописал новый IP в строке подключения, обработка выдает ошибку, в описании которой по-прежнему старый IP (!) и текст "Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера."

Все перезагружали, чистили кеши и тд, админы клянутся что с их стороны все ок, по RDP можно зайти с одного сервера на другой и тд.

Что может быть, как решить? Весь интернет перерыл, такой ситуации не нашел!

Ответ: () 100% уверен! Второй день пробую, как и писал, отладчиком смотрю, даже создал одноклеточную обработку тупо для теста коннекта, вываливается та ошибка и все

Вопрос: COM соединение к разным версиям


Всем привет.
Имею базу аля "Консолидация", которая с разных баз собирает разные данные и сводит все в одну кучу. Проблема в том, что необходимо через com подключатся к этим базам, но они разных версий, соответственно в конечном итоге ловлю ошибку типа
Ошибка подключения!{ ВнешняяОбработка. ПереносИстории. Форма. Форма. Форма(12 )} : Ошибка при вызове метода контекста (Connect) : Произошла исключительная ситуация (V83. COMConnector. 1 ) : Несоответствие версий клиента и сервера 1 С:Предприятия Различаются версии клиента и сервера (8.3 . 8.1964 - 8.3 . 6.2332 ), клиентское приложение: COM- соединение

настрою одно соединение, отваливается другое...

Знаю что как то через службу компонентов можно создавать "свои классы (конекторы)" для каждой версии и потом создавать Новый COMОбъект соответствующего версии платформы класса... может я и ошибаюсь.

Помогите, победить эту проблемку...

Ответ: все... вопрос снимаю..

Вопрос: Com Ошибка в ОбработкаЗаполнения


Привет.
8.2 Розница 1.
коннектюсь к 8.1 Не типовая конфа.
Подключаюсь по com к базе и пытаюсь создать документ, но при вызове "СоздатьДокумент()" или "ПолучитьОбъект()" происходит ошибка процедуре ОбработкаЗаполнения . см рис.

Пробую то же самое в самой базе 8.1 но ни какой ошибки нет, и в ОбработкаЗаполнения тоже не вхожу.
В чем косяк то может быть?

Ответ: turboq , криво написанный модуль документа!

Добавлено через 5 минут
Она не вызывается! Она пытается скомпилироваться! Но так как при подключении через ComConnector РежимДиалогаВопрос НЕ СУЩЕСТВУЕТ, модуль документа не может быть скомпилирован.
Для таких случаев когда в модуле объекта необходимо реализовать работу с диалогом используют инструкции препроцессору

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

В базе код исполняется на клиенте и РежимДиалогаВопрос есть поэтому все происходит без ошибок

Используй не ComConnector, V8.Application для подключения, тогда тебе будут доступны интерфейсные вещи

Добавлено через 5 минут
=======================================================================================================================
из описания внешнего соединения (СП) Жирным выделил что тебе следует почитать про КомСоединения

Описание :

В общем и целом работа с 1С:Предприятием 8 через внешнее соединение подобна работе с 1С:Предприятием в режиме Automation сервера. Основные отличия заключаются в следующем:

  • В случае Automation сервера запускается полноценное приложение 1С:Предприятия 8, а в случае внешнего соединения запускается относительно небольшой внутрипроцессный COM-сервер.
  • При работе через внешнее соединение не доступны функциональные возможности, так или иначе связанные с организацией пользовательского интерфейса 1С:Предприятия 8;
  • При работе внешнего соединения не используется модуль управляемого приложения (модуль обычного приложения) конфигурации 1С:Предприятия 8. Его роль при работе с внешним соединением играет модуль внешнего соединения.
При использовании внешнего соединения имеются следующие преимущества по сравнению с использованием Automation сервера:
  • Более быстрая установка соединения, так как не требуется создания отдельного процесса операционной системы, а все действия производятся в рамках вызывающего процесса;
  • Более быстрое обращение к свойствам и методам объектов 1C:Предприятия, так как для организации обращения не требуется организации межпроцессной коммуникации;
  • Меньший расход ресурсов операционной системы.
Для организации доступа к данным 1С:Предприятия 8 через внешнее соединение, выполняется следующая последовательность действий:
  • создается менеджер COM-соединений, с помощью которого производится установка соединения;
  • производится обращение к методу Connect менеджера COM-соединений. Метод Connect возвращает внешнее соединение с информационной базой 1С:Предприятия 8;
  • через внешнее соединение производится обращение к допустимым методам, свойствам и объектам информационной базы, с которой установлено соединение.
Важно! В связи с отсутствием пользовательского интерфейса не все объекты, а также свойства и методы можно использовать во внешнем соединении.
Внешнее соединение предоставляет полный доступ к своему глобальному контексту. Поэтому внешнее соединение в качестве своих методов может иметь: системные константы, значения заданных в конфигураторе объектов, доступ к которым осуществляется с помощью менеджеров (например, константы, перечисления, справочники, документы, журналы документов, отчеты, обработки, планы видов характеристик, планы счетов, планы видов расчета, регистры), а также переменные, объявленные в модуле внешнего соединения с ключевым словом Экспорт.

Доступность:

Интеграция.

Вопрос: COM соединение, план видов характеристик


Задача – программно создать новый элемент в известном плане видов характеристик через COM соединение. Соединение установлено, тут всё нормально.

Я пишу так:

ОписаниеТиповТек = Новый ОписаниеТипов ("СправочникСсылка. Контрагенты"); НазначениеСвойства = Соединение. ПланыВидовХарактеристик. НазначенияСвойствКатегорийОбъектов. НайтиПоНаименованию ("Справочник ""Физические лица"""); НовыйЭлемент = Соединение. ПланыВидовХарактеристик. СвойстваОбъектов. СоздатьЭлемент (); НовыйЭлемент. Наименование = НаименованиеСвойства; НовыйЭлемент. НазначениеСвойства = НазначениеСвойства; НовыйЭлемент. ТипЗначения = ОписаниеТиповТек;

Последняя строка не срабатывает. И это понятно, он находит такой тип для базы, где 1С запущен, но мне-то нужен тип для присоединённой базы. А как его получить?

В моём варианте просто создаётся элемент с типом значения «Произвольный список». Оно работает в принципе, но некрасиво как-то.

Плватформа 8.3. COM-соединение – непременное условие. Решения без его использования не интересуют.

Ответ:

Прокатывает. Спасибо, оно заработало.

Вопрос: COM соединение. Проблема с параметром запроса


Доброго времени суток.
Проблема с запросом по COM-соединению.

Перем ТЗ; МассивНоменклатуры = COM.NewObject("Массив"); Для Каждого Строка из ТЗНоменклатуры Цикл Номенклатура = COM.Справочники.Номенклатура.ПолучитьСсылку(COM.NewObject("УникальныйИдентификатор", СокрЛП(Строка.Номенклатура.Идентификатор))); МассивНоменклатуры.Add(Номенклатура); КонецЦикла; Если МассивНоменклатуры.Количество() <> 0 Тогда Запрос = COM.NewObject("Запрос"); Запрос.Текст = "ВЫБРАТЬ |ЦеныНоменклатурыСрезПоследних.ТМЦ КАК Номенклатура, |ЦеныНоменклатурыСрезПоследних.ОтпускнаяЦена КАК Цена, |ЦеныНоменклатурыСрезПоследних.СтавкаНДС, |ЦеныНоменклатурыСрезПоследних.СтавкаНП |ИЗ |РегистрСведений.ЦеныТМЦ.СрезПоследних(|&ДатаДок, |ТипЦены = &ТипЦены |И ТМЦ В (&МассивНоменклатуры) |И ТМЦ.ЭтоГруппа = ЛОЖЬ |И Регистратор ССЫЛКА Документ.УстановкаОтпускныхЦен) КАК ЦеныНоменклатурыСрезПоследних"; Запрос.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры); Запрос.УстановитьПараметр("ДатаДок", КонецДня(СтруктураПараметров.ДатаДок)); Запрос.УстановитьПараметр("ТипЦены", COM.Справочники.ТипыЦен.GetRef(COM.NewObject("УникальныйИдентификатор", СтруктураПараметров.ТипЦены.Идентификатор))); ТЗ = COM.NewObject("ТаблицаЗначений"); ТЗ = Запрос.Выполнить().Выгрузить(); Иначе ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Номенклатура"); ТЗ.Колонки.Добавить("Цена"); ТЗ.Колонки.Добавить("Процент"); ТЗ.Колонки.Добавить("СтавкаНДС"); КонецЕсли;

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

Ответ:

Попробуйте через ВремТабл сделать. Создайте таблицу значений с колонками соотв. типа, заполните её, подтяните в запрос, и потом наложите обор соединением внутренним.

Вопрос: Com соединение из файловой базы к файловой


Доброе утро. Есть файловая база 8.3, из нее по comсоединению пытаюсь подключиться к другой файловой базе:

Каталог = "C:\Users\1C\Документооборот (тест)"; Пользователь = "Администратор"; Пароль = ""; ПараметрыПодключения = "File="+Каталог+";Usr="+Пользователь+";Pwd="+Пароль+";"; V83 = Новый COMОбъект("V83.COMConnector"); Попытка Соединение = V83.Connect(ПараметрыПодключения); Исключение Сообщить("Не удалось соединится с документооборотом!"); КонецПопытки;


Вызывается исключение, без описания ошибки.
Обе базы принудительно запускаются в 8.3. Каталог и пользователь - указаны верно. В чем может быть причина?

Ответ:

Пишу строку кода V82 = Новый COMОбъект("V83 .COMConnector"); а остальной код как ниже, без изменений.

Когда версии у платформ источника и приёмника различные, возникает ошибка.

Не понятно какой версии регистрировать библиотеку и где её регистрировать?

Думаю нужно регистрировать библиотеку, версии 8.2.18.61, и делаю это через bat-файл

regsvr32 /n /i:user "C:\Program Files (x86)\1cv82\8.2.18.61\bin\comcntr.dll"
pause

msk-test1c:1641 -- это сервер 8.3.5.1098
V82 = Новый COMОбъект ("V82. COMConnector"); Сообщить ("Подключение к Бухгалтерии 3. 0 ... "); Попытка Connect = V82. Connect ("srvr = ""msk- test1c:1641""; ref = ""db_test""; usr = ""Администратор""; pwd = ""123"""); Сообщить ("УРА подключение установлено! "); Исключение Сообщить ("Нет подключения к базе данных! "); Сообщить (ОписаниеОшибки ()); // Инфо = ИнформацияОбОшибке (); // Сообщить ("Описание="" + Инфо.Описание + "" "); // Сообщить ("ИмяМодуля="" + Инфо.ИмяМодуля + "" "); // Сообщить ("НомерСтроки=" + Инфо. НомерСтроки); // Сообщить ("ИсходнаяСтрока="" + Инфо.ИсходнаяСтрока + "" "); Возврат; КонецПопытки;

Где регистрировать библиотеку, на клиенте, на сервере 8.2., на сервере 8.3 ? рис.ниже.
(для клиент-серверного варианта, и для файлового варианта базы 1С)

Ответ: Появилась задача через вебсервис сделать общение с одним терминалом. База - нууу допустим легкая ут. Тоже 0.5 или быстрее?

сложно сказать - у меня мало данных. Нас и 0,5 сек порадовали и минус ненужный клиент 1с на сторонней машине, минус синхронизация версий библиотек после обновления движка 1с, минус проклятые богом comsafearray, нормальные имена и типы полей... Думал нас с другой стороны (система которая интегрируется с 1С) "не поймут" когда выяснится, что надо переписывать вызовы 1С у себя на новую "модель общения систем". Но попробовав раз в тестовой базе одну функцию теперь нас теребят "давайте скорее на сервис переходить".

Вопрос: Как использовать ТипСодержит для объектов Com?


Если Реквизит.Тип.СодержитТип(Тип("СправочникСсылка.Номенклатура")) Тогда ЕстьНоменклатура = Истина; КонецЕсли;

"Реквизит" получен из com-соединения с другой базой 1с. Вываливается при сравнении ошибка:

{ВнешняяОбработка.ПересчетКоэффициента.Форма.Форма.Форма(183)}: Ошибка при вызове метода контекста (СодержитТип)
Если Реквизит.Тип.СодержитТип(Тип("СправочникСсылка.Номенклатура")) Тогда
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.3.8.1964): Несоответствие типов (параметр номер "1")

Я так подозреваю надо сравнивать с типом в соm? Как правильно проверить тип?

Ответ:

Не не катит. Решил вопрос так:
В базе приемнике в общем модуле с галкой внешнее соединение код:

Функция ПроверитьТипРеквизита(Реквизит, Тип) Экспорт Возврат Реквизит.Тип.СодержитТип(Тип(Тип)); КонецФункции

В базе из которой подключаюсь вызываю процедуру через Com:

ComConnection.Авис_ПроцедурыОбмена.ПроверитьТипРеквизита(Реквизит, "СправочникСсылка.Номенклатура")