Прямой запрос из обной базы в другую

1. dicwork 18.12.11 12:40 Сейчас в теме
Возник такой вопрос. Необходимо обратиться из одной базы в другую прямым запросом. Из-за того, что база не текущая Метапарсером воспользоваться не получается. Поэтому приходится работать по дескрипторам. А реквизит, который надо получить, имеет тип Справочник и может содержать данные из двух разных справочников. Как можно определить из какого справочника данные в текущем реквизите?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. kansler 21.12.11 12:30 Сейчас в теме
(1) dicwork, можно сравнить первые 4 символа нужного реквизита (которые отвечают за тип значения) с нужным видом. Не пробовал, но думаю получится
5. WaterSmith 355 21.12.11 12:36 Сейчас в теме
kansler пишет:

(1) dicwork, можно сравнить первые 4 символа нужного реквизита (которые отвечают за тип значения) с нужным видом. Не пробовал, но думаю получится


Вот, да, примерно это я и имею ввиду
15. jbond 25 27.11.13 16:41 Сейчас в теме
(1) dicwork,

смотрите в сторону методов


Добавлена возможность загрузки метаданных из любой ИБ 1С.
Для этого добавлены методы:
- ODBCDataBase::ПрисоединитьИБ
- MetaDataWork::ПрисоединитьМД
- OLEDBData::ПрисоединитьИБ

Добавлен синоним метода ODBCDataBase::Присоеденить1С - ODBCDataBase::Присоединить1С.



1С++ >= 2.0.3.1
16. dicwork 27.11.13 17:13 Сейчас в теме
(15) jbond,
Спасибо за Ваш совет, но вообще-то я получил ответы еще 2 года назад. :-)
2. dicwork 21.12.11 12:12 Сейчас в теме
Если это не по теме здесь, то подскажите, где обсуждают такие вопросы?
4. WaterSmith 355 21.12.11 12:35 Сейчас в теме
(2) dicwork, да здесь такие вопросы обсуждаются. Просто не совсем понятно в чем проблема.
Лезь в таблицы с данными, смотри чем отличаются записи в нужном поле. В записи будет фигурировать и код справочника к которому принадлежат конкретно эти данные.
В общем процесс творческий. Хотя возможно я не знаю каких нибудь секретов 1С++, самому прямые запросы доводилось писать очень давно, тогда никаких "метапарсеров" не было.
6. alex_bob 246 21.12.11 12:37 Сейчас в теме
Судя по всему 1С++ используется. Какая версия? База dbf или sql?
1. Метапарсером пользоваться можно (см. метод ПрисоединитьИБ() объекта ODBCDataBase)
2. 36 ричный вид содержится в первых четырех позициях 13символьного ИД.
3. Эти вопросы лучше обсуждать на форуме 1С++
9. dicwork 21.12.11 17:26 Сейчас в теме
(6) alex_bob
База SQL и первая и вторая. Если можно пример абстрактного кода как можно использовать Метапарсер с сторонней базе.
7. Ёпрст 1063 21.12.11 12:54 Сейчас в теме
(0) метапарсер прекрасно работает в сторонней базе, если что.
8. varelchik 21.12.11 15:04 Сейчас в теме
(7,6) Полностью поддержую.
Я как раз этим и пользуюсь.
Давно отказался от ОЛЕ, прямые запросы и заботают круче, да и гемороя с ними меньше.
10. varelchik 21.12.11 17:42 Сейчас в теме
элементарно.
Процедура Обновить()
	Текст="
	|select
	|Контрагенты.code КодКонтрагента,
	|--Банки.id [Банк $Спр.Банки],
	|Банки.Code МФО,
	|$РСчета.НомерСчета НомерСчета,
	|--РСчета.id [Счет $Справочник.НашиДенежныеСчета],
	|case
	|when СчетаУчета.SCHKOD in ('36.1.','68.1.1.') then 1
	|when СчетаУчета.SCHKOD in ('63.1.') then 2
	|when СчетаУчета.SCHKOD in ('37.7.') then 3
	|else 4
	|end Тип,
	|--СчетаУчета.SCHKOD КодСчета,
	|$Строки.Содержание Содержание,
	|CASE
	|WHEN Контрагенты.id is null THEN 'Другие платежи' ELSE Контрагенты.descr END as Контрагент,
	|--Контрагенты.descr Контрагент,
	|CASE WHEN ltrim(rtrim($Строки.ВидДвижения))='QK' THEN 1 ELSE 2 END as ВидДвижения,
	|CASE WHEN ltrim(rtrim($Строки.РежимОплаты))='RK' THEN 1 ELSE 2 END as РежимОплаты,
	|CASE WHEN ltrim(rtrim($Строки.ВидОплаты))='QS' THEN 1 
	|	  WHEN ltrim(rtrim($Строки.ВидОплаты))='QT' THEN 2
	|ELSE 3 END as ВидОплаты,
	|CASE WHEN ltrim(rtrim($Строки.ВидДвижения))='QK' THEN $Строки.СуммаСНДС ELSE 0 END as Приход,
	|CASE WHEN ltrim(rtrim($Строки.ВидДвижения))='QK' THEN 0 ELSE $Строки.СуммаСНДС END as Расход,
	|--$Строки.ВидДвижения ВидДвижения,
	|--$Строки.РежимОплаты [РежимОплаты $Перечисление.РежимыОплаты],
	|--$Строки.ВидОплаты [ВидОплаты $Перечисление.ВидыОплаты],
	|--j.iddoc [Док $Документ.БанковскаяВыписка],
	|j.docno НомерБух,
	|j.date_time_iddoc [ДатаДокБух $Дата],
	|j.closed &1 Проведение,
	|j.ismark Удален,
	|--$Строки.ДокументОснование [Основание $Документ],
	|$Счета.Основание Основание,
	|$Счета.ЗаявкаНаСчет ЗаявкаНаСчет,
	|$Строки.СуммаСНДС СуммаСНДС,
	|$Строки.НДС НДС
	|from _1sjourn j (nolock)
	|inner join $Документ.БанковскаяВыписка Шапка (nolock) on Шапка.iddoc=j.iddoc
	|inner join $ДокументСтроки.БанковскаяВыписка Строки (nolock) on Строки.iddoc=j.iddoc
	|left join $Документ.Счет Счета (nolock) on Счета.iddoc=right($Строки.ДокументОснование,9)
	|left join $Справочник.Контрагенты Контрагенты (nolock) on Контрагенты.id=right($Строки.Субконто1,17)
	|inner join $Справочник.НашиДенежныеСчета РСчета (nolock) on РСчета.id=$Шапка.РСчет
	|inner join $Справочник.Банки Банки (nolock) on Банки.id=$РСчета.Банк
	|inner join _1SACCS СчетаУчета (nolock) on СчетаУчета.id=right($Строки.Счет,9)
	|where
	|--j.closed &1=1
	|--and
	|j.iddocdef=$ВидДокумента.БанковскаяВыписка
	|and
	|j.date_time_iddoc between :НачДата and :НачДата~
	|--and
	|--$Строки.ДокументОснование<>$ПустойИД13
	|--group by
	|--j.iddoc,j.docno,Контрагенты.descr
	|order by j.date_time_iddoc
	|--Контрагенты.descr
	|";
	Запрос=лСоединение(ПутьКБухии);
	Запрос.УстановитьТекстовыйПараметр("НачДата",Дата2);
	//Запрос.УстановитьТекстовыйПараметр("КонДата",Дата2);
	ТаблицаРезультатов=СоздатьОбъект("ИндексированнаяТаблица");
	Запрос.ВыполнитьИнструкцию(Текст,ТаблицаРезультатов);
	//ТаблицаРезультатов.Показать();
	Текст="
	|select
	|$Шапка.ДокОсн НомерБух,
	|--j.docno Основание,
	|Заявки.iddoc [Основание $Документ.ЗаявкаНаСчет],
	|j.date_time_iddoc [ДатаТорг $Дата],
	|$Строки.Контрагент [Контрагент $Спр.Контрагенты],
	|$Строки.ВидДвижения [ВидДвижения $Перечисление.ВидыДвиженийПоРасчетномуСчету],
	|j.iddoc [Ссылка $Документ.ДвиженияДенежныхСредств],
	|Case
	|when $Строки.Приход=0 then $Строки.Расход
	|else $Строки.Приход end Сумма,
	|CASE 
	|WHEN j.closed &1=1 THEN $Строки.Приход ELSE 0 END as Приход,
	|--$Строки.Приход Приход,
	|CASE 
	|WHEN j.closed &1=1 THEN $Строки.Расход ELSE 0 END as Расход,
	|--$Строки.Расход РАсход,
	|j.closed &1 Проведение,
	|j.ismark Удален
	|from _1sjourn j (nolock)
	|inner join $Документ.ДвиженияДенежныхСредств Шапка (nolock) on Шапка.iddoc=j.iddoc
	|inner join $ДокументСтроки.ДвиженияДенежныхСредств Строки (nolock) on Строки.iddoc=j.iddoc
	|left join $Документ.ЗаявкаНаСчет Заявки (nolock) on Заявки.iddoc=RIGHT($Строки.ДокументОснование,9)
	|where
	|j.date_time_iddoc between :НачДата and :КонДата~
	|and
	|j.iddocdef=$ВидДокумента.ДвиженияДенежныхСредств
	|--and
	|--j.closed &1=1
	|";
	Запрос=глСоединение();
	ТаблицаЛокально=СоздатьОбъект("ИндексированнаяТаблица");
	Запрос.УстановитьТекстовыйПараметр("НачДата",Дата1);
	Запрос.УстановитьТекстовыйПараметр("КонДата",Дата1);
	Запрос.ВыполнитьИнструкцию(Текст,ТаблицаЛокально);

