Цитата:Или 1CPP не анализирует 1Cv7.DDS?
1c++ не анализирует ни 1cv7.md, ни 1cv7.dds, ни какой-либо другой словарь. Для получения информации о метаданных на использует внутренние данные самой 1С, точно те же что и использует сама 1С, которые сама 1с и строит при запуске.
Цитата:А нельзя ли в 1CPP сделать функцию формирующую такой словарь?
А зачем? Есть объект Метаданные, есть MetaDataWork, каждый может себе построить метаданные семерочной базы в том виде и формате в котором ему удобно.
Например для доступа из 8-ки я использую метаданные 7.7 в виде вложеных структур:
Функция ЗагрузитьМетаданные(КаталогИБ, ИмяПользователяV7, ПарольПользователяV7) Экспорт
МД = Новый Структура;
Состояние("Подключение к " + КаталогИБ);
V7 = Новый COMОбъект("V77.Application");
Если V7.Initialize(V7.RMTrade, "/d"""+КаталогИБ+""" /n"+ИмяПользователяV7+" /p"+ПарольПользователяV7, "NO_SPASH_SHOW") = 0 Тогда
Сообщить("Нет доступа к информационной базе.");
Возврат Ложь;
КонецЕсли;
MDW = V7.CreateObject("MetaDataWork");
MD = V7.Метаданные;
Состояние("Загрузка справочников..");
Ст1 = Новый Структура;
МД.Вставить("Справочник", Ст1);
Для Номер1 = 1 По MD.Справочник() Цикл
МДСправочник = MD.Справочник(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДСправочник.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДСправочник));
Для Номер2 = 1 По МДСправочник.Реквизит() Цикл
МДРеквизит = МДСправочник.Реквизит(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
КонецЦикла;
Состояние("Загрузка перечислений..");
Ст1 = Новый Структура;
МД.Вставить("Перечисление", Ст1);
Для Номер1 = 1 По MD.Перечисление() Цикл
МДПеречисление = MD.Перечисление(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДПеречисление.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДПеречисление));
Для Номер2 = 1 По МДПеречисление.Значение() Цикл
МДЗначение = МДПеречисление.Значение(Номер2);
Ст2.Вставить(МДЗначение.Идентификатор, V7.EvalExpr("_idtostr("+MDW.ИДОбъекта(МДЗначение)+")")+" ");
КонецЦикла;
КонецЦикла;
Состояние("Загрузка документов..");
Ст1 = Новый Структура;
МД.Вставить("Документ", Ст1);
Для Номер1 = 1 По MD.Документ() Цикл
МДДокумент = MD.Документ(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДДокумент.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДДокумент));
Для Номер2 = 1 По МДДокумент.РеквизитШапки() Цикл
МДРеквизит = МДДокумент.РеквизитШапки(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
Для Номер2 = 1 По МДДокумент.РеквизитТабличнойЧасти() Цикл
МДРеквизит = МДДокумент.РеквизитТабличнойЧасти(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
КонецЦикла;
Состояние("Загрузка регистров..");
Ст1 = Новый Структура;
МД.Вставить("Регистр", Ст1);
Для Номер1 = 1 По MD.Регистр() Цикл
МДРегистр = MD.Регистр(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДРегистр.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДРегистр));
Для Номер2 = 1 По МДРегистр.Измерение() Цикл
МДИзмерение = МДРегистр.Измерение(Номер2);
Ст2.Вставить(МДИзмерение.Идентификатор, MDW.ИДОбъекта(МДИзмерение));
КонецЦикла;
Для Номер2 = 1 По МДРегистр.Ресурс() Цикл
МДРесурс = МДРегистр.Ресурс(Номер2);
Ст2.Вставить(МДРесурс.Идентификатор, MDW.ИДОбъекта(МДРесурс));
КонецЦикла;
Для Номер2 = 1 По МДРегистр.Реквизит() Цикл
МДРеквизит = МДРегистр.Реквизит(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
КонецЦикла;
Константы.МетаданныеУдаленнойИБ.Установить(Новый ХранилищеЗначения(МД));
Возврат Истина;
КонецФункции
При этом для построения запросов метаданные используются примерно так:
Процедура ЗагрузитьПродажи(Connection, Отказ)
КомментироватьПроцесс("Загружаются продажи..");
МДПродажи = МД.Регистр.Продажи;
ТекстЗапроса = "
|select
| Данные.Период,
| Данные.СтавкаНДС,
| Данные.КассовыйТерминал,
| Кассы.code as КассовыйТерминалКод,
| Кассы.descr as КассовыйТерминалНаименование,
| Данные.Выручка
|from (
| select
| rg.period as Период,
| rg.sp"+МДПродажи.СтавкаНДС+" as СтавкаНДС,
| rg.sp"+МДПродажи.КассовыйТерминал+" as КассовыйТерминал,
| sum(rg.sp"+МДПродажи.Выручка+") as Выручка
| from rg"+МДПродажи.ИД+" rg (nolock)
| where period between '"+мДатаНач+"' and '"+мДатаКон+"'
| group by rg.period, rg.sp"+МДПродажи.СтавкаНДС+", rg.sp"+МДПродажи.КассовыйТерминал+"
| having sum(rg.sp"+МДПродажи.Выручка+") != 0
|) as Данные
|left join sc"+МД.Справочник.Кассы.ИД+" Кассы (nolock) on Кассы.id = Данные.КассовыйТерминал
|order by Данные.Период, Кассы.descr
|
|";
РезультатЗапроса = мУтилиты.ADORecordsetВРезультатЗапроса(Connection.Execute(ТекстЗапроса), "Максимум(КассовыйТерминалКод), Максимум(КассовыйТерминалНаименование), Сумма(Выручка) по Период, СтавкаНДС");
....
Думаю что такой принцип применим в любой среде разработки.