Возник такой вопрос. Необходимо обратиться из одной базы в другую прямым запросом. Из-за того, что база не текущая Метапарсером воспользоваться не получается. Поэтому приходится работать по дескрипторам. А реквизит, который надо получить, имеет тип Справочник и может содержать данные из двух разных справочников. Как можно определить из какого справочника данные в текущем реквизите?
По теме из базы знаний
- DBEng32 (8.0.1.2, Share) – выполнение прямых запросов и в монопольном режиме для DBFной версии 1С:Предприятие 7.7 в среде 1С++
- Консоль запросов EX (внешние данные)
- Сверка справочников в разных базах одним запросом
- Руководство по SQL: Как лучше писать запросы (Часть 2)
- Система управления интеграциями на базе 1С:Шины
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) dicwork,
смотрите в сторону методов
Добавлена возможность загрузки метаданных из любой ИБ 1С.
Для этого добавлены методы:
- ODBCDataBase::ПрисоединитьИБ
- MetaDataWork::ПрисоединитьМД
- OLEDBData::ПрисоединитьИБ
Добавлен синоним метода ODBCDataBase::Присоеденить1С - ODBCDataBase::Присоединить1С.
1С++ >= 2.0.3.1
смотрите в сторону методов
Добавлена возможность загрузки метаданных из любой ИБ 1С.
Для этого добавлены методы:
- ODBCDataBase::ПрисоединитьИБ
- MetaDataWork::ПрисоединитьМД
- OLEDBData::ПрисоединитьИБ
Добавлен синоним метода ODBCDataBase::Присоеденить1С - ODBCDataBase::Присоединить1С.
1С++ >= 2.0.3.1
(2) dicwork, да здесь такие вопросы обсуждаются. Просто не совсем понятно в чем проблема.
Лезь в таблицы с данными, смотри чем отличаются записи в нужном поле. В записи будет фигурировать и код справочника к которому принадлежат конкретно эти данные.
В общем процесс творческий. Хотя возможно я не знаю каких нибудь секретов 1С++, самому прямые запросы доводилось писать очень давно, тогда никаких "метапарсеров" не было.
Лезь в таблицы с данными, смотри чем отличаются записи в нужном поле. В записи будет фигурировать и код справочника к которому принадлежат конкретно эти данные.
В общем процесс творческий. Хотя возможно я не знаю каких нибудь секретов 1С++, самому прямые запросы доводилось писать очень давно, тогда никаких "метапарсеров" не было.
Судя по всему 1С++ используется. Какая версия? База dbf или sql?
1. Метапарсером пользоваться можно (см. метод ПрисоединитьИБ() объекта ODBCDataBase)
2. 36 ричный вид содержится в первых четырех позициях 13символьного ИД.
3. Эти вопросы лучше обсуждать на форуме1С++
1. Метапарсером пользоваться можно (см. метод ПрисоединитьИБ() объекта ODBCDataBase)
2. 36 ричный вид содержится в первых четырех позициях 13символьного ИД.
3. Эти вопросы лучше обсуждать на форуме
элементарно.
это пример закачки БВ из Комплекса в ТИС.
Обрати внимание что нет указаний на названия таблиц и столбцов.
Метапарсер сам разберется по Мд что ды как.
Процедура Обновить()
Текст="
|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);
Запрос.ВыполнитьИнструкцию(Текст,ТаблицаЛокально);
Показатьэто пример закачки БВ из Комплекса в ТИС.
Обрати внимание что нет указаний на названия таблиц и столбцов.
Метапарсер сам разберется по Мд что ды как.
в догонку
и
Функция глСоединение(ТипСоединения="",ПутьИБ="",Пользователь="",Пароль="") Экспорт
Каталог=КаталогИБ();
Если Врег(ТипСоединения)="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");
Запрос.УстБД(БД);
Возврат Запрос;
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот