COM-подключение к базе 7.7 из 8.2 1С Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине.
Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)):
Код 1C v 8.2 УП &НаКлиенте
Процедура Загрузки()
ПутьКБазе="D:\ВашаБаза\1с77\";
Пользователь="stvbliz";//пользователь базы 7.7
Пароль="вашпароль";
МонопольныйРежимOLE = ""; // " /m";
ЗапускБезЗаставки = 1;
База = Новый COMОбъект("V1CEnterprise.Application");
СтрокаПодключения = "/D"""+СокрЛП(ПутьКБазе)+""" /N"""+СокрЛП(Пользователь)+""" /P"""+СокрЛП(Пароль)+"""";
РезультатПодключения=База.Initialize(База.RMTrade,СтрокаПодключения,?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));
Если НЕ РезультатПодключения Тогда
Сообщить("Не удалось произвести подключение к информационной базе");
КонецЕсли;
Таблица.Очистить();
Док = База.CreateObject("Документ.ЗаявкаПокупателя");
Док.ВыбратьДокументы(НачалоНедели(Дата),КонецНедели(Дата));
Пока Док.ПолучитьДокумент() = 1 Цикл
ОбработкаПрерыванияПользователя();
Если Док.НомерДок = НомерЗаявки Тогда
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку()=1 Цикл
нов=Таблица.Добавить();
нов.Номенклатура = Док.Номенклатура.Наименование;
нов.Количество = Док.Количество;
нов.Единица = Док.Единица.Наименование;
нов.Цена = Док.Цена;
Нов.Сумма = Док.Сумма;
нов.Коэффициент = Док.Коэффициент;
нов.Производитель = Док.производитель;
Нов.Валюта = Док.Валюта.Наименование;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Док=NULL;
КонецПроцедуры
Код 1C v 8.2 УП //Примеры получения значений
//Периодический реквизит нужно получать на дату
ДатаОст= ТекущаяДата();
Спр77Оле.ВидГрейда.Получить(ДатаОст).код;
// Перечисление
Если База77ОЛЕ.ВидКонтрагента.Идентификатор() = "ЧастноеЛицо"
// или
Если Сотрудник.ХарактерРаботы.Получить(Необходимая_Дата).Идентификатор() = БазаОЛЕ.EvalExpr ("Перечисление.ХарактерРаботы.ТрудовыеОтношения.Идентификатор()") Тогда
// Принадлежит ...
КонецЕсли;
//В запросе
// в v7 ссылка OLE
Запрос = v7.CreateObject("Запрос");
ТипТовара = v7.evalexpr ("Перечисление.ТипыТоваров.Собственный.ПорядковыйНомер()");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
|Наименование = Справочник.Номенклатура.Наименование;
|ТипТовара = Справочник.Номенклатура.ТипТовара;
|ЕдиницаИзмерения = Справочник.Номенклатура.ЕдиницаИзмерения;
|Функция Счётчик = Счётчик();
|Группировка ТекущийЭлемент;
|Условие(ТипТовара.ПорядковыйНомер() = "+ТипТовара+");
|"//}}ЗАПРОС
;
Категория:
COM-объекты, WMI, WSH Пример простой реализации OLE доступа из 8 к 77 Код 1C v 8.х V77 = Новый COMОбъект("V77M.Application");
Если V77.Initialize(V77.RMTrade,"ИсточникСтр","") Тогда
Сообщить("Успех");
Накл= V77.EvalExpr ("CreateObject(""Документ.РасходнаяНакладная"")");
ДокОсн= V77.EvalExpr ("CreateObject(""Документ"")");
Накл.ВыбратьДокументы();
Пока Накл.ПолучитьДокумент()=1 Цикл
Номер=СокрЛП(Накл.НомерДок);
ДокСоотв=Документы.РеализацияТоваров.НайтиПоНомеру(СокрЛП(Номер), Накл.ДатаДок);
Если Накл.Проведен()=0 Тогда
Продолжить;
КонецЕсли;
Если ДокСоотв=Документы.РеализацияТоваров.ПустаяСсылка() Тогда
Сообщить("! для "+Накл.Вид()+" "+Накл.НомерДок+" не найдено соответстствие");
Продолжить;
КонецЕсли;
Если Накл.ДокументОснование.Выбран()=0 Тогда
Продолжить;
КонецЕсли;
// и т.д.
Иначе Предупреждение("Ошибка открытия информационной базы");
Возврат;
КонецЕсли;
Категория:
COM-объекты, WMI, WSH Функция формирует объект Структура, содержащая метаданные 77 для составления прямых запросов Код 1C v 8.х Функция ЗагрузитьМетаданные(КаталогИБ, ИмяПользователя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.ИДОбъекта(МДРеквизит));
КонецЦикла;
КонецЦикла;
Константы.МетаданныеУдаленнойИБ.Установить(Новый ХранилищеЗначения(МД));
Возврат Истина;
КонецФункции
Формируется конечно не быстро, но Структура - объект сериализуемый, поэтому ее надо просто хранить в ХранилищеЗначения в базе 8ки, и восстанавливать перед каждым переносом данных, а не формировать заново. Обновлять ее можно периодически при изменении конфигурации, ито если изменения влияют на перенос данных.
Обратите внимание: все идентификаторы объектов в 10ой системе, а идентификаторы значений перечислений в 36ой.
DmitrO Категория:
COM-объекты, WMI, WSH