helpf.pro
Регистрация

v8: Перебор коллекции через Com-соединение во внешней программе

CGrey
02.05.2012 13:40Прочитано: 7534
Здравствуйте, помогите если кто-то сталкивался. Во внешнем приложении написанном на C# получаю ссылку на "СправочникиМенеджер", хочу с помощью него получить имена справочников присутствующих в системе. В справке сказано, что это коллекция типов "СправочникМенеджер". Как их перебрать в коде C#? Обертка для com самописная, и ссылка возвращается в типе object. Или быть может подскажите, как получить ссылку на "Метаданные" через COM?
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
02.05.2012 14:34Ответ № 1
(0) CGrey, справочники в 1С перебираются так
Код 1C v 8.2 УП
 Для Каждого Справочник из Метаданные.Справочники Цикл
Сообщить (Справочник.Имя);
КонецЦикла;

а через менеджер можно выйти только на метаданные конкретного справочника.
CGrey
02.05.2012 15:04Ответ № 2
E_Migachev, спасибо. Просто я не знаю, как попросить эти самые "Метаданные" из COM-соденинения. Например вот так:
Код
connection1C.GetType().InvokeMember("Метаданные", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Static, null, target, null);
, это завершается эксепшном про отсутствие такого члена.
E_Migachev
02.05.2012 16:50Ответ № 3
(2) CGrey, по С# не скажу, но по 1С так:
Код 1C v 8.х
 Перем НомерЗакладки;
Перем connection,cntr;
Перем Истина,Ложь;
Функция ОткрытиеБазы(ТипОткрытия)
cntr = СоздатьОбъект(ТипОткрытия);
Попытка
Если НомерЗакладки=1 Тогда
connection = cntr.Connect("File="""+СокрЛП(ПутьКбазе)+""";Usr="""+СокрЛП(Логин)+""";Pwd = """ + СокрЛП(Пасворд) + """;");
Иначе
connection = cntr.Connect("Srvr="""+СокрЛП(ИмяСервера)+""";Ref="""+СокрЛП(ИмяБазы)+""";Usr="""+СокрЛП(Логин)+""";Pwd = """ + СокрЛП(Пасворд) + """;");
КонецЕсли;
Исключение
Предупреждение(ОписаниеОшибки());
КонецПопытки;
КонецФункции
Функция ВызовФункций()
ОткрытиеБазы("V81.Application");
Если connection=Истина Тогда
Сообщить("Вернули неопределено= "+cntr.ВернутьНеопределено());
Сообщить("Вернули NULL= "+cntr.ВернутьNULL());
Сообщить("Вернули Истину= "+cntr.ВернутьИстину());
Сообщить("Вернули Ложь= "+cntr.ВернутьЛожь());

КонецЕсли;
cntr = "";
КонецФункции
Истина=-1;Ложь=0;

// функция работы с метаданными
Функция РаботаСметаданными()
ОткрытиеБазы("V81.Application");
Если connection=Истина Тогда
Сообщить("Версия "+cntr.Метаданные.Версия);
Сообщить("==================Константы==================");
Для Инд=0 по cntr.Метаданные.Константы.Количество()-1 Цикл
Конст=cntr.Метаданные.Константы.Получить(Инд);
Сообщить(Конст.Имя);
Сообщить("Тип:");
Массив = Конст.Тип.Типы();
Типов = Массив.Количество() - 1;
для а = 0 по Типов цикл
сообщить(cntr.String(Массив.Получить(а)));
конеццикла;
КонецЦикла;
cntr = "";
КонецЕсли;
КонецФункции

// обратимся к работе с данными
Функция РаботаСБазой()
ОткрытиеБазы("V81.Application");
Если connection=Истина Тогда
Стр="";
Если ВвестиСтроку(Стр,"Наименование",40)=1 Тогда
Эл=cntr.Справочники.Справочник1.НайтиПоНаименованию(СокрЛП(Стр));
Если Эл.Пустая()=Истина Тогда
Эл=cntr.Справочники.Справочник1.СоздатьЭлемент();
Эл.Наименование=СокрЛП(Стр);
Эл.Записать();
Сообщить("ЗначениеВСтрокуВнутр="+cntr.ЗначениеВСтрокуВнутр(Эл.Ссылка));
Сообщить("XMLСтрока="+cntr.XMLСтрока(Эл.Ссылка));
Сообщить("=======XMLТипЗнч======");
XMLРез=cntr.XMLТипЗнч(Эл.Ссылка);
Сообщить("URIПространстваИмен="+XMLРез.URIПространстваИмен);
Сообщить("ИмяТипа="+XMLРез.ИмяТипа);
КонецЕсли;
cntr.Константы.Константа3.Установить(Эл.Ссылка);
КонецЕсли;
КонецЕсли;
cntr = "";
КонецФункции

Работа с запросами
Функция РаботаСЗапросами()
ОткрытиеБазы("V81.Application");
Если connection=Истина Тогда
Констр=cntr.NewObject("КонструкторЗапроса");
Если Констр.ОткрытьМодально()=Истина Тогда
ТекстЗапроса=Констр.Текст;
cntr = "";
ОткрытиеБазы("V81.ComConnector");
Запрос=connection.NewObject("Запрос");
Запрос.Текст=ТекстЗапроса;
Рез=Запрос.Выполнить().Выгрузить();
Таб=СоздатьОбъект("Таблица");
Для Инд=0 по Рез.Колонки.Количество()-1 Цикл
Кол=Рез.Колонки.Получить(Инд);
Обл=Таб.Область("R1C"+Строка(Инд+1));
Обл.Текст=Кол.Имя;
Конеццикла;
Для Инд=0 по Рез.Количество()-1 Цикл
Стр=Рез.Получить(Инд);
Кол=0;
Для Кол=0 по Рез.Колонки.Количество()-1 Цикл
Обл=Таб.Область("R"+Строка(Инд+2)+"C"+Строка(Кол+1));
Обл.Текст=connection.String(Стр.Получить(Кол));
КонецЦикла;
КонецЦикла;
Таб.Показать();
Иначе
Сообщить("!Запрос не создан");
КонецЕсли;
КонецЕсли;
cntr = "";
connection = "";
КонецФункции

CGrey
03.05.2012 17:00Ответ № 4
Спасибо за помощь, получилось перебрать имена переведя полученный результат к IEnumerable , его стало можно перечислять через foreach. Потом на каждом элементе коллекции вызвал метод "ПолучитьСсылку", получив объект "СправочникСсылка". Из него вызвал метод "Метаданные", а уже из объекта метаданных справочника получил "Имя" и "Синоним".

Единственное, что не понимаю, это как по COM получить ссылку на "Метаданные" системы, чтобы напрямую из них получить и Справочники и прочее, не создавая объекты вручную.
CGrey
05.05.2012 14:38Ответ № 5
Энивэй, спасибо)
Подсказка: Вы можете приложить к ответу файл или изображение щелкнув по значку или в редакторе.
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.