![]() |
![]() |
![]() |
|
v7: Подключение к ДБФ | ☑ | ||
---|---|---|---|---|
0
alexei366
27.04.12
✎
13:58
|
Подключаюсь к дбф файла, делаю запрос к файлу (справочник контрагенты), но там нет колонки ПолнНаименование. Я так подозреваю из-за того что он имеет неограниченную длину. Внимание вопрос: где храниться в дбф ПолнНаименование
ТекстЗапроса = "Select top 1 | sprcont.DESCR as naim, | sprcont.#НомерДоговора# as nomdog, | sprcont.#ДатаДоговора# as datadog, | sprcont.#ИННКПП# as innkpp, | sprcont.#ОГРН# as ogrn, | (select count(*) from #ИмяФайлаКонтрагенты# as sprcont2 where sprcont2.DESCR = '#УсловияИмя#' and sprcont2.ISMARK = ' ' ) as cc | |from #ИмяФайлаКонтрагенты# as sprcont | where | sprcont.DESCR = '#УсловияИмя#' | and sprcont.ISMARK = ' ' | order by sprcont.DESCR asc"; а это выписка из файла описания T=SC58627 |Справочник ЭЦП |A |SC58627 |1 #-----Fields------- # Name |Descr |Type|Length|Precision F=ID |ID object |C |9 |0 F=CODE |object code |C |5 |0 F=DESCR |object description |C |45 |0 F=PARENTEXT |Parent in other tabl|C |9 |0 F=ISMARK |Flag Object is Marke|C |1 |0 F=VERSTAMP |Version stamp |C |6 |0 F=SP58612 |(P)Актив |C |9 |0 F=SP58613 |(P)Должность |
|||
1
alexei366
27.04.12
✎
13:59
|
ой не ту выписку дал но не суть
|
|||
2
KUBIK
27.04.12
✎
14:12
|
1SBLOB.DBF
|
|||
3
alexei366
27.04.12
✎
14:27
|
чот я там не очень понимаю, тамже типо для всех неограниченных инфа храниться, а как вычислить что мне нужно ПолнНаименование имеено спр контрагенты
|
|||
4
nicxxx
27.04.12
✎
14:43
|
fieldid
|
|||
5
alexei366
27.04.12
✎
14:57
|
парни можете кусок запроса кинуть и объяснить как формировать условия если мне нужен реквезит некоего справочника который имеет неогр длинну (как определить FIELDID ), а то вот эти данные мне не очень понятны: это BLOCK
0"",""0"",""0"","" ""}","0","0","0","0","0",""},{"548"," ции"}},{{"2","0","0","0",{{"-2685","0","","0","{""T"",""0"",""0"",""809"",""0"", ""0"","" 1 ""}","0","0","0","0","3",""},{"-2686","0","","0","{""U"","" 0"",""0"",""0"",""0"",""0"",""""}","0","0","0","0","0","Укажите счет, по котором у вводятся остатки"},{"-2687","0","","0","{""B"",""0"",""0"",""104"",""0"",""0"" ,"" 0 ""}","0","0","0","0","0",""},{"-2689","0","","0","{""N"",""0""," "0"",""0"",""0"",""0"",""0""}","0","0","0","0","0",""},{"-2688","0","","0","{""N "",""0"",""0"",""0"",""0"",""0"",""0""}","0","0","0","0","0",""},{"-2690","0","" ,"0","{""N"",""0"",""0"",""0"",""0"",""0"",""0""}","0","0","0","0","0",""},{"547 }}},"1","1",{}}"",""2"",""0"",""0"",""0"",""0"",""НУ""}","0","0","0","0","0",""} 0","","0","{""S"",""2"",""0"",""0"",""0"",""0"",""НУ""}","0","0","0","0","0",""} ","0","","0","{""S"",""50"",""0"",""0"",""0"",""0"","" ""}","0","0","0","0","0","Укажите содержание проводки"}, {"548","0","","0","{""S"",""2"",""0"",""0"",""0"",""0"",""НО""}","0","0","0","0" ,"0",""}}}},"1","1",{}}"",""2"",""0"",""0"",""0"",""0"",""НО""}","0","0","0","0" |
|||
6
alexei366
27.04.12
✎
18:06
|
э народ куда все пропали
|
|||
7
nicxxx
28.04.12
✎
09:51
|
это выполняется в 8.2 , поэтому такой синтаксис
ТекстЗапроса = " |select | * |from | 1SBLOB |where | OBJID = '"+OBJID+"' |and | FIELDID = '"+FIELDID+"' |order by | BLOCKNO |"; Выборка = ПолучитьВыборкуАДО(ТекстЗапроса); Рез = ""; ДлинаСтроки10 = 0; сч=0; Пока НЕ Выборка.EOF Цикл //Цикл по записям DBF //блок 0 Если сч = 0 Тогда //длину получаем из первого блока, в остальных ее нет //длина строки записана в 16-ричной системе, а не в 36-ричной ДлинаСтроки10 = Из36в10(СокрЛП(Лев(Выборка.Fields("block").value, 9)),"0123456789ABCDEF"); КонецЕсли; Рез = Рез + Выборка.Fields("block").value; сч=сч+1; Выборка.MoveNext(); КонецЦикла; Попытка Возврат (Сред(Рез, 10, ДлинаСтроки10)); исключение сообщение("Ошибка загрузки данных из 1SBLOB"); КонецПопытки; |
|||
8
nicxxx
28.04.12
✎
09:55
|
ключевой момент:
|where | OBJID = '"+OBJID+"' |and | FIELDID = '"+FIELDID+"' OBJID - ИД объекта, реквизит которого надо получить из BLOB FIELDID - ИД реквизита, что хранится в БЛОБе (можно получить через 1С++ MetaDataWork или экспериментально, на тестовой базе удалить блоб, записать нового контрагента и посмотреть что добавилось в блоб) |
|||
9
alexei366
28.04.12
✎
10:37
|
есть небольшая проблема, у меня процедура типо универсальная. Первая функция парсин 1cv7.DD вторая строит запросы на основе этих данных, а третья подставляет переменные и выполняет подключение. Так вот както узнать через 1cv7.DD можно что у контрагентов есть ещё и реквизит ПолнНаименование и соответственно ключи от него в 1SBLOB.DBF
|
|||
10
Torquader
28.04.12
✎
10:49
|
(9) Парсить нужно MD, так как периодические реквизиты и строки неограниченной длины хранятся в других таблицах (причём для всех элементов сразу).
Идентификатор поля можно узнать только разобрав структуру MD - в других местах его найти невозможно, а идентификатор элемента спокойно можно узнать у самого элемента. |
|||
11
alexei366
28.04.12
✎
10:56
|
а как MD разбирать?
|
|||
12
Mikeware
28.04.12
✎
10:57
|
(11) compound.dll
|
|||
13
Mikeware
28.04.12
✎
11:01
|
+(12) Или промежуточный разбор, используя gcomp - и затем смотреть Структура.mdp для каждого. Там, где тип "S" и длина 0 - реквизит неограниченной длины...
|
|||
14
alexei366
28.04.12
✎
11:15
|
Спасибо конечно, но вот только я не так крут. Mikeware если не влом может объяснишь поподробней , да код покажешь . Я какбы с дбф тут начал мучатся только потому что мой сервер 1с8.2 на MSSQL через Новый COMОбъект("V1CEnterprise.Application") к одной из баз 1с7 не подключается (хотя если выполнить на томже компе темже пользователем туже процедуру но на &НаКлиенте то всё ок)
|
|||
15
Mikeware
28.04.12
✎
11:31
|
(14) Слей gcomp, разбери md, да посмотри. Объяснять дольше.
а компаундом я давно не пользовался... |
|||
16
Mikeware
28.04.12
✎
11:37
|
а вообще, найти реквизиты неогр. длины проще через метаданные - Справочник(х).реквизит(xx).Тип и Справочник(х).реквизит(xx).Длина - если строка и длина=0, то неограниченный. Ну а ид реквизита найти через 1с++ - MetaDataWork.ИдРеквизитаСправочника()
---------- В общем, способов дофига... |
|||
17
alexei366
28.04.12
✎
11:46
|
Яж через 8.2 напрямую к дбф конектюсь к разным базам, а у них реквизиты типа одинаковые к примеру НомерДоговора но создавались они через конфигуратор а значит 1с77 в разных базах поставила разные идентификаторы данного реквизита, а я хочу по имени реквизита находить его данные в дбф
|
|||
18
alexei366
28.04.12
✎
11:57
|
в md нашёл
{"133","Контрагенты","","","0","8","1","1","2","30","1","2","3","132","132","0","1","1", {"Params", {"121","ВидКонтрагента","","Вид контрагента","E","0","0","438","0","0","0","1","0","0","1","0","0"}, {"122","ПолнНаименование","Наименование в соответствии с учредительными документами, ФИО для физических лиц","Полное наименование","S","0","0","0","0","0","0","1","0","0","1","0","0"}, {"123","ЮридическийАдрес","","Юридический адрес","S","85","0","0","0","0","0","1","0","0","1","0","0"}, {"124","ПочтовыйАдрес","","Почтовый адрес","S","85","0","0","0","0","0","1","0","0","1","0","0"}, |
|||
19
Mikeware
28.04.12
✎
12:07
|
(17) одними данными не обойдешься, тебе нужно еще и метаданные копать...
(18){"122","ПолнНаименование","Наименование в соответствии с учредительными документами, ФИО для физических лиц","Полное наименование","S","0" - "S","0" значит неограниченная, "122" - ид |
|||
20
alexei366
28.04.12
✎
12:11
|
не нашёл в блобе по этому ид ничего
|
|||
21
alexei366
28.04.12
✎
12:19
|
при помощи этого чото нашёл похожее но всего 5 строк
ТекстЗапроса = "Select top 100 | * | |from 1SBLOB | where ALLTRIM(FIELDID) = '"+УникИдКон+"' | or ALLTRIM(OBJID) = '"+УникИдКон+"' | | order by FIELDID,OBJID,BLOCKNO asc"; |
|||
22
Mikeware
28.04.12
✎
12:20
|
(20) _IdToStr(122)
|
|||
23
alexei366
28.04.12
✎
12:39
|
А зачем _IdToStr(122) , я же и так в кавычках указываю да и поле символьное. Короче когда поиск делаю по ALLTRIM(FIELDID) = '3E' выдает интересное поле "1d ИП Звездина Наталья Андреевна" . Откуда 1d и что он означает я не знаю, и откуда вычислить что 3E относиться к ПолнНаименованию (и походу не только Спр.Контрагенты а ко всем реквизитам объектов с таким наименованием)
|
|||
24
alexei366
28.04.12
✎
12:40
|
а забыл по этому поиску мне не одна строка выдается а дохрена и некоторые из них не относятся к полннаименованию справочника контрагенты
|
|||
25
Mikeware
28.04.12
✎
12:45
|
(24) искть нужно по ид объекта и ид поля, сортируя по номеру блока
|
|||
26
alexei366
28.04.12
✎
12:50
|
Так ид поля вроде как 3E, ид объекта будет это понятно. Непонятно как узнать через подкючения дбф, или тупо парся txt узнать что у спр контрагентов есть реквизит ПолнНаименование и оно имеет ид 3E
|
|||
27
alexei366
28.04.12
✎
12:52
|
Я вот тут такую функцию написал, вот как её дополнить ПолнНаименованием
Функция ПолучитьДанныеОбъектовБазы(ТаблицаОб,Ссылка1сБ) Экспорт Результат = ""; //ТаблицаОб = Новый ТаблицаЗначений; Попытка ПутьКФайлу = Ссылка1сБ.Сервер; ТекстДок = Новый ТекстовыйДокумент; Если Не (Прав(ПутьКФайлу,1) = "\") Тогда ПутьКФайлу = ПутьКФайлу+"\"; КонецЕсли; ПутьКФайлу = ПутьКФайлу+"1Cv7.DD"; ТекстДок.Прочитать(ПутьКФайлу); КолСтр = ТекстДок.КоличествоСтрок(); Для НСтр = 1 По КолСтр Цикл Стр = СокрЛП(ТекстДок.ПолучитьСтроку(НСтр)); ТипП = Лев(Стр,1); Если ТипП = "T" Тогда Поз1 = Найти(Стр,"|"); Если Поз1 = 0 Тогда НСтр = НСтр+1; Иначе ТекСтр = Сред(Стр,1,Поз1-1); Поз2 = Найти(ТекСтр,"="); ИмяФайлаОб = СокрЛП(Сред(ТекСтр,Поз2+1)); ТекСтр = Сред(Стр,Поз1+1); Поз2 = Найти(ТекСтр,"|"); Если Поз2 = 0 Тогда ТекСтр = СокрЛП(ТекСтр); Иначе ТекСтр = СокрЛП(Сред(ТекСтр,1,Поз2-1)); КонецЕсли; Пока Найти(ТекСтр," ") > 0 Цикл ТекСтр = СтрЗаменить(ТекСтр," "," "); КонецЦикла; ИмяТаблицыОб = СтрЗаменить(ТекСтр," ","."); СтрТаб = ТаблицаОб.Найти(ИмяТаблицыОб,"ИмяТаблицыОб"); Если СтрТаб = Неопределено Тогда НСтр = НСтр+1; Иначе СтрТаб.ИмяФайлаОб = ИмяФайлаОб; МассивИменТаблицы = Новый Массив; МассивИменФайла = Новый Массив; НСтр = НСтр+1; Пока НСтр <= КолСтр Цикл Стр = СокрЛП(ТекстДок.ПолучитьСтроку(НСтр)); ТипП = Лев(Стр,1); Если ТипП = "F" Тогда Поз1 = Найти(Стр,"|"); Если Поз1 = 0 Тогда НСтр = НСтр+1; Иначе ТекСтр = Сред(Стр,1,Поз1-1); Поз2 = Найти(ТекСтр,"="); ИмяРеквизитаФайл = СокрЛП(Сред(ТекСтр,Поз2+1)); ТекСтр = Сред(Стр,Поз1+1); Поз2 = Найти(ТекСтр,"|"); Если Поз2 = 0 Тогда ТекСтр = СокрЛП(ТекСтр); Иначе ТекСтр = СокрЛП(Сред(ТекСтр,1,Поз2-1)); КонецЕсли; Пока Найти(ТекСтр," ") > 0 Цикл ТекСтр = СтрЗаменить(ТекСтр," "," "); КонецЦикла; ИмяРеквизитаТаблица = СокрЛП(ТекСтр); МассивИменТаблицы.Добавить(ИмяРеквизитаТаблица); МассивИменФайла.Добавить(ИмяРеквизитаФайл); КонецЕсли; ИначеЕсли ТипП = "T" Тогда НСтр = НСтр-1; Прервать; КонецЕсли; НСтр = НСтр+1; КонецЦикла; СтрТаб.МассивИменТаблицы = МассивИменТаблицы; СтрТаб.МассивИменФайла = МассивИменФайла; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; Результат = ""; Исключение ф = ОписаниеОшибки(); Результат = ИнформацияОбОшибке().Причина.Описание; КонецПопытки; Возврат Результат; КонецФункции |
|||
28
Mikeware
28.04.12
✎
13:09
|
(26) тебе ж по русски сказали - в данных этого нет. И в словаре данных - тоже нет. Это в МЕТАданных. Поэтому либо по оле, и (16), либо читать через компаунд, либо разбирать гкомп'ом и парсить... ну, короче, любым способом, обеспечивающим доступ к метаданным...
|
|||
29
alexei366
28.04.12
✎
14:21
|
гкомом разобрал, но чет я там не уидел ссылки. Прости за нубство
|
|||
30
Mikeware
28.04.12
✎
14:22
|
(29) см (19)
|
|||
31
alexei366
28.04.12
✎
16:33
|
Так как инфу вытаскивать я разобрался. Единственное прошу тыкните меня носом почему ПолнНаименование имеет инд-тор 3E, где это можно увидеть
|
|||
32
alexei366
28.04.12
✎
16:34
|
код в догонку
ТекстЗапроса = " select | BLOCK |from 1SBLOB | where ALLTRIM(FIELDID) = '3E' | and OBJID = '"+Recordset.Fields(0).Value+"' |order by BLOCKNO asc"; Recordset3 = Соединение.Execute(ТекстЗапроса); ПолнНаим = ""; Пока Recordset3.EOF() = 0 Цикл ПолнНаим = ПолнНаим+Recordset3.Fields(0).Value; Recordset3.MoveNext(); КонецЦикла; Код16 = СокрЛП(Сред(ПолнНаим,1,9)); ИтогЧ = 0; ДлинК = СтрДлина(Код16); Для ИндЧ = 0 По ДлинК-1 Цикл Знак1 = Сред(Код16,ДлинК-ИндЧ,1); Поз = Найти("0123456789abcdef",Знак1); ИтогЧ = ИтогЧ+(Поз-1)*Pow(16,ИндЧ); КонецЦикла; ПолнНаим = Сред(ПолнНаим,10,ИтогЧ); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |