Имя: Пароль:
1C
1С v8
Не могу подключиться к Access
0 Prog111
 
04.04.16
15:05
Создаю подключение к Access, но выдает ошибку: "Ошибка при вызове метода контекста (MoveFirst): Произошла исключительная ситуация (ADODB.Recordset): BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись".

Как я понимаю, ошибка говорит, что записей нет в таблице. Однако по факту записи в таблице есть. Куда копать, не подскажете?


Процедура Тест2Нажатие(Элемент)
    
    ИмяФайла = "C:\Program Files\Att2008\att2000.mdb";
        
    MBD = Новый COMОбъект("ADODB.CONNECTION");
    MBD.CursorLocation= 3;
    Попытка
        MBD.Open("Driver={Microsoft Access Driver (*.mdb)};Dbq="+ИмяФайла+";Uid=Admin;Pwd=");
    Исключение Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
        ТекстСелект = "SELECT * FROM CHECKINOUT";
    НаборЗаписей = Новый COMОбъект("ADODB.RecordSet");
    
    Попытка
        НаборЗаписей=MBD.Execute(ТекстСелект);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    Попытка
        НаборЗаписей.MoveFirst();
    Исключение
        Сообщить(ОписаниеОшибки());
        НаборЗаписей.Close();
        Возврат;
    КонецПопытки;
    
    
    Пока НаборЗаписей.EOF()=0 цикл
        Сообщить("ккк");
    КонецЦикла;        
        
КонецПроцедуры
1 Prog111
 
04.04.16
15:06
Ошибка возникает в этом месте:

НаборЗаписей.MoveFirst();
2 shuhard
 
04.04.16
15:09
(1) открой рекордсет в нормальном режиме
3 Чайник Рассела
 
04.04.16
15:09
Функция ОткрытьФайл(НаименованиеФайла)
    
    Результат = Истина;
    СтрокаПодключения="Driver={Microsoft Access Driver (*.mdb)};Dbq=" + НаименованиеФайла + ";";
    Access = Новый COMОбъект("ADODB.CONNECTION");
    Попытка
        Access.Open(СтрокаПодключения);
    Исключение
        Сообщить(ОписаниеОшибки());
        Результат = Ложь;;
    КонецПопытки;
    
    Возврат Результат;
    
КонецФункции
4 Чайник Рассела
 
04.04.16
15:10
Акты = КаталогСБазой+"\"+ИмяФайлаАктов;
    // Открываем mdb
    Состояние("Открытие файла " + Акты);
    Если НЕ ОткрытьФайл(Акты) Тогда
        Возврат;
    КонецЕсли;
    
    //получим список таблиц
    Catalog = Новый COMОбъект("ADOX.Catalog");
    Catalog.ActiveConnection = Access;
    Для iCount = 0 По Catalog.Tables.Count-1 Цикл
        
        ИмяТаблицы = Catalog.Tables.Item(iCount).Name;
        
        Если Найти(ИмяТаблицы, "MSys") > 0 Тогда // Кроме системных таблиц
            Продолжить;
        КонецЕсли;
        
        СписокТаблиц.Добавить(Catalog.Tables.Item(iCount));
    КонецЦикла;
    
    Для каждого стрТаблиц Из СписокТаблиц Цикл
        Состояние("Открытие таблиц документов...");
        RS = Новый COMОбъект("ADODB.Recordset");
        RS.Open("Select * from " + ТаблицаДляЗапроса(стрТаблиц.Значение.Name), Access);
        Если  стрТаблиц.Значение.Name = "АВР" Тогда
            Пока RS.EOF() = 0 Цикл  
                СтрТаблицы = ТаблицаДокумента.Добавить();
                СтрТаблицы.НомерДок = СокрЛП(RS.Fields("Код_Документа").Value);
                СтрТаблицы.НаименованиеУслуги = RS.Fields("Наименование").Value;
                СтрТаблицы.Цена = RS.Fields("Цена").Value;
                СтрТаблицы.Касса = RS.Fields("Доп1").Value;
                СтрТаблицы.Регномер = RS.Fields("Доп2").Value;
                СтрТаблицы.АдресУстановки = RS.Fields("Адрес").Value;
                RS.MoveNext();
            КонецЦикла;
        ИначеЕсли  стрТаблиц.Значение.Name= "АВР_св" Тогда
            Состояние("Открытие таблицы шапки документов...");
            Пока RS.EOF() = 0 Цикл
                Если RS.Fields("Дата").Value<НачПериода или RS.Fields("Дата").Value>КонПериода Тогда
                    RS.MoveNext();
                    Продолжить;
                КонецЕсли;
                СтрШапки = ТаблицаШапки.Добавить();
                СтрШапки.НомерДок = СокрЛП(RS.Fields("Свой_Номер").Value);
                СтрШапки.ДатаДокумента = RS.Fields("Дата").Value;
                СтрШапки.Контрагент = RS.Fields("Клиент").Value;
                СтрШапки.Договор = RS.Fields("Договор").Value;
                СтрШапки.Механик = RS.Fields("Исполнитель").Value;
                RS.MoveNext();
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    RS.Close();
    Access.Close();
5 Чайник Рассела
 
04.04.16
15:10
В качестве примера
6 shuhard
 
04.04.16
15:11
(2) +1
v8: Как можно прочитать файл mdb (MS Access)?
MyRst.Open (MyStr, MyCon, 2, 3)//adOpenDynamic, adLockOptimistic
7 Prog111
 
04.04.16
15:33
(4) ТаблицаДляЗапроса - этой функции нет в сообщении...
8 Prog111
 
04.04.16
15:44
(2) Это как?
9 Чайник Рассела
 
04.04.16
15:58
(7)

// Возвращает имя таблицы для выполнения запроса.
//
// Параметры:
//  Таблица      - Имя таблицы;
//
// Возвращаемое значение:
//  Имя таблицы для запроса.
//
Функция ТаблицаДляЗапроса(Таблица)
    
    Если Найти(Таблица, " ") > 0 Тогда
        Возврат "[" + Таблица + "]";
    Иначе
        Возврат Таблица;
    КонецЕсли;
    
КонецФункции // ТаблицаДляЗапроса()
10 vde69
 
04.04.16
16:02
11 Prog111
 
04.04.16
19:21
(10) Эту конструкцию самой первой попробовал - тоже ругается при
Попытка
        НаборЗаписей.MoveFirst();
    Исключение //нет записей в рекордсете
        НаборЗаписей.Close();
        Возврат Результат;
    КонецПопытки;

Я правильно понимаю, что рекордсет - это таблица в файле access?
12 shuhard
 
04.04.16
19:29
(11)[ рекордсет - это таблица в файле access]
нет
это объект ADODB
13 Prog111
 
04.04.16
19:32
(12) А может такое быть, что при обычном открытии файла в определенной таблице строки есть, а при чтении из 1С строк нет? Через отладчик количество колонок в таблице показывает верное, а вот записей как-будто нет.
14 hhhh
 
04.04.16
21:28
Об_Конект = Новый COMОбъект("ADODB.Connection");
    Попытка

        Об_Конект.Open(СтрокаПодключения);

    Исключение



    КонецПопытки;
Команда = Новый COMОбъект("ADODB.Command");
    Команда.ActiveConnection=
Об_Конект;
        ТекстСелект = "SELECT * FROM klients";
        
    НаборЗаписей = Новый COMОбъект("ADODB.RecordSet");
    Команда.CommandText=ТекстСелект;
    Попытка
        НаборЗаписей=Команда.Execute();
        Опис = ""
    Исключение
        Опис = ОписаниеОшибки();
    КонецПопытки;
    
    // надо создать колонки
    Клиенты.Колонки.Очистить();

    Для е = 0 по (НаборЗаписей.Fields.Count - 1) Цикл
        Клиенты.Колонки.Добавить(СокрЛП(НаборЗаписей.Fields(е).Name));
    КонецЦикла;
    
    Попытка
        НаборЗаписей.MoveFirst();
    Исключение //нет записей в рекордсете

        НаборЗаписей.Close();
        Возврат Клиенты;
    КонецПопытки;
    
    НаборЗаписей.MoveFirst();
    Пока НаборЗаписей.EOF() = 0 Цикл
        // тут имеем строку записи
15 vde69
 
05.04.16
09:01
(11) пример из (10) на 100% рабочий, просто возьмите его целиком и адаптируйте под восьмерку
16 lEvGl
 
гуру
05.04.16
09:24
дело в этом
MyRst.Open (MyStr, MyCon, 2, 3)//adOpenDynamic, adLockOptimistic
17 shuhard
 
05.04.16
09:26
(13) см.  (2), (6), (16)