Имя: Пароль:
1C
1С v8
работа с sql из 1С
,
0 Мисти
 
09.06.14
08:46
Пока ничего непонятно.
Есть небольшая база (для обмена данными), сделанная непосредственно в скл. Мне надо как-то к ней подключиться и в известные поля положить известные мне данные. Как это делают?
1 Поpyчик-4
 
09.06.14
08:57
2 butterbean
 
09.06.14
08:58
какие же все-таки ленивые бывают люди
3 Поpyчик-4
 
09.06.14
08:59
(2) ТС, ну одно слово, сам понимаешь.
Не взлетит у неё, нутром чую.
4 Мисти
 
09.06.14
09:24
Я первым делом сама поискала в яндексе, ничего не нашла.
По второй ссылке в (1) кое-что, но тоже не всё.
А нет ли где полноценных инструкций?
(3) Чё это не взлетит?
5 ДенисЧ
 
09.06.14
09:27
Уууу.....
Шоу маст гоу он....
6 mikecool
 
09.06.14
09:37
(4) ищи в гугле )
7 Мисти
 
09.06.14
09:38
Ну серьезно! Неужели никто не делал?
8 ДенисЧ
 
09.06.14
09:40
(7) Нет. Вообще никто и никогда. Ты уникальная
9 andreymongol82
 
09.06.14
09:41
(7) Даю подсказки. Можно как п оотдельности, так и вместе
ADODB, Внешние источники данных.
10 Мисти
 
09.06.14
09:41
(8) Предполагаю, что это юмор.
Какими источниками пользовались остальные? Как выглядят кусочки программы?
11 ДенисЧ
 
09.06.14
09:43
(10)
соед = СоединитьсяСSQL();
стрЗапрос = "BEGIN TRAN";
соед.CommandText = стрЗапрос;
соед.Execute(стрЗапрос);

Вот тебе примитивный кусок кода

Функция СоединитьсяСSQL()
    Соединение003 = Новый COMОбъект("ADODB.Connection");
    строкаПодключения = Константы.СтрокаПодключения003.Получить();
    //строкаПодключения = "driver={SQL Server};SERVER=PH-1CAPP-04\TESTSQL;DATABASE=B1_DChernyaev; User Id=d.chernyaev; Password=123698745";
    Попытка
        Соединение003.Open(строкаПодключения);
    Исключение
        ЗаписьЛога("", "Не смогли подключиться к sql-базе: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    Cmd = Новый COMОбъект("ADODB.Command");
    Cmd.ActiveConnection = Соединение003;
    Cmd.CommandType = ТипКомандыАДО("adcmdtext");
    
    Cmd.CommandTimeout = 600;
    Возврат Cmd;
КонецФункции
12 Мисти
 
09.06.14
09:57
(11) Спасибо! Кое-что проясняется.
Таблица называется Invoice, мне надо создать новую запись и заполнить поля InvoiceNumber и InvoiceDateю
Как это написать?
13 ДенисЧ
 
09.06.14
09:58
(12) Ну уж нет... Бегом читать учебник...
14 Мисти
 
09.06.14
09:58
у меня еще останется куча задач по поиску нужных для выгрузки данных в 1С - они в разных справочниках и документов,зависят от разных условий и т.д.
(13) Так какой учебник? Я с этого и начала!
15 Мисти
 
09.06.14
10:00
По сути - у меня с скл дел не много - считать все данные нескольких таблиц и заполнять несколько таблиц, даже условий никаких не надо - берем всё подряд. Да, и очистить после себя!
16 ДенисЧ
 
09.06.14
10:02
(14) Например, http://firststeps.ru/sql/sql1.html
17 Мисти
 
09.06.14
10:03
Нашла кусочек.
Похоже?
ВЫБРАТЬ
| dbo_orders.Ссылка,
| dbo_orders.name,
| dbo_orders.idorder,
| dbo_orders.idcustomer.idcustomer КАК idcustomer,
| dbo_addclassification.name КАК name1,
| dbo_customer.addnum
|ИЗ
| ВнешнийИсточникДанных.ecad_okon.Таблица.dbo_orders КАК dbo_orders
| ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.ecad_okon.Таблица.dbo_custom er КАК dbo_customer
| ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.ecad_okon.Таблица.dbo_addcla ssification КАК dbo_addclassification
| ПО dbo_customer.idaddclassification1 = dbo_addclassification.Ссылка
| ПО dbo_orders.idcustomer = dbo_customer.Ссылка
|ГДЕ
| dbo_orders.name = &name"
18 Мисти
 
09.06.14
10:21
SELECT *
FROM Invoice - из того, что там написано, мне, походе, надо это. - ну, чтобы считать.
А из 1С-то как это написать?
19 zmaximka
 
09.06.14
10:30
т.е. подключиться к базе уже получилось?
20 Мисти
 
09.06.14
10:34
(19) А у меня нет пока этой базы, ее делаю не я, и она еще вообще не готова.
У меня куча работы по совмещению реквизитов (штук 100!) в 1С и в их базе, по поиску нужных данных в 1С для выгрузки и по правильному размещению данных в 1С считанных, а сам факт подключения (считывания и записи)- технический, мне надо только знать, как это выглядит, чтобы потом углубиться в свои задачи.
21 Apokalipsec
 
09.06.14
10:37
(20) Тебе значит из скуля ничего выбирать не надо. Будешь просто дописывать во внешний источник. Сделай запрос в 1С и пропиши названия полям соответственно названиям колонок в таблице бд.
22 Мисти
 
09.06.14
10:41
Так мне, получается, в запросе и названия не надо прописывать!
селект олл - и готово!
А потом - для каждого Стр из выборка Цикл
Объект1С.Реквизит1С = Стр.РеквизитСКЛ

Как написать обращение-то?
23 Segate
 
09.06.14
11:38
(0) Позовите программиста лучше ) Быстрее будет. А по хорошему - подключаешься к базе и используешь банальные Insert и update.
24 Kalambur
 
09.06.14
11:41
(23) да она все время тут отжигает, иногда даже везет, пишут все за нее, пока не надоест ))
25 Мисти
 
09.06.14
12:03
Если б я знала эти 2 фразы - я бы подсказала.
26 SSSSS_AAAAA
 
09.06.14
12:14
(25) Какие ЭТИ? Какие 2?
27 Мисти
 
09.06.14
12:27
Как считать поля из базы и как туда добавить свои данные.
Уже ж вырисовывается!
В 11 - соед = СоединитьсяСSQL();
стрЗапрос = "BEGIN TRAN";
соед.CommandText = стрЗапрос;
соед.Execute(стрЗапрос);
Мой стрЗапрос будет
"SELECT *
FROM Invoice"
Где я потом получу данные?
И очистить!
Записать, наверное, сложнее, но всё равно ж - наверное, как с регистром - создать запись, заполнить столбцы и сохранить.
- еще 2 волшебных слова.
28 Segate
 
09.06.14
12:30
(27) Еще раз. читайте документацию по SQL, зайдите в менеджер SQL попробуйте в консоли сделать то что вы хотите, как только получится, скопируйте текст в 1с, и добавьте строку подключения.
29 SSSSS_AAAAA
 
09.06.14
12:35
(27) соед.Execute(стрЗапрос); - это выполнение инструкции, не возвращающей набора данных.
rsDoc = Соединение.Execute(strSQL); - и, о чудо, в rsDoc мы обнаруживаем выданный запросом набор данных.
Далее, как обычно, rsDoc.next и, например, КодПлатежа = rsDoc.Fields("uniq").Value; для чтения значения конкретного поля.
Все это есть в доке по ADO раз уж эта технология выбрана для доступа к внешним данным. Эту доку читать не пробовали?
30 catena
 
09.06.14
12:37
>>И очистить!

Ну точно так же!

DELETE *
FROM Invoice
31 Segate
 
09.06.14
12:38
(30)для слабаков. в такой формулировке Drop Быстрее отработает
32 Мисти
 
09.06.14
13:25
(29) А в чем разница? Только в том, что возвращается значение?
33 Мисти
 
09.06.14
13:26
Где бы это описание найти? - "Все это есть в доке по ADO"?
34 ДенисЧ
 
09.06.14
13:29
(33) А поискать в интернете не пробовала?
g adodb.connection - там много чего интересного есть
35 Мисти
 
09.06.14
13:36
(34) Я пробовала, но недолго. Я как-то не так яндекса спрашиваю и мне вываливается совсем не то.
36 Segate
 
09.06.14
13:39
(35) У нас разные яндексы, у меня например 3я ссылка сверху ведет на мсдн. А у вас?

ЗЫ это наверное санкции...
37 Segate
 
09.06.14
13:40
38 Мисти
 
09.06.14
13:42
(37) О! Я по-английски-то не очень - так - "как пройти к автобусу".
А что, по-русски нет??
39 Segate
 
09.06.14
13:45
(38) сколько можно? Тебе предлагают уже готовое, ты и это не хочешь почесаться и взять. Там текста на 2 страницы, тебе нужно всего пара обзацев. словарик в руки и вперед
40 Woldemar177
 
09.06.14
13:46
Вопрос (0) а что за база то? Оракловская на скотине?
41 Segate
 
09.06.14
13:46
http://phpclub.ru/detail/article/adodb_1

Это идет 5й ссылкой в яндексе, если что.
42 Серго62
 
09.06.14
13:54
(33) >> Где бы это описание найти? - "Все это есть в доке по ADO"?

Вот здесь: http://www.askit.ru/custom/progr_admin/m13/13_03_06_ado_recordset_updating.htm
43 Поpyчик-4
 
09.06.14
13:56
(41) От этой ссылки Мисти и вовсе станет скорбной на голову. Там же PHP, неведом..... ....я
44 Segate
 
09.06.14
13:58
(43) какая разница то? После создания адодб - на любом языке писать одинакого...
45 Поpyчик-4
 
09.06.14
13:59
(44) Для кого как. Для тебя и меня разницы нет.
46 Мисти
 
09.06.14
14:10
в 42 мне очень нравится! Спасибо!
47 Мисти
 
09.06.14
14:12
Dim rs

Set rs = CreateObject("ADODB.Recordset")

rs.CursorType = 1

rs.LockType = 3

rs.Open "select * from dbo.customers", cn

rs.AddNew

rs.Fields("CompanyName") = "Test rs company"

rs.Fields("Country") = "Germany"

rs.Fields("CustomerId") = "TESTR"

rs.Update
48 Мисти
 
09.06.14
14:14
Не все слова понятны.
Dim rs?
Set rs = CreateObject("ADODB.Recordset") - это прямо в 1С можно Написать?
Recordset - это название базы? или чего? (ну не таблицы же!)
49 Мисти
 
09.06.14
14:15
rs.CursorType = 1

rs.LockType = 3 - это тоже непонятно.
Зато понятно вот это!!
rs.AddNew

rs.Fields("CompanyName") = "Test rs company"

rs.Fields("Country") = "Germany"

rs.Fields("CustomerId") = "TESTR"

rs.Update
Именно тут основное поле моей деятельности - надо сопоставить их поля с нашими.
50 Segate
 
09.06.14
14:22
(49) скажи нам честно, ты троллишь так? )

ты берешь код для VB копируешь его в 1с и мечтаешь, что все взлетит?
51 Kalambur
 
09.06.14
14:26
(50) пока ей не напишут рабочий код, так и будет :)
52 Мисти
 
09.06.14
14:27
rs.Fields("Country") = "Germany" - вот такая строчка в 1С не сработает?
53 Segate
 
09.06.14
14:30
нет =)) ругнется, на точку с запятой. инфа 146%
54 Серго62
 
09.06.14
14:36
(48) Это текст на vbs, под 1с его нужно адаптировать
55 ttk
 
09.06.14
14:38
читать проще через внешние источники данных(если версия платформы позволяет)
пишем через рекордсет
56 Серго62
 
09.06.14
14:39
(55) если писать все равно через рекордсет, то зачем с внешним источником заморачиваться?
57 ttk
 
09.06.14
14:41
(56) я так понял ТС скл скл не знает, проще запрос конструктором на 1с наклепать
58 Мисти
 
09.06.14
14:44
Давайте совсем просто. Без подключения, буду писать пока "тело".
Есть таблица Invoice, надо заполнить поле InvoiceNumber.
Как это написать на 1С?
59 МихаилМ
 
09.06.14
14:47
60 Segate
 
09.06.14
14:47
"INSERT INTO Invoice (InvoiceNumber)
    VALUES (InvoiceNumber1c)"

Так как-то должно сработать
61 Мисти
 
09.06.14
14:50
А это написать в стрЗапрос из (11)?
А если разных полей в 1 записи 20 и записей 50 - наверное, как-то можно сначала эту кучу создать, а потом записать?
Не с каждым же полем в базу лазить?
62 Мисти
 
09.06.14
14:51
(59) Там в основном описание бед и ошибок.
63 ttk
 
09.06.14
14:53
(61) "INSERT INTO Invoice (InvoiceNumber)
    VALUES (InvoiceNumber1c,p2_1c,...,pN_1c)"
64 Мисти
 
09.06.14
14:55
"INSERT INTO Invoice (InvoiceNumber,р2,р1) ?
Т.е. сначала перечислить все их поля, потом все свои значения?
65 Мисти
 
09.06.14
14:56
Если у них есть описание типа, мне не надо никак типы описывать? Главное - передавать правильного типа?
66 Серго62
 
09.06.14
14:58
Соединение = Новый COMОбъект("ADODB.Connection");
    Соединение.ConnectionString = СтрокаСоединения;
    Соединение.Provider = "Provider=SQLOLEDB.1";
    //
    Соединение.CommandTimeout = 0;      // Бесконечно долгое ожидание выполнения команды
    Соединение.ConnectionTimeout = 0;   // Бесконечно долгое ожидание ответа от сервера
    //
    Соединение.Open();
    //
    РасхНакл            = Новый COMОбъект("ADODB.Recordset");
    РасхНакл.CursorType = 1;
    РасхНакл.LockType   = 3;
ТекстЗапросаНакл = "select * from ИмяТаблицы";

РасхНакл.Open(ТекстЗапросаНакл, Соединение);


        РасхНакл.AddNew();
        РасхНакл.Fields("ИмяПоляТаблицы").Value = Какоетозначение; //

РасхНакл.Update();

Как-то так...
67 ttk
 
09.06.14
15:01
(64) да
68 Мисти
 
09.06.14
15:07
66 Спасибо!
67 - всё равно, перечислять в каждой команде по полю, или задать списком? (мне удобнее - по полю, чтобы было видно)
69 ttk
 
09.06.14
15:16
ну ты можешь сформировать строку запроса скл как хочешь
70 Segate
 
09.06.14
15:19
(69) не... она не может. вот так надо: "Ты можешь  ctrl+c Ctrl+v как напишут"
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.