Имя: Пароль:
1C
1С v8
Секс вместе с Clation *.tps через ODBC
0 jour
 
26.11.13
11:40
Всем доброго времени суток, стоит задача получать данные из внешних таблиц *.tps  
Единоразово уже умею получать данные путем конвертации таблиц в *.csv и дальше типовая загрузка из экселя, однако нужна постоянная связь с таблицами.

Таблицы зашифрованы, у каждой свой пароль, поэтому будем подключаться не к директории а к конкретной таблице сразу, в настройках драйвера пароль уже прописан, поэтому надеюсь его не нужно еще раз повторять в строке соединения.
Но где то я ошибаюсь, прошу хелп.

&НаСервере
Процедура ПолучитьДанные()
Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаСоединения = "DRIVER={SoftVelocity Topspeed driver (*.tps)}; Name = Cli:nm; DataBase=\\AVTOPROKAT\Dat\Clien; Extension = tps;";
Соединение.ConnectionString = (СтрокаСоединения);


Попытка
Соединение.Open();
Сообщить("База подключена!!!");

Таблица = Соединение.Open("select ::= Cli:nm FROM tablelist where groupby having");

Исключение
Сообщить("Не могу подключиться к базе!!!");
КонецПопытки;
КонецПроцедуры

По выполнению получаю два сообщения - "База подключена!" и сразу же "Не могу подключиться к базе", т.е. Таблицу я не получаю.

Вот это полный список команд для *.tps таблиц
statement ::= CREATE create | DROP drop | SELECT select orderby | INSERT insert |
DELETE delete | UPDATE update | passthroughSQL
passthroughSQL ::= any statement supported by the backend
create ::= TABLE tablename ( createcols ) | INDEX indexname ON tablename (
indexcolumns )
indexcolumns ::= indexcolumn | indexcolumn , indexcolumns
indexcolumn ::= columnname asc
drop ::= TABLE tablename | INDEX indexname
select ::= selectcols FROM tablelist where groupby having
delete ::= FROM tablename where
insert ::= INTO tablename insertvals
update ::= tablename SET setlist where
setlist ::= set | setlist , set
set ::= columnname = NULL | columnname = expression
insertvals ::= ( columnlist ) VALUES ( valuelist ) | VALUES ( valuelist ) | ( columnlist )
VALUES ( SELECT select ) | VALUES ( SELECT select )
columnlist ::= columnname , columnlist | columnname
valuelist ::= NULL , valuelist | expression , valuelist | expression | NULL
selectcols ::= selectallcols * | selectallcols selectlist
selectallcols ::= | ALL | DISTINCT
where ::= | WHERE boolean
having ::= | HAVING boolean
boolean ::= and | and OR boolean
and ::= not | not AND and
not ::= comparison | NOT comparison
comparison ::= ( boolean ) | colref IS NULL | colref IS NOT NULL | expression LIKE
pattern | expression NOT LIKE pattern | expression IN ( valuelist ) | expression NOT IN
( valuelist ) | expression op expression | EXISTS ( SELECT select ) | expression op
selectop ( SELECT select ) | expression IN ( SELECT select ) | expression NOT IN (
SELECT select ) | expression BETWEEN expression AND expression) | expression
NOT BETWEEN expression AND expression)
TopSpeed ODBC Interface — syntaxpattern ::= string | ? | USER
expression ::= expression + times | expression - times | times
times ::= times * neg | times / neg | neg
neg ::= term | + term | - term
term ::= ( expression ) | colref | simpleterm | aggterm | scalar
scalar ::= scalarescape | scalarshorthand
scalarescape ::= —*(VENDOR(MICROSOFT),PRODUCT(ODBC) FN fn )*—
scalarshorthand ::= { FN fn }
fn ::= functionname ( valuelist ) | functionname ( )
aggterm ::= COUNT ( * ) | AVG ( expression ) | MAX ( expression ) | MIN ( expression
) | SUM ( expression ) | COUNT ( expression )
simpleterm ::= string | realnumber | ? | USER | date | time | timestamp
groupby ::= | GROUP BY groupbyterms
groupbyterms ::= colref | colref , groupbyterms
orderby ::= | ORDER BY orderbyterms
orderbyterms ::= orderbyterm | orderbyterm , orderbyterms
orderbyterm ::= colref asc | integer asc
asc ::= | ASC | DESC
colref ::= aliasname . columnname | columnname
tablelist ::= tablelistitem , tablelist | tablelistitem
tablelistitem ::= tableref | outerjoin
outerjoin ::= ojescape | ojshorthand
ojescape ::= —*(VENDOR(MICROSOFT),PRODUCT(ODBC) OJ oj )*—
ojshorthand ::= { OJ oj }
oj ::= tableref LEFT OUTER JOIN tableref ON boolean | tableref LEFT OUTER JOIN
oj ON boolean
1 МихаилМ
 
26.11.13
11:51
DataBase=\\AVTOPROKAT\Dat\Clien

нужен полседний слаш
те

DataBase=\\AVTOPROKAT\Dat\Clien\
2 МихаилМ
 
26.11.13
11:52
"select ::= Cli:nm FROM tablelist where groupby having"

бред какой то
3 jour
 
26.11.13
12:02
(2) возможно и бред, как получить колонку "Cli:nm" ?
хотя конечно лучше получить всю таблицу, думаю это  selectallcols ::= | ALL | DISTINCT
но я не знаю как передавать эти строчки
4 МихаилМ
 
26.11.13
12:06
(3)
как обычно. по стандарту sql92.

select * from имятаблицы без tps


объединения таблиц работают только внутренние через where.

мне не удалось заставить работать "LEFT OUTER JOIN"
5 Mikeware
 
26.11.13
12:10
Кларион жив?
6 МихаилМ
 
26.11.13
12:12
(5)

стал   надстрой на мс скл
7 Mikeware
 
26.11.13
12:14
(6) забавно. но если надстройка над мелкомягким - почему tps остался?
Эх, лет 20 его не видел.... даже 22
8 МихаилМ
 
26.11.13
12:15
(0)

вот программа , которая смогла работать более менее нормально
с этим odbc драйвером  

http://alekseyrybakov.narod.ru/ViewODBC.html
9 МихаилМ
 
26.11.13
12:16
(7)
наверно какие-то старые базы от 6 клариона.
10 jour
 
26.11.13
12:31
(8) Такс.. программа запустилась, таблицу открыл, записи вижу, хорошо, осталось научиться писать запросы :)
11 WildSery
 
26.11.13
12:36
12 WildSery
 
26.11.13
12:37
или не, даже лучше вот такую поискать http://www.ozon.ru/context/detail/id/6577098/
13 jour
 
26.11.13
12:40
(12) Спасибо друг :)
14 jour
 
26.11.13
13:14
Что то не клеится

Процедура Подключиться()
    Соединение = Новый COMОбъект("ADODB.Connection");
    Таблица = Новый COMОбъект("ADODB.Recordset");
    
    СтрокаСоединения = "DRIVER={SoftVelocity Topspeed driver (*.tps)}; Name = Clarion; DataBase=\\AVTOPROKAT\Dat\Clien\; Extension = tps;";
    Соединение.ConnectionString = СтрокаСоединения;
    
    Попытка
        Соединение.Open();
        Сообщить("Соединение установлено!!!");
        
        Таблица.Open("SELECT * FROM Clien", Соединение);
        
        Сообщить("База подключена!!!");
        
    Исключение
        Сообщить("Не могу подключиться к базе!!!");
        //Таблица.Close();
        //Соединение.Close();
        //
    КонецПопытки;
КонецПроцедуры

Таблицу не получаю, хотя в ViewODBC запросы нормально работают
15 МихаилМ
 
26.11.13
13:24
(14)
зачем же Вы в попытку поместили две разные ситуации

подключение к бд и извлечение данных.


сделайте культурно разные методы

подсключения
получения данных
создания типизированной тз на основе типов oledb (ado)
заполнения тз

отображения тз в тп.
16 МихаилМ
 
26.11.13
13:28
еще

даты в кларе хранятся в виде целых чисел

формула  приведения 1800.12.28+число дней клары
17 jour
 
26.11.13
13:31
(16) на счет дат я уже давно разобрался, там чуть сложнее чем вы написали

Функция ПреобразоватьВДату(Значение)
    
    Значение = СтрЗаменить(СокрЛП(Значение),",","");
    Пока Число(СтрЗаменить(Значение," ","")) < 9999 ЦИКЛ
        Значение = Число(СтрЗаменить(Значение," ","")) * 10    
    КонецЦикла;
    Если Число(СтрЗаменить(Значение," ","")) > 99999 Тогда
        Возврат Неопределено
    Иначе
        Возврат Дата(1800,12,28) + Значение * 86400;
    КонецЕсли;
    
КонецФункции
18 jour
 
26.11.13
13:35
(15) Культурно я разделял, сначала сделал две функции, по логике вроде должно работать, но не работает. Стал искать проблему, в отладке заметил что в строке подключения к БД не сохраняется значение "Соединение.ConnectionString", устанавливается "Provider=MSDASQL.1;" после открытия.
Вторую функцию вообще по строчкам разделил
        Таблица = Новый COMОбъект("ADODB.Recordset");
        Таблица.ActiveConnection = Соединение;
        Таблица.Source = "SELECT * FROM Clien";
        Таблица.Open();
Но не пашет...
19 jour
 
26.11.13
13:36
Проблема в том, что я пока не знаю как правильно должно быть, вот и мечусь
20 МихаилМ
 
26.11.13
13:39
(18)
у меня тоже както не подслючалась
и тогда я тоже заметил пропажу.

помогла тупо перезагрузка. но так было только раз

после перезагрузки , когда все заработало не стал разбираться
есть проража или нет.
21 МихаилМ
 
26.11.13
13:51
попробуйте такую строку подключения
"DRIVER={SoftVelocity Topspeed driver (*.tps)};DBQ=\\AVTOPROKAT\Dat\Clien\; Extension = tps;";

вместо DataBase
DBQ
22 МихаилМ
 
26.11.13
13:52
кстати в программе (8)
можно подглядеть строку подключения
23 МихаилМ
 
26.11.13
13:53
+(22)
для dsn источника
24 jour
 
26.11.13
13:59
(23) А то. что таблицы запаролены - не может никак влиять ?
25 МихаилМ
 
26.11.13
14:03
(24)
не знаю . подсмотрите в строке поключения dsn,
как написано в (22)
26 jour
 
26.11.13
14:28
(25) А драйвер можете свой прислать ? Мой не настраивается никак, при попытки редактирования настроек пишет - "Архитектура драйвера и архитектура приложения не соответствуют друг другу"
27 МихаилМ
 
26.11.13
14:40
(26)
отправляте запрос в на email в ЛК
28 МихаилМ
 
26.11.13
14:43
(26)
"Архитектура драйвера и архитектура приложения не соответствуют друг другу"

если у Вас 64-битная ОС, то правильно пишет.

Вы не тот dsn менеджер запускаете.

в поиск.
29 jour
 
26.11.13
14:59
(27) написал.
30 jour
 
26.11.13
15:51
(28) ОС 64-битная, однако одбс драйвера 32х стоят и работают

ваш драйвер как на вин 7 поставить ?
31 МихаилМ
 
26.11.13
16:04
(30)
шаманским способом:
в 32 битной ВМ с win XP

запустил Process Monitor (PM), запустил setup
в PM настроил фильтр. исполнил setup.

проанализировал трассы PM и выяснил в какие папки и какие ветки реестра записываются. воспроизвел, применительно к 64 версии odbc ветке реестра и скопировал файлы.
32 МихаилМ
 
26.11.13
16:06
+(31)
списки dll и ветки реестра не сохранил.
33 Злопчинский
 
26.11.13
16:06
все таки я правильно проинтуичил, что не КлаТион, а Кларион.. ;-)
.
а сколько в свое время было шуму по Btrieve (вроде так пишется)
34 jour
 
26.11.13
17:15
Уже из платформы сделал подключение к внешнему источнику, соединение есть, в конфигураторе таблицы видит, но при выводе выдает
Ошибка ODBC. SQLSTATE: 42000
Номер ошибки: 10015
Описание: [SoftVelocity Inc.][TopSpeed ODBC Driver]Expected lexical element not found: FROM
35 МихаилМ
 
26.11.13
17:19
(34)
исходите из того, что если Вы смогли подключиться
и получить данные в программе (8)

то сможете и в 1с из ADO.
36 МихаилМ
 
26.11.13
17:22
(34)
нет времени и возможности проверять Ваш драйвер.

но мой довольно глючный. И если у них "общие корни"

то таблицы в 1с отбражаться (открваться) не будут, но запросы
к данным выполняться будут.
37 jour
 
26.11.13
17:35
(36) Лан, спасибо
38 МихаилМ
 
26.11.13
17:44
(0)
если файл , не содержащий большой коммерческой тайны
могу проверить, будет ли он читаться.
39 ОдинСерый
 
26.11.13
18:39
шаманить ничего не надо берите МС акцесс и делайте коннект оттуда к кларионовским бд. потом и своего 1С запросто зацепитесь в акцессовским база... или если у вас мс скуль тогда еще проще из акцесса кидает в скуль и там прямо отрабатываете своим 1С. акцесс можете просто сделать экзешник который будет кидать данные на скуль по нажатию.
и вообще тут масса способов для творчества.
40 МихаилМ
 
26.11.13
18:51
(39)
Вы подсключались из акцесс к odbc источнику clarion ?
41 ОдинСерый
 
26.11.13
19:00
(40) ну ты молодец :)))
мс акцесс подключается напрямую ко всем видам дбф-шек никакиз одбс не надо. ну может если не будет в списке конверторов в самом акцесс то ищите библиотечки , хотя в стандартном все должно быть хотя конечно хз я последние акцессы не знаю может и уже нет... ищи старые пакеты
42 ОдинСерый
 
26.11.13
19:03
Совместимость Access со сторонними источниками данных[править | править исходный текст]
СУБД (Источник данных)    Версия Access    Драйвер    Обновляемые запросы
Файлы Excel    все    встроенный    Нет
SQLite            Да
MySQL    2000-2003    MyODBC v.3.51.X, 5.1.X    Да
PostgreSQL            Да
Firebird            Да
1C v.7.7 (dbf)    2003    Visual FoxPro ODBC driver v.6.01.8629.01    Нет
Paradox            
Oracle            
Текстовые файлы    все    встроенный    Нет
Таблицы html    все    встроенный    Нет

клариона нет... но он вообще стандартные файлы дбф
43 МихаилМ
 
26.11.13
19:15
не припомню, что бы я с Вами на "ты" переходил.

вопрос про подключение - не праздный. тк поключится к кларион и прочитать данные проблема. втом числе из аксес.
Не болтайте о том, с чем дело не имели.

"клариона нет... но он вообще стандартные файлы дбф"

- глупость . кларион не хранил данные в дбф.
44 Chai Nic
 
26.11.13
19:25
(43) "кларион не хранил данные в дбф"
Некоторые путают кларион с клиппером
45 ОдинСерый
 
26.11.13
19:30
Clarion и 1С читать надо на форуме иногда.
да я перепутал видимо кларион с чем-то из тех кто напрямую поддерживает форматы файлов xBase
46 Salimbek
 
26.11.13
19:34
(45) И что по ссылке хорошего?
47 ОдинСерый
 
26.11.13
19:37
(46) направление движения для тс дает.
кларион наверно давно умер думаю все равно где-то в сети есть приблуды для цепляния его данных в другие выжившие СУБД.
почему я акцесс привел в пример?! да потому что он был есть и будет, в отличие от остальные живших, умерших и трансформировашихся старых СУБД.
48 МихаилМ
 
