![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как мне взять данные из 1С
Term © (2003-09-10 11:35:00)
Проблема такая, просят написать программу которая бы просматривала бы данные в базах 1С. Открывать буду только read-only. У кого есть документация о полях и связях между таблицами. Или еще что посоветуете.
Е-Моё имя (2003-09-12 09:40:00) [1]
я напрямую из MSSQL вытягиваю данные, проблем пока не было ;)
LordOfSilence (2003-09-11 17:59:00) [2]
2 MMF © (11.09.03 17:46) [30]
Погодь, не пугай человека раньше времени. :-)
MMF (2003-09-11 17:46:00) [3]
>Term (11.09.03 16:21) [28]
Тебя ждут неприятные открытия по периодическим реквизитам и перечислениям. DD/DDS - только частичная проекция структуры базы данных из MD. А все в целом можно понять из Main MataDataStream - потока в компаунд-файле конфигурации 1cv7.md
Тебе может помочь http://1c.hippo.ru/cgi-bin/predownl.cgi?id=2046в плане просмотра DD/DDS/MD.
LordOfSilence (2003-09-11 16:30:00) [4]
Ты все же не торопись делать выводы. Через Олю "правильней". :-)
Сама фирма 1С вроде не приветствует прямую работу со своими
базами. По-крайней мере надо очень четко понимать что ты делаешь.
Хотя, если ты только читаешь данные, то пуркуа бы и не па? :-)
Будет заметно быстрей, во всяком случае.
Term (2003-09-11 16:21:00) [5]
> необходимость. Для справки: в каталоге с базой лежит файл
> *.DD или *.DDS. Там описана струтура данных. Открой файл
> в текстовом редакторе, задай поиск по строке. Например,
> "Сотрудники". Будет найдено описание этого справчника.
> Таблица будет называться scXX, где ХХ - это цифры. Откроешь
> файл с таким именем и увидишь справочник сотрудников.
это то что надо, спасибо, а то над этим OLEшей колдую уже весь день.
Term (2003-09-11 14:28:00) [6]
спасибо ща буду пробывать
LordOfSilence (2003-09-11 14:05:00) [7]
По-поводу прямого доступа:
ZEE © (11.09.03 13:55) [24] прав.
В MSSQL намного удобнее смотреть связи, делать запросы
с объединениями и т.д. Я лично сам так и работаю, когда есть
необходимость. Для справки: в каталоге с базой лежит файл
*.DD или *.DDS. Там описана струтура данных. Открой файл
в текстовом редакторе, задай поиск по строке. Например,
"Сотрудники". Будет найдено описание этого справчника.
Таблица будет называться scXX, где ХХ - это цифры. Откроешь
файл с таким именем и увидишь справочник сотрудников.
LordOfSilence (2003-09-11 13:59:00) [8]
Ну давай попробуем...
Я в "Ванессе" пишу на русском :-), поэтому практически не знаю
английские наименования методов.
1. GetItem() - это я так понимаю аналог ПолучитьЭлемент()
так вот, по правилам 1С, сначала выборка должна открываться,
а потом уже пробег по ней в цикле. Я же тебе написал
ВыбратьЭлементы(), а потом ПолучитьЭлемент() в цикле.
2. Ты, видимо, неправильно трактуешь назначение метода FindItem.
Действительно должна быть открыта сначала выборка, или
справочник должен быть спозиционирован на какой-то свой
элемент. В момент вызова FindItem он только создан (как тип).
Но где находится "курсор", пока еще неизвестно.
Поэтому когда ты вызываешь getattrib, ему неоткуда появиться.
Я понимаю все сложности, так как Delphi-мышление и 1Совское
весьма не совпадают по многим вопросам. То есть ты ожидаешь,
что создал объект (по делфийски) и все, пошел молотить:
First(), Last() и т.д. В 1С немного не так. :-)
ZEE (2003-09-11 13:55:00) [9]
минусы связи через OLE с 1С
- данные вытягивать долго
- не всегда работают 1С-овские процедуры в Дельфях (сам пробовал в 1С код пашет вери гуд, а при подстановке в Дельфю - тоже пашет, но частично)
все-таки можно вытягивать данные из базы которую пользует 1С, но тут большой минус: 1С-овцы эту базу так нашифровали, что разобраться там - большой трабл
хотя сам пробовал и напрямую данные тащить - получилось (1С:7.7, MsSQLserver)
и тут же ко второму методу плюс: скорость гораздо больше чем в оле (ну вобщем все минусы оле переходят тут в плюсы)
Term (2003-09-11 13:43:00) [10]
переделал вот так:
var
proba,Sprav_sotr:OLEVariant;
begin
proba:=CreateOleObject("V77.Application");
proba.Initialize(proba.RMTrade,"/DC:\V7\DB /M","");
if proba.Initialize(proba.RMTrade,"","")=0 then
Exception.Create("Не удалось подключиться!");
Sprav_sotr:=proba.CreateObject("Справочник.Сотрудники");
Sprav_sotr.FindItem(Sprav_sotr.getattrib("ФИО"));
while Sprav_sotr.GetItem>0 do
begin
Form1.Table1.Append;
Form1.Table1.FieldByName("Fio").AsString:=Sprav_sotr.getAttrib("ФИО");
Form1.Table1.Post;
end;
proba:=UnAssigned;
говорит неверное имя атрибута, подскажите правильное...
Term (2003-09-11 13:37:00) [11]
var
proba,Sprav_sotr:OLEVariant;
begin
proba:=CreateOleObject("V77.Application");
proba.Initialize(proba.RMTrade,"/DC:\V7\DB /M","");
if proba.Initialize(proba.RMTrade,"","")=0 then
Exception.Create("Не удалось подключиться!");
Sprav_sotr:=proba.CreateObject("Справочник.Сотрудники");
while Sprav_sotr.GetItem>0 do
begin
Sprav_sotr.FindItem(Sprav_sotr.getattrib("ФИО"));
Form1.Table1.Append;
Form1.Table1.FieldByName("Fio").AsString:=Sprav_sotr.getAttrib("ФИО");
Form1.Table1.Post;
end;
proba:=UnAssigned;
теперь, когда пытаюсь копировать данные справочника в базу вываливается ошибка "не выбран элемент". Подскажите...
LordOfSilence (2003-09-11 13:36:00) [12]
http://www.mista.ru/articles1c/ole.htm
Term (2003-09-11 12:51:00) [13]
есть, я демо базу открываю
LordOfSilence (2003-09-11 12:29:00) [14]
А в твоей базе-1С есть справочник Номенклатура?
MMF (2003-09-11 12:27:00) [15]
>Term (11.09.03 12:12) [14]
Сделай проверку инициализации:
if proba.Initialize(proba.RMTrade,"/DC:\V7\DB /M","")=0 then
Exception.Create("Не удалось подключиться!");
Term (2003-09-11 12:23:00) [16]
нет, я специально ради этого установил 1С чтобы экспериментировать, там точно никого нет я установил локальную версию
LordOfSilence (2003-09-11 12:23:00) [17]
Мне немного трудно тебе советовать, так как я через Олю
работал только из 1С в 1С. Через Delphi не пробовал.
Попробуй также чуть по-другому.
Сделай строковую переменную, в нее предварительно загоняй
значение "Справочник.Номенклатура", а потом вызывай
CreateObject. Кстати, попробуй также WideString.
LordOfSilence (2003-09-11 12:19:00) [18]
Ты пыташься вломиться монопольно. Проверь, может в базе еще
какой-то юзер торчит?
Term (2003-09-11 12:12:00) [19]
попробывал для начала это:
var
proba,proba1:OLEVariant;
begin
proba:=CreateOleObject("V1CEnterprise.Application");
proba.Initialize(proba.RMTrade,"/DC:\V7\DB /M","");
proba1:=proba.CreateObject("Справочник.Номенклатура");
вроде аналогично тому что сказанно в ссылке, однако вываливается исключение "Неудачная попытка создания объекта (Справочник.Номенклатура)0"
как быть....
Term (2003-09-11 11:55:00) [20]
спасибо буду разбиратьсЯ