Три кита работы с COM-объектами. Работать через COM-соединение проще, чем вы думаете. V8: COM-соединение Com подключение 1с 8.3 сервер

Три кита работы с COM-объектами. Работать через COM-соединение проще, чем вы думаете. V8: COM-соединение Com подключение 1с 8.3 сервер

Вопрос: Парсинг сайта через 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.Авис_ПроцедурыОбмена.ПроверитьТипРеквизита(Реквизит, "СправочникСсылка.Номенклатура")

)Все верно

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


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

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


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

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


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

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


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

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

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

Одним из способов перенести данные из одной конфигурации 1С в другую является программное подключение с помощью COM. Многие компании используют несколько различных баз, между которыми должны быть определенные связи и зависимости. Если необходимо не только перенести данные, но и выполнить определенную обработку данных, то COM соединение будет оптимальным механизмом. Умение анализировать данные из другой базы 1С пригодиться любому разработчику.

Подключаемся через COM к базе 1С

Для реализации COM соединения в 1С используется специальный механизм под названием COMConnector. Этот объект устанавливается вместе с платформой и применяется для связи информационных баз. Следует учесть, что для версий 8.2 и 8.3 используются разные по наименованию объекты – «V82.COMConnector» и «V83.COMConnector» соответственно.

Помните, что на время COM соединения к базе тратиться лицензия – не стоит увлекаться одновременным выполнением нескольких подключений. Особенно это важно для организаций, у которых количество лицензий ограничено. Решиться этот вопрос может при помощи регламентных заданий, выполняющихся во время отсутствия активных подключений пользователей к информационной базе.

Чтобы иметь возможность подключиться к другой базе и запросить нужную информацию вы должны знать следующие данные:

  1. Какого она типа – файловая или клиент-серверная;
  2. Где она располагается;
  3. Под каким именем и паролем в нее можно зайти;
  4. Какие данные вас интересуют.

Из первых трех пунктов для реализации COM соединения необходимо сформировать строку параметров. В зависимости от типа ИБ она будет отличаться внешним видом. Используя полученную строку, происходит подключение, с помощью которого можно собирать для анализа и обработки данные из другой базы любыми методами.

ПараметрыПодключенияФайловойИБ = "Filе=""Путь_к_базе""; Usr=""Имя_пользователя"";Pwd=""Пароль"""; ПараметрыПодключенияКлиентСервернойИБ = "Srvr=""Имя_Сервера""; Ref=""Имя_базы""; Usr=""Имя_пользователя""; Pwd=""Пароль""";

Функция подключения проста и не должна вызвать вопросов, если все параметры указаны верно. Для ускорения отладки и анализа возможных ошибок лучше заключить подключение в конструкцию «Попытка». Возвращать функция будет значение типа «COM объект», с которым и предстоит работать, получая нужные данные.

&НаСервере Функция ПодключитьсяКбазе() экспорт ПараметрыПодключенияИБ = "Filе=""Е:\базы 1с\ЕRР""; Usr=""Администратор"";Pwd=""1"""; V83COMCon= Новый СОMОбъект("V83.COMConnector"); Попытка Возврат V83COMCon.Connect(ПараметрыПодключенияИБ); Исключение Сообщить(ОписаниеОшибки()); Возврат Неопределено; КонецПопытки; КонецФункции

Через COM соединение вы можете не только выбирать данные, но и добавлять их в базу, к которой подключаетесь. Помните, что передавать через COM объект мы можем 4 примитивных типа данных. Другие типы придется задавать с помощью встроенных в платформу функций поиска. Учтите, что глобальные функции платформы вызываются тоже через COM-соединение.

Получаем данные из базы 1С

После того как получили нужный объект, необходимо прочитать данные из другой базы. Для этого мы применяем запрос через COM соединение в 1С 8.3 с помощью полученного значения типа «COM объект» из функции. Важно сначала подключиться к базе, а затем уже выполнять запрос. Выполнение происходит через метод NewObject с указанием в качестве параметра типа объекта в строковом виде – «Запрос».

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

К примеру, чтобы получить информацию о пользователях определенного подразделения, зададим условие в запрос через параметры. Один параметр будет простого типа – строка, а подразделение – ссылкой элемента справочника «Структура предприятия». Результат запроса является таблицей с перечисленными полями того типа, какого они существуют в базе, к которой произошло COM соединение. Если необходимо их преобразовать в другие типы – воспользуйтесь стандартными функциями платформы:

  • Строка();
  • Число();
  • Дата().
ЗапросБПЗО = Соединение.NewObject("Запрос"); ЗапросБПЗО.Текст = "ВЫБРАТЬ первые 15 | СправочникПольз.Наименование КАК Наименование |ИЗ | Справочник.Пользователи КАК СправочникПольз I ГДЕ | СправочникПольз.Подразделение = &НужноеПодразделение | И СправочникПольз.Наименование подобно ""%"" + &НужноеИмя+ ""%"""; ЗапросБПЗО.УстановитьПараметр("НужноеПодразделение",Соединение.Справочники.СтруктураПредприятия.НайтиПоКоду("00-000023")); ЗапросБПЗО.УстановитьПараметр("НужноеИмя","Екатерина"); Выборка = ЗапросБПЗО.Выполнить().выбрать(); Пока Выборка.следующий() цикл Сообщить(Выборка.Наименование); КонецЦикла;

Если нужно передать в базу массив для отбора по нескольким параметрам, например, подразделениям, тоже используется команда NewObject. Аналогично можно передавать список или таблицу значений, заполняя их элементами другой базы через соединение. Для поиска вам доступны все существующие методы объектов и механизмов платформы.

ЗапросБПЗО = Соединение.NewObject.("Запрос"); ЗапросБПЗО.Текст = "ВЫБРАТЬ первые 15 | СправочникПольз.Наименование КАК Наименование | ИЗ | Справочник.Пользователи КАК СправочникПольз I ГДЕ | СправочникПольз.Подразделение В (&НужноеПодразделение) | И СправочникПольз.Наименование подобно ""%"" + &НужноеИмя+ ""%"""; МассивПодразделений = Соединение.NewObject("Массив"); МассивПодразделений.Добавить(Соединение.Справочники.СтруктураПредприятия.НайтиПоКоду("00-000023")); МассивПодразделений.Добавить(Соединение.Справочники.СтруктураПредприятия.НайтиПоКоду("00-000038")); МассивПодразделений.Добавить(Соединение.Справочники.СтруктураПредприятия.НайтиПоКоду("00-000046")); ЗапросБПЗО.УстановитьПараметр("НужноеПодразделение", МассивПодразделений); ЗапросБПЗО.УстановитьПараметр("НужноеИмя","Екатерина"); Выборка = ЗапросБПЗО.Выполнить().выбрать(); Пока Выборка.следующий() цикл Сообщить(Выборка.Наименование); КонецЦикла;

При переносе документов или элементов справочников всегда возникает вопрос о контроле переноса определенного объекта. С помощью COM соединений можно решить подобные проблемы через уникальный идентификатор. Нужно найти объект в подключаемой базе по идентификатору из текущей ИБ с помощью функции «ПолучитьСсылку», используя идентификатор в виде строки. Если такового не нашлось, вы можете создать его с помощью COM соединения.

СтрИдент = Строка(Справочники.Пользователи.НайтиПоКоду("00-0000313").УникальныйИдентификатор()); Если НЕ ЗначениеЗаполнено(Соединение.Справочники.Пользователи.ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор", СтрИдент))) тогда НовыйПользователь = Соединение.Справочники.Пользователи.СоздатьЭлемент(); НовыйПользователь.Наименование = Справочники.Пользователи.НайтиПоКоду("00-0000313").Наименование; НовыйПользователь.ФизическоеЛицо = Справочники.Пользователи.НайтиПоКоду("00-0000313").ФизическоеЛицо; НовыйПользователь.Записать(); КонецЕсли;

Также COM соединение имеет право использовать процедуры и функции из общих модулей 1С с включенным свойством «Внешнее соединение». Кроме этого условия, вызываемая функция или процедура должна быть экспортная и не включать интерактивные действия, выполняемые на сервере. В противоположном случае вы увидите ошибку о недопустимости операции.

Соединение..; ПеременнаяИзФункции = Соединение..; вызовфункции>имяобщегомодуля>вызовпроцедуры>имяобщегомодуля>

Возможности внешнего соединения с другой базой в 1С достаточно обширны и могут позволить выполнить множество задач. Важно уметь правильно оценить инструментарий и выбрать оптимальное решение. В большинстве случаев это умение появляется лишь с опытом или изучая примеры работ опытных специалистов.

Печать (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);