26.11.13
19:40
(47)
читате внимательно (0)

"Единоразово уже умею получать данные путем конвертации таблиц в *.csv"

нет задачи "епляния его данных в другие выжившие СУБД".
49 K-5
 
26.11.13
19:57
а может скриптом это автоматизировать?
50 K-5
 
26.11.13
19:58
+(49) "Единоразово уже умею получать данные путем конвертации таблиц в *.csv"
51 Капитан Смоллет
 
26.11.13
22:27
(44) Кларион жив.
http://www.softvelocity.com/
52 Капитан Смоллет
 
26.11.13
22:38
53 jour
 
27.11.13
11:27
Заснуть сегодня не смог, закрываю глаза и вижу таблицы :)

для истории:

Таблица = Новый ТаблицаЗначений();
Таблица.Колонки.Добавить("НаименованиеПолное",,"Наименование полное");
// и т.д.

ConnectionString = "DSN=BodyType;DBQ=C:\Work\BodyType.tps\!;Description=BodyType;Extension=tps;EnvFile=C:\Work\1.env;Oem=Y;NullEmptyStr=Y;";
Connection = Новый COMОбъект("ADODB.Connection");
Command  = Новый COMОбъект("ADODB.Command");
RecordSet  = Новый COMОбъект("ADODB.RecordSet");

Попытка
     Connection.Open(СокрЛП(ConnectionString));
     Command.ActiveConnection   = Connection;
     Command.CommandText = "SELECT * FROM BodyType";
     RecordSet = Command.Execute();
     RecordSet.MoveFirst();
    
     Пока RecordSet.EOF = Ложь Цикл
         Строка = Таблица.Добавить();
         Строка.НаименованиеПолное = RecordSet.Fields(RecordSet.Fields.Item(0).Name).Value;
         RecordSet.MoveNext();
/// и т.д.
     КонецЦикла;

таким образом вытаскиваются все записи.

Дальше план такой, делаю регламентное задание для вытаскивания новых записей, все вытащенное запихиваю в промежуточную таблицу MSSQL и ее уже подключаю как внешний источник данных в 1С. Может советы дельные может дать ? сложностей умозрительно пока не вижу.
54 МихаилМ
 
27.11.13
13:14
опять бред.
создайте dsn для подключения к базе, а не к файлу.

и работайте с ним из ado.

(53)
впрочем если соединять таблицы не собираетесь - сойдет и подключение к таблице.


RecordSet.Fields(RecordSet.Fields.Item(0).Name)
тоже быдло код.


могу еще более бредовый идею подать

из мс скл сделать подключения к кларе  затем подключится к мс скл.
55 jour
 
27.11.13
14:12
(54) у меня одна из управленческих программ работает в этих таблицах, и сотрудники несколько раз пишут одно и тоже - сначала в эту старую, потом в 3 разные 1С (данные связаны но не одинаковые). Данных довольно много, одну и туже работу по четыре раза делать глупо, но необходимо, чтобы данные, имеющиеся в tps таблицах были доступны в нескольких 1С. Я согласен, что можно просто из dsn подключения брать данные, но мне где то нужно хранить историю, что я взял а что не взял, влазить в типовые 1С не хочется.
На счет быдло кода.. покажите пример хорошего :)
56 jour
 
27.11.13
14:16
(54) а как из МС СКЛ подключиться к кларе ????
57 МихаилМ
 
27.11.13
14:46
(55)

правильно
RecordSet.Fields(0)

по поводу синхронизации: все равно равно нужно учитывать не только новые данные, но и измененные.

так что придется  сравнивать таблицы текущую  и с копией
для выявления новых и измененных

(56) вечером (в ~22 00) покажу. сейчас нет времени разбираться.
58 МихаилМ
 
28.11.13
11:22
(56)
реализуется через OPENDATASOURCE

только на сервере должно быть разрешение его использования