Некоторая работа с данными через COM

назад


Опубликовал wowik в раздел Программирование - Практика программирования


В статье приведены примеры работы с Платформой 8.X через COM (точнее, через объект COMConnector). Примеры кода были использованы при реализации прикладных задач в процессе трудовой деятельности.

Работать с использованием COM можно между базами работающими на платформе 8.Х одного релиза (подключаться можно только к той платформе, которая имеет тот же релиз, что и текущая, и никак иначе, т.к. при данном виде подключения используются интерфейсы текущей базы). Правда, стоит отметить, можно обойти момент с релизами: например, подключаемся из 8.2.13 к 8.2.14, заменив библиотеку «comcntr.dll» из папки «bin» платформы 8.2.14 на аналогичную из 8.2.13 - но получается не вся функциональность, а «некоторая», с кучей ошибок).

Статей по технологии COM достаточно много, в данной статье приведены примеры, которые можно сразу скопировать и вставить в свою конфигурацию.

При подключении с использованием COM, в подключенной базе есть некоторые ограничения: не работают события связанные с интерфейсом(модуль управляемого приложения, модуль сеанса), но работают события модуля внешнего соединения.


Создание com подключения к базе:

Процедура ПодключениеКБазе1С(ПутьКБазе, Пользователь, Пароль = "", Сервер, БазаДанных)    
        СтрокаПодключения = "";
        Если Не ПустаяСтрока(Сервер)  Тогда
                 СтрокаПодключения = "Srvr=""" + Сервер + """;Ref=""" + БазаДанных + """;Usr=""" + Пользователь + """;Pwd=""" + Пароль + """";
        Иначе    
                  СтрокаПодключения = "File=""" + ПутьКБазе + """;Usr=""" + Пользователь + """;Pwd=""" + Пароль + """";
        КонецЕсли;
       cntr = Новый COMObject("v82.COMConnector");
       COMCоединение            = cntr.Connect(СтрокаПодключения);
КонецПроцедуры

Получение типа «ДокументСсылка.ПриходнаяНакладная» из подключенной базы:

Тип = COMCоединение.NewObject("ОписаниеТипов","ДокументСсылка.ПриходнаяНакладная").Типы().Получить(0);

Получение типа «СправочникСсылка.Номенклатура» из подключенной базы:

Тип = COMCоединение.NewObject("ОписаниеТипов","СправочникСсылка.Номенклатура").Типы().Получить(0);

Создание объекта «Запрос»:

Запрос = COMCоединение.NewObject("Запрос");

Создание объекта «Структура»:

Вариант 1.

ПараметрыПоиска  = COMCоединение.NewObject("Структура","КлючСвязиСерийныхНомеров",123);

Вариант 2.

ПараметрыПоиска  = COMCоединение.NewObject("Структура"); ПараметрыПоиска.Вставить("КлючСвязиСерийныхНомеров",123);

Создание объекта «СписокЗначений»:

СЗ = COMCоединение.NewObject("СписокЗначений");

Создание таблицы значений:

ИтоговаяТаблица = COMCоединение.NewObject("ТаблицаЗначений");

Добавление колонок таблицы значений:

ИтоговаяТаблица.Колонки.Добавить("Номенклатура", COMCоединение.NewObject("ОписаниеТипов","СправочникСсылка.Номенклатура"));

Получение ссылки на документ если известен уникальный идентификатор:

Документ1С = COMCоединение.Документы.ПриходнаяНакладная.ПолучитьСсылку(COMCоединение.NewObject("УникальныйИдентификатор", УникальныйИдентификаторДокументаВВидеСтроки));

Проверка что ссылка не пустая и не «битая»:

Если Найти(COMCоединение.String(Документ1С),"не найден") = 0 Тогда   //документ найден

Проверка реквизита справочника с типом «Перечисление»на соответствие определенному значению:

COMCоединение.XMLстрока(Номенклатура.ВидНоменклатуры.НастройкаИспользованияСерий) =  "ЭкземплярТовара";

Сравнение ссылок объектов (при сравнении ссылочных Com-объектов, как показывает практика, нужно сравнивать их по коду или по ссылке, а не напрямую):

COMCоединение.xmlстрока(НоменклатураСсылка.НаборУпаковок) = COMCоединение.xmlстрока(COMCоединение.Справочники.НаборыУпаковок.ИндивидуальныйДляНоменклатуры)

вместо

НоменклатураСсылка.НаборУпаковок = COMCоединение.Справочники.НаборыУпаковок.ИндивидуальныйДляНоменклатуры