Рассмотрим практический пример выполнения прямого запроса к двум базам DBF одновременно для получения синхронизированных данных.
Для того чтобы использовать прямой доступ к данным с помощью Microsoft OLE DB Provider необходимо установить 1С++ и OLE DB Provider.
- Компоненту 1С++ можно скачать на официальном ресурсе.
- OLE DB Provider можно скачать на официальном сайте Microsoft.
После записи ВК 1С++, допустим, в каталог ИБ, необходимо выполнить ее загрузку:
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "1cpp.dll") = 0 Тогда Сообщить("ВК 1С++ не загружена!"); КонецЕсли;
Также необходимо установить скачанный драйвер OLE DB.
Все готово, можно приступать к написанию запроса.
Ниже приведен пример строки подключения и запроса и сам запрос. Цель запроса - получить сведения о том, какая номенклатура в сторонней базе была изменена, какая была добавлена для синхронизации данных между базами. Номенклатура в базах синхронизирована по коду. В константе КаталогиИББухгалтерии содержится, например, строка "G:\DB77\БазаБух\".
ОлеДБ = СоздатьОбъект("OLEDBData"); Соединение = "Provider=VFPOLEDB.1; Set Deleted =Yes; data Source=" + КаталогИБ() + "; Mode=ReadWrite; Extended Properties=""; User ID=""; Password=""; Mask Password=False; Collating Sequence=MACHINESN="""; ОлеДБ.Соединение(Соединение); ОлеДБКоманда = ОлеДБ.СоздатьКоманду(); ПутьКБазеБух = СокрЛП(Константа.КаталогИББухгалтерии); ТекстЗапроса = " |SELECT '(BRUSH_S[16776960])' as FormEx_ПланРаскраски |, 1 as Пометка |, Спр.Code as Код |, Спр.Descr as Наим |, IIF(ISNULL(Спр.Code), 'V', '') as Новый |, IIF(Спр.Descr <> СпрБух.Descr, 'V', '') as Изменен |, '' as Перенесен |, СпрБух.Code as КодБух |, СпрБух.Descr as НаимБух |, IIF(СпрБух.IsFolder = 1, 'V', '') as Группа |, СпрБух1.Code as Код1Бух |, СпрБух1.Descr as Наим1Бух |, СпрБух2.Code as Код2Бух |, СпрБух2.Descr as Наим2Бух |, СпрБух3.Code as Код3Бух |, СпрБух3.Descr as Наим3Бух |, Спр1.Code as Код1 |FROM БазаБух.@Справочник.Номенклатура as СпрБух |LEFT JOIN БазаБух.@Справочник.Номенклатура as СпрБух1 ON СпрБух1.Id = СпрБух.ParentId |LEFT JOIN БазаБух.@Справочник.Номенклатура as СпрБух2 ON СпрБух2.Id = СпрБух1.ParentId |LEFT JOIN БазаБух.@Справочник.Номенклатура as СпрБух3 ON СпрБух3.Id = СпрБух2.ParentId |LEFT JOIN $Справочник.Номенклатура as Спр ON Спр.Code = СпрБух.Code |LEFT JOIN $Справочник.Номенклатура as Спр1 ON Спр1.Id = Спр.ParentId |"; глПарсерВторойБазы(ТекстЗапроса, "БазаБух", ПутьКБазеБух); ТЗ = ОлеДБКоманда.ВыполнитьИнструкцию(ТекстЗапроса);
Код процедуры глПарсерВторойБазы:
Процедура глПарсерВторойБазы(ТекстЗапроса, ИмяБазы2, ПутьКБазе2) Экспорт глМД = СоздатьОбъект("MetaDataWork"); ТекстЗапроса = глМД.ОбрМетаСКЛ(ТекстЗапроса); глМД2 = СоздатьОбъект("MetaDataWork"); глМД2.ПрисоединитьМД(ПутьКБазе2 + "1Cv7.md"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "@", "$"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ИмяБазы2 + ".", ПутьКБазе2); ТекстЗапроса = глМД2.ОбрМетаСКЛ(ТекстЗапроса); КонецПроцедуры // глПарсерВторойБазы()
В этой статье находится пример запроса к двум базам для SQL (без использования парсера для второй базы).
Другие статьи по прямым запросам:
Ускоряем регистрацию объектов в МОД (для SQL)
Проверка дублей строк с помощью 1С++
Аналог ON DUPLICATE KEY UPDATE в MS SQL
Как использовать УРБД в отличающихся конфигурациях
Примеры решения нестандартных задач на T-SQL в 1С
Как написать прямой запрос в 1С (DBF, 1sqlite)
Как написать прямой запрос в 1С (SQL) с помощью 1С++
Онлайн резервирование товаров на складе (online reservation)