Показать

это пример закачки БВ из Комплекса в ТИС.
Обрати внимание что нет указаний на названия таблиц и столбцов.
Метапарсер сам разберется по Мд что ды как.
11. varelchik 21.12.11 17:44 Сейчас в теме
в догонку
Функция глСоединение(ТипСоединения="",ПутьИБ="",Пользователь="",Пароль="") Экспорт
	Каталог=КаталогИБ();
	Если Врег(ТипСоединения)="SQL" Тогда
		БД =СоздатьОбъект("ODBCDataBase");
		Запрос=СоздатьОбъект("ODBCRecordSet");
		Если ПустоеЗначение(ПутьИБ)=0 Тогда
			//СтрокаСоединения = "Driver={SQL Server};Server=%1;Database=%2;Uid=%3;Pwd=%4;";
			БД.ПрисоединитьИБ(ПутьИБ,Пользователь,Пароль);
			Запрос.УстБД(БД);
		КонецЕсли;
		Возврат Запрос;
	ИначеЕсли Врег(ТипСоединения)="ОЛЕ" Тогда
		Попытка
			БД = СоздатьОбъект("OLEDBData");   
			Если ПустоеЗначение(ПутьИБ)=0 Тогда
				БД.ПрисоединитьИБ(ПутьИБ);
			Иначе 
				СтрокаСоединения = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + Каталог 
				+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";;
				БД.Соединение(СтрокаСоединения);
			КонецЕсли;
			Команда=БД.СоздатьКоманду();
			Команда.УстановитьКаталогВремТаблиц(КаталогВременныхФайлов());
			Возврат Команда;
		Исключение
			Возврат глСоединение("ДБФ",ПутьИБ);
		КонецПопытки;
	ИначеЕсли Врег(ТипСоединения)="ДБФ" Тогда
		Попытка
			БД =СоздатьОбъект("ODBCDataBase");
			Если ПустоеЗначение(ПутьИБ)=0 Тогда
				БД.ПрисоединитьИБ(ПутьИБ);
			Иначе
				БД.Соединение("DRIVER={Microsoft Visual FoxPro Driver};Deleted=Yes;
				|Null=Yes;Collate=RUSSIAN;Exclusive=No;SourceType=DBF;SourceDB="+Каталог);
			КонецЕсли;
			Запрос=СоздатьОбъект("ODBCRecordSet");
			Запрос.УстБД(БД);
			Возврат Запрос;
		Исключение
			Возврат 0;
		КонецПопытки;
	ИначеЕсли Врег(ТипСоединения)="SQLITE" Тогда
		база = СоздатьОбъект("SQLiteBase");
		база.Открыть(":memory:");
		Запрос = база.НовыйЗапрос();
		Запрос.ВыполнитьЗапрос("PRAGMA journal_mode=WAL");
		Возврат Запрос;
	Иначе
		МФ=СоздатьОбъект("MetaInfoClasses");
		Если МФ.ЭтоSQL_Версия()=1 Тогда
			Возврат глСоединение("SQL");
		Иначе
			Возврат глСоединение("SQLite");
		КонецЕсли;
	КонецЕсли;
КонецФункции	// глСоединение
Показать

и
Функция лСоединение(путь)
	БД =СоздатьОбъект("ODBCDataBase");
	Запрос=СоздатьОбъект("ODBCRecordSet");
	БД.ПрисоединитьИБ(Путь,"Admin","batcom123");
	Запрос.УстБД(БД);
	Возврат Запрос;
КонецФункции
Показать
12. dicwork 21.12.11 20:19 Сейчас в теме
(11) varelchik
Спасибо за консультацию будем пробовать. А то без Метапарсера тяжеловато строить прямые запросы, а строить нужно для ускорения работы и для нормальной стыковки двух баз данных.
13. varelchik 22.12.11 10:02 Сейчас в теме
ну ты у меня таким макаром 4 базы друг с другом связаны.
14. sss999 48 21.11.13 13:50 Сейчас в теме
select distinct
СпрКонтр.Descr as Контрагент,
СпрДог.Descr as Договор,
case when debkred=1 then Покуп.Sp2201 else 5 end as СуммаПрод ,
Sp2203 as СуммаСебест
from
ra2207 as покуп
LEFT JOIN SC92 as СпрДог
LEFT JOIN SC134 as СпрКонтр
ON СпрКонтр.sp125 = СпрДог.ID
ON Покуп.SP2195 = СпрДог.ID
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот