Имя: Пароль:
1C
1C 7.7
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,ИтогЧ);
2 + 2 = 3.9999999999999999999999999999999...