Имя: Пароль:
1C
1С v8
Работа с скл из 1с
0 Мисти
 
22.07.14
18:11
Уже вижу саму базу - таблицы,представления,синонимы и т.д.
Пока непонятно, где я увижу данные, пока их там, наверное, еще нет.
Подключение срабатывает!
    Соединение003 = Новый COMОбъект("ADODB.Connection");
    строкаПодключения = "....";
    Попытка
        Соединение003.Open(строкаПодключения);
    Исключение
        Сообщить( "Не смогли подключиться к sql-базе: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    Cmd = Новый COMОбъект("ADODB.Command");
    Cmd.ActiveConnection = Соединение003;
    //Cmd.CommandType = ТипКомандыАДО("adcmdtext"); // это она не понимает    
    Cmd.CommandTimeout = 600;
    Возврат Cmd;

Дальше не работает:
    Соединение = СоединитьсяСSQL();
    
    Контрагенты            = Новый COMОбъект("ADODB.Recordset");
    Контрагенты.CursorType = 1;
    Контрагенты.LockType   = 3;
    ТекстЗапросаAccount = "select * from Account";
    Контрагенты.Open(ТекстЗапросаAccount, Соединение);

Ругается:
Ошибка при вызове метода контекста (Open)
    Контрагенты.Open(ТекстЗапросаAccount, Соединение);
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с др
1 Мисти
 
22.07.14
18:11
Таблица есть с названием dbo.account
2 Wobland
 
22.07.14
18:14
> Возврат Cmd
куда?
3 ДенисЧ
 
22.07.14
18:14
Контрагенты = Соединение.Execute("select * from account");
4 Мисти
 
22.07.14
18:21
Спасибо!
А потом Контрагенты.AddNew();?
Мне бы еще проверить по реквизиту с названием UI1C, что такого элемента нет?
5 Мисти
 
22.07.14
18:23
Я могу одновременно смотреть, что там в этой базе через ManagementStudio и подключаться из 1С?
6 Мисти
 
22.07.14
18:25
Контрагенты = Соединение.Execute("select * from account");
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Не был задан текст команды для объекта команды.
7 Мисти
 
22.07.14
18:29
Wobland, что скажешь?
8 Wobland
 
22.07.14
18:32
у меня так:

Connection=Новый COMОбъект("ADODB.Connection");
Connection.Open(ConnectionString);
RS=Новый COMОбъект("ADODB.Recordset");
RS.Open(ТекстЗапроса, Connection);
Если НЕ RS.EOF Тогда
    RS.MoveFirst();
КонецЕсли;
Пока НЕ RS.EOF Цикл
    RS.MoveNext();
КонецЦикла;
RS.Close();
9 ДенисЧ
 
22.07.14
18:34
Блин, я забыл, что у тебя соединение команда...
Соединение.CommandText = "select * from account");
контрагенты = соединение.Execute();
10 Мисти
 
22.07.14
18:35
Спасибо!
Что б я без вас делала!
11 ДенисЧ
 
22.07.14
18:35
То же самое, что и с нами, только без нас
12 Wobland
 
22.07.14
18:37
(10) документацию бы читала. нажеюсь
13 Wobland
 
22.07.14
18:38
(11) без нас не интересно. знаешь, каков я бываю в конфигураторе...
14 ДенисЧ
 
22.07.14
18:40
(13) Даже слышать об этом не хочу, не то что знать...
15 Fragster
 
гуру
22.07.14
18:52
// магические числа
мМагияСКЛ = Новый Структура;
//http://msdn.microsoft.com/en-us/library/windows/desktop/ms675318(v=vs.85).aspx
мМагияСКЛ.Вставить("adVarChar", 200);
мМагияСКЛ.Вставить("adDouble", 5);
мМагияСКЛ.Вставить("adDecimal", 14);
мМагияСКЛ.Вставить("adInteger", 3);

//http://msdn.microsoft.com/en-us/library/windows/desktop/ms676517(v=vs.85).aspx
мМагияСКЛ.Вставить("adAsyncExecute", 16); // 0x10
мМагияСКЛ.Вставить("adExecuteNoRecords", 128);// 0x80    
мМагияСКЛ.Вставить("adExecuteRecord", 2048);// 0x800    

//http://msdn.microsoft.com/en-us/library/windows/desktop/ms677542(v=vs.85).aspx
мМагияСКЛ.Вставить("adUseClient", 3);// 0x80    

мМагияСКЛ.Вставить("adCmdText", 1);
мМагияСКЛ.Вставить("adStateClosed", 0);
мМагияСКЛ.Вставить("adStateOpen", 1);
мМагияСКЛ.Вставить("adStateExecuting", 4);
мМагияСКЛ.Вставить("adStateFetching", 8);
16 Fragster
 
гуру
22.07.14
18:52
Функция ПолучитьПодключениеКОбменнойБазе(Сервер, База, Пользователь, Пароль) Экспорт
    Connection    = Новый ComОбъект("ADODB.Connection");
    СтрокаПодключения = "Driver={SQL Server}; Server="+Сервер+"; DataBase="+База+"; UID="+Пользователь+"; PWD="+Пароль+";";
    Connection.ConnectionString = СтрокаПодключения;
    Connection.CursorLocation = мМагияСКЛ.adUseClient;
    Connection.Open();
    Возврат Connection;
КонецФункции
17 Fragster
 
гуру
22.07.14
18:53
Команда = Новый ComОбъект("ADODB.Command");
    Команда.ActiveConnection = Соединение;
    Команда.CommandType = мМагияСКЛ.adCmdText;
    
    Команда.CommandText =
    "SELECT TOP 1
    |    [SessionId]
    |FROM [Session]
    |WHERE
    |    [STATUS] = ?";
    Команда.Parameters(0).Value = Статус;
    RecordSet = Команда.Execute();
    
    Если RecordSet.EOF Тогда
        Возврат Неопределено;
    Иначе
        Возврат RecordSet.Fields("SessionId").Value;
    КонецЕсли;
18 Fragster
 
гуру
22.07.14
18:55
Процедура УстановитьСтатусСессииОбмена(Соединение, ИД, Статус)
    Команда = Новый ComОбъект("ADODB.Command");
    Команда.ActiveConnection = Соединение;
    Команда.CommandType = мМагияСКЛ.adCmdText;
    Команда.Prepared = Истина;
    
    Команда.CommandText =
    "UPDATE
    |    [Session]
    |SET
    |    [STATUS] = ?
    |WHERE
    |    [SessionId] = ?";
    Параметры = Новый COMSafeArray("VT_VARIANT", 2);
    Параметры.SetValue(0, Статус);
    Параметры.SetValue(1, ИД);
    Команда.Execute(, Параметры, мМагияСКЛ.adExecuteNoRecords + мМагияСКЛ.adAsyncExecute);
КонецПроцедуры
19 Мисти
 
22.07.14
19:05
па-па, что это бы-ло?
20 Мисти
 
22.07.14
19:29
Ну вот, приплыли:
{Форма.Форма1.Форма(57)}: Ошибка при вызове метода контекста (AddNew)
        Контрагенты.AddNew();
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Текущий объект Recordset не поддерживает обновление. Это связано с ограничением поставщика или с выбранным типом блокировки.
21 Мисти
 
22.07.14
19:37
Wobland, я тебя вижу!
22 Мисти
 
22.07.14
19:41
Я что-то не так написала, или это база не для данных, а для красоты?
23 ДенисЧ
 
22.07.14
19:43
(20) а зачем так делать?
Кто мешает сказать insert?
24 Мисти
 
22.07.14
20:00
Интересный вопрос - зачем. Затем, что этот вариант был в предыдущей подсказке.
insert - что?
25 Мисти
 
22.07.14
20:01
И почему insert может сработать, а AddNew нет?
26 ДенисЧ
 
22.07.14
20:04
Так. А теперь все дружно скажем хором - Мисти , бегом читать учебник по SQL!
27 ДенисЧ
 
22.07.14
20:05
Я даже ссылочку не поленился найти
http://firststeps.ru/sql/r.php?14
28 Мисти
 
22.07.14
20:07
(27) Спасибо!
Я первую тему как раз с этого и начинала!
29 Мисти
 
22.07.14
20:12
Отлично-прекрасно, мне это нравится!
INSERT INTO Customers( city, cname, cnum )
VALUES( 'Новосибирск', 'Петров', 2010 )
Всё понятно, непонятно, как это из 1С написать.
Напишите мне, люди добрые, последний кусочек!
Мне надо в таблице account поискать строку по полю UI1C, и если найдено - обновить, если не найдено - добавить. Ну и кучу реквизитов заполнить, это я уж справлюсь.
30 Мисти
 
22.07.14
20:33
Сочинять самой??
31 Fragster
 
гуру
22.07.14
20:42
(29) совмести вместе (15)(16) и (18)... причем
    Параметры.SetValue(...);
...
    Команда.Execute(, Параметры, );

можно в цикле
32 Мисти
 
22.07.14
21:04
Соединение.CommandText = "select * from account";
контрагенты = соединение.Execute()
Пока есть вот что.
Дальше-то что?
33 Мисти
 
22.07.14
22:19
ау?
Я уже всё остальное переделала, даже ужин приготовила.
34 Dmitry1c
 
22.07.14
22:23
МОИ КРОВАВЫЕ ГЛАЗА
35 Dmitry1c
 
22.07.14
22:23
(33) покорми, а? :( хочу домашней еды...
36 Мисти
 
22.07.14
22:24
Да ну, из фарша покупного!
37 Мисти
 
22.07.14
22:44
Параметры = Новый COMSafeArray("VT_VARIANT", 2); - вот это что?
38 Мисти
 
22.07.14
22:54
http://www.cyberforum.ru/1c/thread848218.html - вот там хорошо написано, только там выгрузка из скл, а мне пока загрузить туда нужно.
39 Мисти
 
22.07.14
22:59
http://help1c.com/faq8/view/383.html - и там тоже чтение, а не запись.
40 Мисти
 
22.07.14
23:02
Тут обновление записи, а мне нужно добавление
http://nastroy-ka.ru/system1c/110--1-adodb-sql.html
41 Мисти
 
22.07.14
23:08
http://www.odincplus.com/stati/primer-raboty-1s-s-internet-magazinom.html
Наверное, тут вариант мне подходящий!

2. Выбрать категорию товаров (таким образом, выборку можно сделать почем угодно):

ТекстЗапроса = "SELECT category_id FROM categories WHERE name="+"'"+ КатегорияНаименование+"'";
ВыборкаКатегории = Соединение.Execute(ТекстЗапроса);
Пока ВыборкаКатегории.EOF()=0 Цикл //получаем все поля      
  Код= ВыборкаКатегории.Fields("category_id").Value;      
  ВыборкаКатегории.MoveNext();
КонецЦикла;

3. Обновить цену:

ТексЗапроса = "UPDATE products SET price="+"'"+Цена+"'"+ "WHERE model="+"'"+ТоварыНаименование+"'"+ " and category_id="+"'"+Категория+"'"+ " and brand_id="+"'"+Бренд+"'";
Соединение.Execute(ТексЗапроса);
Соединение.Close();

4. Добавить товар:

ТексЗапроса = "INSERT INTO products SET model="+"'"+Товар+"',"+"price="+"'"+Цена+"',"+"enabled="+"'"+АктивныйДаНет+"',"+"category_id="+"'"+Категория+"',"+"brand_id="+"'"+Бренд+"'";
Соединение.Execute(ТексЗапроса);
Соединение.Close();
42 Мисти
 
22.07.14
23:21
Для Каждого СтрКонтр из ТабКонтр Цикл
  ОбработкаПрерыванияПользователя();

ТекстЗапроса = "SELECT * FROM account WHERE UI1C="+"'"+ КатегорияНаименование+"'";

А как туда переменную вставить?
СтрКонтр.UI1C - я должна искать по этому реквизиту

Выборка = Соединение.Execute(ТексЗапроса);
Если Выборка.EOF()=0 //- нет такой строки, надо добавить
...
Иначе // есть строка, надо обновить
Выборка.Fields("AccountId").Value = СтрКонтр.AccountId;
КонецЕсли;
КонецЦикла;
Ну как??
43 Мисти
 
23.07.14
08:42
"SELECT * FROM account WHERE UI1C= ..... - как туда параметр вставить?
44 Fragster
 
гуру
23.07.14
08:47
45 Fragster
 
гуру
23.07.14
08:48
(43)-›(17)
46 Мисти
 
23.07.14
08:59
ТексЗапроса = "SELECT * FROM account WHERE [UI1C=] = ?";
    Соединение.Parameters(0).Value = СтрКонтр.UI1C;
КонтрагентыСКЛ = Соединение.Execute();
Если КонтрагентыСКЛ.EOF()=0 //- нет такой строки, надо добавить - Как????

...
Иначе // есть строка, надо обновить

КонтрагентыСКЛ.Fields("AccountId").Value = СтрКонтр.AccountId;
....
КонецЕсли;
Потом надо это как-то зафиксировать или можно переходить к следующей строке?
Соединение.Close();

Так? И как вставить строку вопрос остался.
47 Fragster
 
гуру
23.07.14
09:00
(46) если ты хочешь изменять данные рекордсетом, то источником для него должна быть таблица, а не запрос.
48 Мисти
 
23.07.14
09:07
рекордсетом - непонятно вообще, а по поводу источника - как бы слова понятны, но как получить таблицу, а не запрос, и почему у меня - запрос, а не таблица... Непонятно!
49 Мисти
 
23.07.14
09:17
Что не так-то?
50 ДенисЧ
 
23.07.14
09:20
Ты наотрез отказываешься читать документацию.
В ответ я применяю к тебе санкции - отказываюсь отвечать на твои вопросы до тех пор, пока ты не докажешь, что оную документацию ты прочитала.
51 Repey
 
23.07.14
09:21
Я вот так по диагонали поглядел - и не понял. Не понял - что ты хочешь делать с теми данными, которые получаешь из скуля.

Расскажи, пожалуйста. Простыми словами.
52 Мисти
 
23.07.14
09:25
(50) По ссылке в 27 я всё прочитала, но там же - просто скл, без 1с!
(51) Я должна в таблице account поискать строку с известным мне значением в столбце UI1C, и если найду, то обновить там поля (20 штук), а если нет, до добавить строку и заполнить эти поля.
Всё! Потом этот же фокус мне нужно будет повторить еще раз 10 с разными таблицами, для заполнения этих данных я написала уже 1500 строк на 1С.
53 Repey
 
23.07.14
09:31
(52) А если вдруг найдешь несколько строк?
Скуль запросы на добавление и обновление уже сочинила? Покажи.
54 Мисти
 
23.07.14
09:32
Там может быть только одна такая строка.
в (46) всё, что я сочинила, используя всякие образцы.
55 Мисти
 
23.07.14
09:46
Вот этот образец из (41) мне подойдет?
4. Добавить товар:

ТексЗапроса = "INSERT INTO products SET model="+"'"+Товар+"',"+"price="+"'"+Цена+"',"+"enabled="+"'"+АктивныйДаНет+"',"+"category_id="+"'"+Категория+"',"+"brand_id="+"'"+Бренд+"'";
Соединение.Execute(ТексЗапроса);
Соединение.Close();
Только мне бы - добавить сначала пустую строчку, а потом заполнить поля поштучно
КонтрагентыСКЛ.Fields("AccountId").Value = СтрКонтр.AccountId;
чтоб наглядно было.
56 Repey
 
23.07.14
09:49
(54) Конечно всего одна строка! Но если все-таки найдешь несколько?

Отработай сначала изменение и вставку строки без 1С. Примеры тут вижу.
(55) Надо полагать, когда выезжаете на шашлычок - ты сперва прожариваешь пустые шампуры, а потом (по одному!) нанизываешь и жаришь кусочки мяса.
57 Мисти
 
23.07.14
09:56
(56) мне нужно, чтобы хотя бы написано было раздельно, а не в одну строчку, иначе я концов не найду.
Я не могу отработать без 1С, я через 1С подключаюсь и данные у меня все в 1С.
58 Мисти
 
23.07.14
10:03
А так- пожалуйста -
INSERT INTO account
     WHERE  [UI1C=] = ?
( поле1,поле2,...,поле20 )
VALUES( 'поле1', 'поле2',..., поле20 )
59 Мисти
 
23.07.14
10:12
Похоже?
60 Fragster
 
гуру
23.07.14
10:12
(59) нет
61 Мисти
 
23.07.14
10:13
Ну а как надо? Мне больше ничего в голову не приходит.
62 Мисти
 
23.07.14
10:22
(60) Что неправильно?
Люди, мне завтра всю выгрузку сдавать! (1 таблицы пока)
63 Staffa
 
23.07.14
10:24
(0) странно, что никто не дал ссылку
http://msdn.microsoft.com/ru-ru/library/bb510741.aspx

(61) на вышеданном ресурсе:
http://msdn.microsoft.com/ru-ru/library/ms174335.aspx

есть пример:

INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
    ModifiedDate)
VALUES ('Square Yards', 'Y2', GETDATE())

там же описано применение условий WHERE
64 Мисти
 
23.07.14
10:33
(63) Спасибо! Там всё подробно и довольно понятно. Сейчас попробую применить. Но только всё равно ж - просто скл, а не из 1С!
65 Мисти
 
23.07.14
10:52
Не-а, не понимаю. Нет там моего примера.
Все 3 части -  SELECT, WHERE и INSERT описаны отдельно, а мне их нужно как-то объединить.
66 МихаилМ
 
23.07.14
10:59
(63)
культурней использовать

ado; oledb  

и метод AddNew
67 Мисти
 
23.07.14
11:10
Я б заплатила за работоспособный примерчик.
А вот простой вопрос - все таблицы в базе называются (я их видела) dbo.Account и тд , везде dbo. (объект базы данных?), а даже сам программист этой базы мне в качестве примера написал
SELECT * FROM Account
Так надо писать dbo. или нет? А то в очередном примере вижу -
INSERT dbo.Products
68 SSSSS_AAAAA
 
23.07.14
11:16
(65) И как вы себе представляете объединение трех совершенно разных команд?
(67) dbo - название схемы. Если эта схема стоит по умолчанию, то ее можно не указывать.
69 Мисти
 
23.07.14
11:27
(68) Ну откуда я знаю?
По-русски - всё просто -
SELECT из Account WHERE ид = пар1;
Если найден, то UPDATE;
Иначе INSERT
И задать всн поля.
70 SSSSS_AAAAA
 
23.07.14
11:35
(69) Ну хотите то вы, а не кто-нибудь?

if exist(select из Account)
Update ...
else
Insert into ...

Какая буква непонятна?
71 Мисти
 
23.07.14
12:01
Как написать поля заполнения раздельно, а не в 1 строчку все?
72 ДенисЧ
 
23.07.14
12:03
(71) в (18) смотри
73 SSSSS_AAAAA
 
23.07.14
12:20
(71) Вы не знаете как собрать в 1С текстовую строку произвольной длины? Такой текст никогда не видели?
Текст =
| Выбрать
| Поле1,
| Поле2
| Из
|;
74 Мисти
 
23.07.14
12:33
(72) Я не вижу там похожего примера
(73) Ну и будет список из 20 плей, а потом список из 20 значений - они даже на один экран не влезут, это неудобно.
Как-то так нельзя?
    Контрагенты.Fields("ID").Value         = Контрагенты1С.ИдентификаторBPM; //Идентификатор BPM
75 ДенисЧ
 
23.07.14
12:35
(74)
    Команда.CommandText =
    "UPDATE
    |    [Session]
    |SET
    |    [STATUS] = ?
    |WHERE
    |    [SessionId] = ?";
    Параметры = Новый COMSafeArray("VT_VARIANT", 2);
    Параметры.SetValue(0, Статус);
    Параметры.SetValue(1, ИД);
    Команда.Execute(, Параметры, мМагияСКЛ.adExecuteNoRecords + мМагияСКЛ.adAsyncExecute);


А это что, извините за выражение? За**па конская???
76 SSSSS_AAAAA
 
23.07.14
12:37
(74) Серверу нужна строка команды и ваши предпочтения по рисованию текста его совершенно не интересуют. Это запрос. Вы же 1с-освские запросы рисуете на несколько экранов и не переламываетесь? Вот и тут точно так же нарисуйте.
77 Мисти
 
23.07.14
13:02
(75) Из этого примера!
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
78 SSSSS_AAAAA
 
23.07.14
13:09
(77) Если Вам нужны тормоза работы только через АДО, то читайте доку по этому самому АДО и не морочьте людям голову.
Нравится вам этот пример? Это пример использования нотации АДО вместо нативного Update. Что в нем непонятно?
79 Мисти
 
23.07.14
13:17
Сыр-бор начался с того, что AddNew не сработало.
Так что мне вся эта методика наверное, не подходит.
80 Мисти
 
23.07.14
14:12
if exist(select из Account) - прямо так можно в 1С писать?
Или
Для Каждого СтрКонтр из ТабКонтр Цикл
  ОбработкаПрерыванияПользователя();
ТекстЗапроса = "SELECT * FROM account WHERE [UI1C] = ?";
Соединение.Parameters(0).Value = СтрКонтр.UI1C;

Выборка = Соединение.Execute(ТексЗапроса);
Если Выборка.EOF()=0 //- нет такой строки, надо добавить
ТекстЗапроса = "INSERT INTO account SET UI1C= ?, Name=?,AccountOwnerShipId= ?;"
Соединение.Parameters(0).Value = СтрКонтр.UI1C;
Соединение.Parameters(1).Value = СтрКонтр.Name;
Соединение.Parameters(2).Value = СтрКонтр.AccountOwnerShipId;
Соединение.Execute(ТексЗапроса);
Соединение.Close();
...
Иначе // есть строка, надо обновить

ТекстЗапроса = "UPDATE INTO account SET  Name=?,AccountOwnerShipId= ?
WHERE [UI1C] = ?";
Соединение.Parameters(2).Value = СтрКонтр.UI1C;

Соединение.Parameters(0).Value = СтрКонтр.Name;
Соединение.Parameters(1).Value = СтрКонтр.AccountOwnerShipId;
Соединение.Execute(ТексЗапроса);
Соединение.Close();
КонецЕсли;
КонецЦикла
81 Мисти
 
23.07.14
14:17
Выловила синтаксические ошибки.
Похоже?

    Для Каждого СтрКонтр из ТабКонтр Цикл
        ОбработкаПрерыванияПользователя();
        ТекстЗапроса = "SELECT * FROM account WHERE [UI1C] = ?";
        Соединение.Parameters(0).Value = СтрКонтр.UI1C;         
        Выборка = Соединение.Execute(ТекстЗапроса);
        Если Выборка.EOF()=0 Тогда //- нет такой строки, надо добавить
            
            ТекстЗапроса = "INSERT INTO account SET UI1C= ?, Name=?,AccountOwnerShipId= ?;";
            Соединение.Parameters(0).Value = СтрКонтр.UI1C;
            Соединение.Parameters(1).Value = СтрКонтр.Name;
            Соединение.Parameters(2).Value = СтрКонтр.AccountOwnerShipId;
            Соединение.Execute(ТекстЗапроса);
            Соединение.Close();
        Иначе // есть строка, надо обновить
            ТекстЗапроса = "UPDATE INTO account SET  Name=?,AccountOwnerShipId= ?    WHERE [UI1C] = ?";
            Соединение.Parameters(2).Value = СтрКонтр.UI1C;             
            Соединение.Parameters(0).Value = СтрКонтр.Name;
            Соединение.Parameters(1).Value = СтрКонтр.AccountOwnerShipId;
            Соединение.Execute(ТекстЗапроса);
            Соединение.Close();
        КонецЕсли;
    КонецЦикла;
82 SSSSS_AAAAA
 
23.07.14
14:38
(81)
1. Вместо SELECT * напишите SELECT 1, ибо весь набор полей совершенно тут не нужен.
2. Откуда взялось UPDATE INTO ? Точнее INTO после UPDATE?
83 Мисти
 
23.07.14
14:50
INTO - выкинуть!
SELECT 1 - логично, поправлю.
84 Мисти
 
23.07.14
14:55
{Форма.Форма1.Форма(74)}: Ошибка при вызове метода контекста (Parameters)
        Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C;         
по причине:
Произошла исключительная ситуация (ADODB.Command): В коллекции не удается найти элемент, соответствующий требуемому имени или порядковому номеру.
Есть такая таблица, есть такое поле, правда записи нет ни одной пока и перед названием таблицы dbo.
Куды бечь?
85 SSSSS_AAAAA
 
23.07.14
15:05
(84) Проверять коллекцию параметров. Ибо речь ведь про неё, не так ли? Искать, куда делся Соединение.Parameters(0)
86 Мисти
 
23.07.14
15:08
В базе я его вижу, имя совпадает. Как еще искать?
87 Jaap Vduul
 
23.07.14
15:09
(84)
Каша какая-то.

>> Выборка = Соединение.Execute(ТекстЗапроса);
Так можно в случае, когда в переменной Соединение находится объект типа ADODB.Connection
А судя по ошибке у тебя там ADODB.Command, поэтому надо так:
Соединение.Commandtext = ТекстЗапроса; // только из цикла надо это вынести
Выборка = Соединение.Execute();
88 SSSSS_AAAAA
 
23.07.14
15:15
(86) А при чем тут база? Речь о самой коллекции параметров, а не о их значениях.
89 Мисти
 
23.07.14
15:16
Почему из цикла вынести, если мне нужно найти все строчки в цикле?
90 Мисти
 
23.07.14
15:17
Конечно, каша! Я ж куски тащу из разных примеров, мне ж никто не может стройно 4 строчки написать!"!!
91 SSSSS_AAAAA
 
23.07.14
15:18
(90) Их никто и не напишет.
92 Jaap Vduul
 
23.07.14
15:19
(89)
Присвоение текста запроса вынести, он ведь не меняется в цикле, только значения параметров.
93 Мисти
 
23.07.14
15:19
Cmd = Новый COMОбъект("ADODB.Command");
    Cmd.ActiveConnection = Соединение003;

Так как переписать этот кусок?
Для Каждого СтрКонтр из ТабКонтр Цикл
        ОбработкаПрерыванияПользователя();
        СтрКонтрСКЛ =  Контрагенты1С.Добавить();
        ЗаписатьКонтр(СтрКонтрСКЛ,СтрКонтр);

        ТекстЗапроса = "SELECT 1 FROM account WHERE [UI1C] = ?";
        Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C;         
        Выборка = Соединение.Execute(ТекстЗапроса);
        Если Выборка.EOF()=0 Тогда //- нет такой строки, надо добавить
            
            ТекстЗапроса = "INSERT INTO account SET UI1C= ?, Name=?,AccountOwnerShipId= ?;";
            Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C;
            Соединение.Parameters(1).Value = СтрКонтрСКЛ.Name;
            Соединение.Parameters(2).Value = СтрКонтрСКЛ.AccountOwnerShipId;
            Соединение.Execute(ТекстЗапроса);
            Соединение.Close();
        Иначе // есть строка, надо обновить
            ТекстЗапроса = "UPDATE  account SET  Name=?,AccountOwnerShipId= ?    WHERE [UI1C] = ?";
            Соединение.Parameters(2).Value = СтрКонтрСКЛ.UI1C;             
            Соединение.Parameters(0).Value = СтрКонтрСКЛ.Name;
            Соединение.Parameters(1).Value = СтрКонтрСКЛ.AccountOwnerShipId;
            Соединение.Execute(ТекстЗапроса);
            Соединение.Close();
        КонецЕсли;
    КонецЦикла;
94 Wobland
 
23.07.14
15:21
>Соединение.Parameters(0).Value
вот откуда в этом месте нулевой параметр? может (страшно говорить) MSDN?
95 Мисти
 
23.07.14
15:24
(94) Вот отсюда украла.
Команда.CommandText =
    "SELECT TOP 1
    |    [SessionId]
    |FROM [Session]
    |WHERE
    |    [STATUS] = ?";
    Команда.Parameters(0).Value = Статус;

Что не так?
96 SSSSS_AAAAA
 
23.07.14
15:26
(95) Полное отсутствие понимания что и как в этом куске работает.
97 Мисти
 
23.07.14
15:27
Ну так объясните!
98 Wobland
 
23.07.14
15:28
99 SSSSS_AAAAA
 
23.07.14
15:28
(95) Сравните с этим:
        ТекстЗапроса = "SELECT * FROM account WHERE [UI1C] = ?";
        Соединение.Parameters(0).Value = СтрКонтр.UI1C;        

Даю наводку: Чем отличаются ТекстЗапроса и Команда.CommandText?
100 Wobland
 
23.07.14
15:28
100
101 Jaap Vduul
 
23.07.14
15:33
(93)
Как-то так:
Cmd = Новый COMОбъект("ADODB.Command");
Cmd.ActiveConnection = Соединение003;
Cmd.CommandText = "if exists(select * from account where UI1C = ?) update account set Name = ?, AccountOwnerShipId = ? where UI1C = ?
|else insert into account (UI1C, Name, AccountOwnerShipId) values (?, ?, ?)";
Cmd.Refresh();

Для Каждого СтрКонтр из ТабКонтр Цикл
        
        ОбработкаПрерыванияПользователя();
        СтрКонтрСКЛ =  Контрагенты1С.Добавить();
        ЗаписатьКонтр(СтрКонтрСКЛ,СтрКонтр);

        Cmd.Parameters(0).Value = СтрКонтрСКЛ.UI1C;
        Cmd.Parameters(1).Value = СтрКонтрСКЛ.Name;
        Cmd.Parameters(2).Value = СтрКонтрСКЛ.AccountOwnerShipId;
        Cmd.Parameters(3).Value = СтрКонтрСКЛ.UI1C;
        Cmd.Parameters(4).Value = СтрКонтрСКЛ.UI1C;
        Cmd.Parameters(5).Value = СтрКонтрСКЛ.Name;
        Cmd.Parameters(6).Value = СтрКонтрСКЛ.AccountOwnerShipId;
        
        Cmd.Execute();

КонецЦикла;
102 Мисти
 
23.07.14
15:33
(98) Я плохо на иностранном языке понимаю.
(99) Ну как чем? Скорее - вообще ничего общего!
Ну, т.е. Команда.CommandText = ТекстЗапроса
103 Wobland
 
23.07.14
15:35
а я так надеялся на (12)...
104 SSSSS_AAAAA
 
23.07.14
15:36
(102) Ну так и присваивайте текст запроса соответствующему свойству соединения, а не произвольной переменной. Именно поэтому и коллекция параметров пустая и потому в ней невозможно найти параметр с индексом 0.
105 Мисти
 
23.07.14
15:38
(101) Форма.Форма1.Форма(67)}: Метод объекта не обнаружен (Refresh)
    Cmd.Refresh();
106 Мисти
 
23.07.14
15:40
А! Так у меня там всё нормально.
У меня функция
Соединение = СоединитьсяСSQL(), а там внутри был этот Cmd, который возвращается.
Т.е. это одно и то же.
107 Jaap Vduul
 
23.07.14
15:41
(105)
Cmd.Parameters.Refresh();
108 Мисти
 
23.07.14
15:43
{Форма.Форма1.Форма(67)}: Ошибка при вызове метода контекста (Refresh)
    Cmd.Parameters.Refresh();    
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Ошибка синтаксиса или нарушение прав доступа
109 SSSSS_AAAAA
 
23.07.14
15:44
(106) Это кому и о чем?
110 Мисти
 
23.07.14
15:45
Cmd = СоединитьсяСSQL(); - теперь у меня так.
(109) - 106 - это к 104
111 SSSSS_AAAAA
 
23.07.14
15:46
(110) У вас ТекстЗапроса - переменная, никоим образом не связанная с Connttion. Так что совершенно не одно и то же.
112 Мисти
 
23.07.14
15:51
Так текст запроса - это строка, как она должна быть связана??
113 Wobland
 
23.07.14
15:53
(112) предполагается, что эта строка должна быть в соответствующем свойстве команды, а не в какой-то подозрительной переменной
114 Мисти
 
23.07.14
15:53
"Ну так и присваивайте текст запроса соответствующему свойству соединения, а не произвольной переменной. Именно поэтому и коллекция параметров пустая и потому в ней невозможно найти параметр с индексом"
Cmd.CommandText = ТекстЗапроса.
Что не так?
115 Wobland
 
23.07.14
15:53
(114) сойдёт. у тебя там код меняется ежеминутно, мы у себя не успеваем обновлять
116 Jaap Vduul
 
23.07.14
15:54
(108)Проверяй имена таблиц/полей и права доступа в БД
117 Мисти
 
23.07.14
15:56
(115) Соединение.CommandText = ТекстЗапроса.
Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C;        
    Выборка = Соединение.Execute();
Так?
(116) Имя таблицы - там еще dbo. Может, добавить? Права не знаю, как проверить.
118 SSSSS_AAAAA
 
23.07.14
15:57
(114)
1. В обсуждаемом коде нет Cmd.CommandText = ТекстЗапроса.
2. В обсуждаемом коде есть
        ТекстЗапроса = "SELECT * FROM account WHERE [UI1C] = ?";
        Соединение.Parameters(0).Value = СтрКонтр.UI1C;        

и тут нет никакой привязки к объекту Соединение. И тут нет генерации коллекции параметров. И потому не находится
        Соединение.Parameters(0)
119 Мисти
 
23.07.14
16:00
Для Каждого СтрКонтр из ТабКонтр Цикл
    ОбработкаПрерыванияПользователя();
    СтрКонтрСКЛ =  Контрагенты1С.Добавить();
    ЗаписатьКонтр(СтрКонтрСКЛ,СтрКонтр);
    
    ТекстЗапроса = "SELECT 1 FROM account WHERE [UI1C] = ?";
    Соединение.CommandText = ТекстЗапроса;
    Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C;        
    Выборка = Соединение.Execute();
    Если Выборка.EOF()=0 Тогда //- нет такой строки, надо добавить              
        ТекстЗапроса = "INSERT INTO account SET UI1C= ?, Name=?,AccountOwnerShipId= ?;";
        Соединение.CommandText = ТекстЗапроса;
        Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C;
        Соединение.Parameters(1).Value = СтрКонтрСКЛ.Name;
        Соединение.Parameters(2).Value = СтрКонтрСКЛ.AccountOwnerShipId;
        Соединение.Execute();
        Соединение.Close();
    Иначе // есть строка, надо обновить  
        ТекстЗапроса = "UPDATE  account SET  Name=?,AccountOwnerShipId= ?    WHERE [UI1C] = ?";
        Соединение.CommandText = ТекстЗапроса;
        Соединение.Parameters(2).Value = СтрКонтрСКЛ.UI1C;            
        Соединение.Parameters(0).Value = СтрКонтрСКЛ.Name;
        Соединение.Parameters(1).Value = СтрКонтрСКЛ.AccountOwnerShipId;
        Соединение.Execute();
        Соединение.Close();
    КонецЕсли;
КонецЦикла;
120 SSSSS_AAAAA
 
23.07.14
16:01
(119) ВЫ издеваетесь?
121 Wobland
 
23.07.14
16:01
про ЕОФ ещё не сказали, что это енд оф файл
122 Мисти
 
23.07.14
16:01
{Форма.Форма1.Форма(87)}: Ошибка при установке значения атрибута контекста (Value)
    Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C;        
по причине:
Произошла исключительная ситуация (ADODB.Parameter): Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.
123 Мисти
 
23.07.14
16:02
(119) В каком месте опять не так?
124 Wobland
 
23.07.14
16:02
(122) акценитрую внимание только на полезной информации: Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.
125 Мисти
 
23.07.14
16:03
(121) и что из этого следует?
126 Мисти
 
23.07.14
16:03
Так дело именно в аргументах, или опять всё не так?
127 SSSSS_AAAAA
 
23.07.14
16:04
(123) В нескольких. Особенно в вашей голове.
128 Wobland
 
23.07.14
16:04
(125) вроде он булев и сообщает в твоём случае, что результат запроса пуст
129 SSSSS_AAAAA
 
23.07.14
16:04
(126) Не в аргументах, а в вашей с ними работе.
130 Wobland
 
23.07.14
16:04
(126) истина
131 SSSSS_AAAAA
 
23.07.14
16:04
Ошибки в вашей логике
132 Мисти
 
23.07.14
16:05
644b3da3-5f49-4c38-bd54-6a0dc68df32f, тип уникальный идентификатор, а мне нужен строка, так что ли?
133 SSSSS_AAAAA
 
23.07.14
16:05
Вы так и не поняли откуда и как появляются и заполняются параметры.
134 Wobland
 
23.07.14
16:05
весёлый, конечно, отладчик в текстовом режиме здесь. но, может, шайтан вьюер и покончим с этой вакханалией?
135 Мисти
 
23.07.14
16:08
Если Выборка.EOF()=0 Тогда - вот это теперь вранье.
А! Или про это уже было в 121?
136 SSSSS_AAAAA
 
23.07.14
16:08
(119) Вам написали готовый код. Который вы не смогли запустить только из-за ошибки выскакивающей на Refresh(). Может таки довести этот код до ума или будете метаться со своим г-кодом?
137 Мисти
 
23.07.14
16:09
(136) Так а я не знаю, как ту ошибку исправить!
138 Wobland
 
23.07.14
16:10
(137) это ты мало читала (107). нужно не менее трёх раз
139 Мисти
 
23.07.14
16:13
(138) В смысле, что там грамматическая ошибка?
140 Мисти
 
23.07.14
16:14
Нет, нет ошибки.
141 Wobland
 
23.07.14
16:14
(138) сторно. ну да. там дальше ошибка синтаксиса
142 Мисти
 
23.07.14
16:15
Cmd.Parameters.Refresh();
Я думала, может Parametres, но нет.
Какая ошибка?
143 Мисти
 
23.07.14
16:38
Вроде, моя история сработала, но там теперь другая засада - описание таблицы, которую мне выслали заранее не совпадает с таблицей, которую они сделали.
144 Мисти
 
23.07.14
19:49
Спасибо большое кой-кому!
Осталась еще проблема.
Если строки нет, то
ТекстЗапроса = "INSERT INTO gtw_AccountExport VALUES
        |(NULL,
- и т.д., работает
А если строка есть, то
ТекстЗапроса = "UPDATE  gtw_AccountExport VALUES
        |(NULL,
Не работает!
Там надо по-другому писать?
145 ДенисЧ
 
23.07.14
19:51
Какая жаль, что а) у меня нет пулемёта, и б) ты не в прямой видимости...
146 Wobland
 
23.07.14
19:55
(144) упдейт несколько не похож на инсерт
http://www.w3schools.com/sql/sql_update.asp
147 Wobland
 
23.07.14
19:56
+(146) -> (101)
148 Мисти
 
23.07.14
20:07
ТекстЗапроса = "INSERT INTO gtw_AccountExport VALUES

        |(NULL,  - вот это было написано без перечисления столбцов, в предположении, что они все задаются по порядку, для UPDATE - тоже ведь так можно?
149 Мисти
 
23.07.14
20:07
(145) А дети-сИроты?
150 ДенисЧ
 
23.07.14
20:08
(149) Я поставлю свечку в цервки за их процветание.
151 ДенисЧ
 
23.07.14
20:09
(148) нет. нельзя.
Я давал ссылку на простейший учебник. Мой племянник в 14 лет его понял.
152 Wobland
 
23.07.14
20:11
UPDATE  gtw_AccountExport SET  Name = ?, AccountOwnerShipId = ?    WHERE [UI1C] = ?
ну или что там меняется
153 ДенисЧ
 
23.07.14
20:12
(152) Вот благодаря таким, как ты, она никогда не сможет сама писать код....
154 Wobland
 
23.07.14
20:16
(153) я жажду прекращения ветки ;)
155 Мисти
 
23.07.14
20:17
(153) Мне первый и последний раз потребовался скл!
Я закончу и через 2 недели забуду абсолютно - читала я учебник, не читала...
Зато у меня дочка толковая - красный диплом, во все аспирантуры берут, а она выбирает.
156 Мисти
 
23.07.14
20:17
Будет новая завтра, обещаю!
157 ДенисЧ
 
23.07.14
20:20
НЕТ!!!!! Я этого не переживу!!!
158 Мисти
 
23.07.14
20:24
А ничего нельзя поделать с тем, что UI1C в 1 случае - первый параметр, а во втором - последний? Это ж 2 раза писать все списки! или отдельную процедуру для их заполнения писать! ( у меня еще таблиц штук 10 должно быть)
159 Wobland
 
23.07.14
20:26
INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Cardinal','Tom B. Erichsen','Skagen 21','Stavanger','4006','Norway');

UPDATE Customers
SET ContactName='Alfred Schmidt', City='Hamburg'
WHERE CustomerName='Alfreds Futterkiste';
160 Мисти
 
23.07.14
20:43
Перечислять все столбцы явно?
Ладно, обойдусь!
161 Мисти
 
23.07.14
20:46
ТекстЗапроса = "update account set DoDelete = ?, Name = ?, FullName = ?, ParentAccountId = ?,PhoneNumber = ?,RegionUI1C = ?,CityUi1C = ?,ZIP = ?,Address = ?,  WHERE [UI1C] = ?";
        Cmd.CommandText = ТекстЗапроса;
        Cmd.Parameters(0).Value = СтрКонтрСКЛ.DoDelete;

Не работает!
Говорит - Cmd.Parameters(0) - нет там никаких параметров.
162 Wobland
 
23.07.14
20:57
(161) у тебе этот код (установка параметра после установки текста) уже тыщу раз здесь работал. всё верно
163 Мисти
 
23.07.14
21:01
А что ж тогда не так?
164 шаэс
 
23.07.14
21:01
(ого, вот это выдержка у молодых людей. и стойкое желание помочь. прям из-за таких веток хочется что-нибудь новое поизучать)
165 Мисти
 
23.07.14
21:02
пароль 1292
166 Hans
 
23.07.14
21:05
выдайте дочь за богатого и забудте 1С как кошмарный сон.
167 ДенисЧ
 
23.07.14
21:06
Кстати, фото дочки в студию...
Может, тогда сниму ээээ ... санкции....
168 МихаилМ
 
23.07.14
21:07
(155)
врете

вот ваша ветка 4 летней давности

v8: Из 8 работать с базой SQL не 1с - как?
169 Hans
 
23.07.14
21:08
В крайнем случае можно выдать дочь за Одинесника. На форуме полно неженатых.
170 МихаилМ
 
23.07.14
21:10
+(168)
вот еще про запись в базу

v8: Запись в базу SQL

так что врете
171 Мисти
 
23.07.14
21:18
(168) Я не вру! Я абсолютно об этом забыла, и даже почитав ветку не вспомнила - доделала ли я это и зачем это было.
172 Мисти
 
23.07.14
21:23
Очевидно, что (170) - это то же, что и (168), но, похоже, что я без этого обошлась в конце-концов.
173 Мисти
 
23.07.14
21:24
(167) Это будет на крайний случай. Она еще и красавица.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.