Добрый день, пытаюсь получить таблицу из базы Oracle

```1c
    &НаСервере
    Функция ПодключитьсяИПолучитьЗначенияНаСервере()
    ЗначенияРекв = Новый Структура;

    Соединение = Новый ComObject("ADODB.Connection"); //2020-02-14 -
    Соединение.ConnectionString ="Provider=OraOLEDB.Oracle.1;Data Source=123;User Id=ASU_BUH;Password=321;";
    Попытка //2020-02-14 -
    Соединение.Open(); //2020-02-14 -
    Исключение //2020-02-14 -
    Сообщить(ОписаниеОшибки()); //2020-02-14 -
    Возврат ЗначенияРекв; //2020-02-14 -
    КонецПопытки; //2020-02-14 -

    ТекстЗапроса = "SEL ECT * fr om ASU2000_COMERC.DOGOVOR_LOG_1C";

    Попытка
    Записи = Новый ComObject("ADODB.RecordSet"); //2020-02-14 -
    Записи.Open(ТекстЗапроса, Соединение); //2020-02-14 -
    Сообщить("Данные получены.");
    СтрокаXML = Записи.Fields(); -

    возврат СтрокаXML;

    Исключение
    Сообщить(ОписаниеОшибки());
    Возврат СтрокаXML;
    КонецПопытки;

    возврат ЗначенияРекв;
    КонецФункции
```

Соединение проходит успешно, таблицу видит, но но возвращает только одно строку этой таблицы, в чем ошибка, текст запроса вроде правильный отборов нету????
---
Я не знаю структуры, в общем случае будет что-то вроде:

```1c
    ТаблицаЗначений = Новый ТаблицаЗначений;
    ТаблицаЗначений.Колонки.Добавить("FieldName1");
    ТаблицаЗначений.Колонки.Добавить("FieldName2");
    .............

    ТекстЗапроса = "SEL ECT * fr om ASU2000_COMERC.DOGOVOR_LOG_1C WHERE UPD_DATE BETWEEN <НачалоТекущегоДня> AND <КонецТекущегоДня>";

    Попытка
    Записи = Новый ComObject("ADODB.RecordSet"); //2020-02-14 -
    Записи.Open(ТекстЗапроса, Соединение); //2020-02-14 -
    Сообщить("Данные получены.");
    Исключение
    Сообщить(ОписаниеОшибки());
    Возврат;
    КонецПопытки;

    Пока НЕ Записи.EOF() Цикл
    НСтр = ТаблицаЗначений.Добавить();
    Для Каждого Колонка ИЗ Записи.Fields() Цикл
    НСтр[Колонка.Name] = Записи.Fields(Колонка.Name).Value;
    КонецЦикла;
    Записи.MoveNext();
    КонецЦикла;
```
---
Вы вставляете в текст значение даты. Дата должна быть преобразована к формату, который понимает ORACLE.
У ORACLE есть внутренняя функция преобразования текста в дату TO_DATE()

```1c
    "SEL ECT * fr om ASU2000_COMERC.DOGOVOR_LOG_1C WHERE DATE_OP BETWEEN TO_DATE('" + Формат(ДатаНачала, "ДФ=dd-MM-yyyy") + , "'DD-MMM-RRRR') AND TO_DATE('" + Формат(ДатаОкончания, "ДФ=dd-MM-yyyy") + "'DD-MMM-RRRR')";
```

С " и ' мог напутать, отладить по месту.

В общем строка должна иметь вид:

```1c
    TO_DATE('ЗначениеДатыВФормате', 'ФорматДаты')
```
, например
```1c
    TO_DATE('31-01-2020', 'DD-MM-RRRR')
```

Более подробно в документации к ORACLE.
---
Я бы сделал массив, в него запихивал бы ID записей, для которых нужно обновить состояние:

```1c
    МассивОбработанныхИД = Новый Массив;

    Пока НЕ Записи.EOF Цикл
    ............
    Если Колонка.Name = "PROCESSED" Тогда
    Если Записи.Fields(Колонка.Name).Value = 0 Тогда
    МассивОбработанныхИД.Добавить(Записи.Fields("ID").Value);
    КонецЕсли;
    КонецЕсли;

    ............
    КонецЦикла;
```

После окончания цикла по Записи, выполнил бы следующее:

```1c
    Команда = Новый ComObject("ADODB.Command");
    Команда.ActiveConnection = Соединение;
    Для Каждого ИД Из МассивОбработанныхИД Цикл
    Комманда.CommandText = "UPD ATE ASU2000_COMERC.DOGOVOR_LOG_1C SE T PROCESSED = 1 WHERE ID = " + Формат(ИД, "ЧГ=");
    Команда.Execute();
    КонецЦикла;
```

Это для случая когда ИД - числовые значения. Если там строка, Формат() не нужен.
---
Почему вы решили, что СтрокаXML = Записи.Fields() вам будет достаточно?

Вам необходимо обойти циклом набор записей Записи. Цикл вида

```1c
    Пока НЕ Записи.EOF() Цикл
    <ОбработкаСтрокиНабораЗаписей>
    Записи.MoveNext();
    КонецЦикла;
```
---
ОбработкаСтрокиНабораЗаписей
подскажите пожалуйста что нужно указать в
```1c
    <ОбработкаСтрокиНабораЗаписей>
```
?
---
Я не знаю, что вы собираетесь делать с каждой записью, но в Записи.Fields("FieldName").Value хранится значение поля, в общем виде <ОбработкаСтрокиНаборазаписей> имеет вид:

```1c
    ЗначениеПоля1 = Записи.Fields("Field1").Value;
    ЗначениеПоля2 = Записи.Fields("Field2").Value;
    ........
```
---
в этой таблице логи договором (создание, изменение, удаление итд...), хочу создать регламентированное задание которое будет смотреть эту таблицу и (создавать или изменять) договора уже в базе 1с.
---
В таком случае будет что-то вроде такого:

```1c
    Пока НЕ Записи.EOF() Цикл
    УИДоговора = Записи.Fields("ID").Value;
    ДоговорСсылка = Справочник.Договоры.ПолучитьСсылку(Новый УникальныйИдентификатор(УИДоговора));

    ДоговорОбъект = ДоговорСсылка.ПолучитьОбъект();
    ДоговорОбъект.Номер = Записи.Fields("Number").Value;
    ДоговорОбъект.ДатаНачала = Записи.Fields("StartDate").Value;
    .....
    ДоговорОбъект.Записать();
    Записи.MoveNext();
    КонецЦикла;
```
---
Подскажи пожалуйста как можно просто выташить из этой таблицы строки скажем за текущий день, и просто поместить их в таблицу значений?
---
Я не знаю структуры, в общем случае будет что-то вроде:

```1c
    ТаблицаЗначений = Новый ТаблицаЗначений;
    ТаблицаЗначений.Колонки.Добавить("FieldName1");
    ТаблицаЗначений.Колонки.Добавить("FieldName2");
    .............

    ТекстЗапроса = "SEL ECT * fr om ASU2000_COMERC.DOGOVOR_LOG_1C WHERE UPD_DATE BETWEEN <НачалоТекущегоДня> AND <КонецТекущегоДня>";

    Попытка
    Записи = Новый ComObject("ADODB.RecordSet"); //2020-02-14 -
    Записи.Open(ТекстЗапроса, Соединение); //2020-02-14 -
    Сообщить("Данные получены.");
    Исключение
    Сообщить(ОписаниеОшибки());
    Возврат;
    КонецПопытки;

    Пока НЕ Записи.EOF() Цикл
    НСтр = ТаблицаЗначений.Добавить();
    Для Каждого Колонка ИЗ Записи.Fields() Цикл
    НСтр[Колонка.Name] = Записи.Fields(Колонка.Name).Value;
    КонецЦикла;
    Записи.MoveNext();
    КонецЦикла;
```
---
спасибо огромное завтра протестирую, не знаете какую нибудь статью про подключение к Oracle?
---
Да тут не в Oracle дело, а в ADO. Почитайте по этой технологии.
---
DATA_OP value с типом дата, прописал вот так, при открытии перепрыгивает на исключение,

```1c
    ДатаНАчала = НачалоДня(ТекущаяДата());
    ДатаОкончания = КонецДня(ТекущаяДАта());
    ТекстЗапроса = "SEL ECT * fr om ASU2000_COMERC.DOGOVOR_LOG_1C WHERE DATE_OP BETWEEN ('"+ДатаНАчала+"') AND ('"+ДатаОкончания+"')";
```
---
Вы вставляете в текст значение даты. Дата должна быть преобразована к формату, который понимает ORACLE.
У ORACLE есть внутренняя функция преобразования текста в дату TO_DATE()

```1c
    "SEL ECT * fr om ASU2000_COMERC.DOGOVOR_LOG_1C WHERE DATE_OP BETWEEN TO_DATE('" + Формат(ДатаНачала, "ДФ=dd-MM-yyyy") + , "'DD-MMM-RRRR') AND TO_DATE('" + Формат(ДатаОкончания, "ДФ=dd-MM-yyyy") + "'DD-MMM-RRRR')";
```

С " и ' мог напутать, отладить по месту.

В общем строка должна иметь вид:

```1c
    TO_DATE('ЗначениеДатыВФормате', 'ФорматДаты')
```
, например
```1c
    TO_DATE('31-01-2020', 'DD-MM-RRRR')
```

Более подробно в документации к ORACLE.
---
```1c
    ТекстЗапроса = "SEL ECT * FR OM ASU2000_COMERC.DOGOVOR_LOG_1C WHERE DATE_OP BETWEEN TO_DATE ('01.07.2020', 'DD.MM.YYYY') AND TO_DATE ('09.07.2020', 'DD.MM.YYYY')";
```

спасибо огромное
---
можете еще подсказать, вот я получаю все эти записи из этой базы, мне еще нужно обновить данные в той базе "Оракл"
нужно сделать примерно так

```1c
    Пока НЕ Записи.EOF() Цикл
    НСтр = ТаблицаЗначений.Добавить();
    Для Каждого Колонка ИЗ Записи.Fields() Цикл
    НСтр[Колонка.Name] = Записи.Fields(Колонка.Name).Value;
    Если Колонка.Name = "PROCESSED" Тогда
    Если Записи.Fields(Колонка.Name).Value = 0 Тогда
    ТекстЗапросаЗаписиВИАС = "UPDATA ASU2000_COMERC.DOGOVOR_LOG_1C SET PROCESSED = '1' ')";
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Записи.MoveNext();
    КонецЦикла;
```

```1c
    Если Записи.Fields(Колонка.Name).Value = 0 Тогда
    ТекстЗапросаЗаписиВИАС = "UPDATA ASU2000_COMERC.DOGOVOR_LOG_1C SET PROCESSED = '1' ')";
    КонецЕсли;
```

как правильно реализовать

вот весь код целиком

```1c
    &НаСервере
    Функция ПолучитьТаблицуИзмененийНаСервереИАС()
    ЗначенияРекв = Новый Структура;

    Соединение = Новый ComObject("ADODB.Connection"); //2020-02-14 -
    Соединение.ConnectionString ="Provider=OraOLEDB.Oracle.1;Data Source=123;User Id=123;Password=123;";
    Попытка //2020-02-14 -
    Соединение.Open(); //2020-02-14 -
    Исключение //2020-02-14 -
    Сообщить(ОписаниеОшибки()); //2020-02-14 -
    Возврат ЗначенияРекв; //2020-02-14 -
    КонецПопытки;

    ДатаНачала = Формат(НачалоДня(ТекущаяДата()),"ДФ=dd.MM.yyyy");
    ДатаОкончания = Формат(КонецДня(ТекущаяДата()),"ДФ=dd.MM.yyyy");
    //ТекстЗапроса = "SEL ECT * FR OM ASU2000_COMERC.DOGOVOR_LOG_1C WHERE DATE_OP BETWEEN TO_DATE ('"+ДатаНачала+"', 'DD.MM.YYYY') AND TO_DATE ('"+ДатаОкончания+"', 'DD.MM.YYYY')";
    ТекстЗапроса = "SELECT * FR OM ASU2000_COMERC.DOGOVOR_LOG_1C WH ERE DATE_OP BETWEEN TO_DATE ('17.07.2020 00:00:00', 'DD.MM.YYYY HH24:MI:SS') AND TO_DATE ('17.07.2020 23:59:59', 'DD.MM.YYYY HH24:MI:SS')";
    Попытка
    Записи = Новый ComObject("ADODB.RecordSet");
    Записи.Open(ТекстЗапроса, Соединение);
    Сообщить("Данные получены.");
    Исключение
    Сообщить(ОписаниеОшибки());
    Возврат Ложь;
    КонецПопытки;

    ТаблицаЗначений = Новый ТаблицаЗначений;
    ТаблицаЗначений.Колонки.Добавить("ID"); //Идентификатор записи
    ТаблицаЗначений.Колонки.Добавить("ID_DOGOVOR"); //Идентификатор договора в базе данных ИАС ОГУ (8 цифр)
    ТаблицаЗначений.Колонки.Добавить("ID_TYPE_DOGOVOR"); //Идентификатор вида договора. 1 - договоры на обучение по ООП
    ТаблицаЗначений.Колонки.Добавить("OPERATON"); //Вид произведенной операции (I - создание договора, U - изменение договора, D - удаление договора)
    ТаблицаЗначений.Колонки.Добавить("DATE_OP"); //Дата и время операции
    ТаблицаЗначений.Колонки.Добавить("ID_1C"); //Идентификатор договора в информационной системе УБУиО. Должен быть заполнен бухгалтерией после обработки записи
    ТаблицаЗначений.Колонки.Добавить("PROCESSED"); //Признак обработки записи УБУиО (0 - запись не обработана, 1 - запись обработана)
    Пока НЕ Записи.EOF() Цикл
    НСтр = ТаблицаЗначений.Добавить();
    Для Каждого Колонка ИЗ Записи.Fields() Цикл
    НСтр[Колонка.Name] = Записи.Fields(Колонка.Name).Value;
    Если Колонка.Name = "PROCESSED" Тогда
    Если Записи.Fields(Колонка.Name).Value = 0 Тогда
    ТекстЗапросаЗаписиВИАС = "UPDATA ASU2000_COMERC.DOGOVOR_LOG_1C SET PROCESSED = '1' ')";
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Записи.MoveNext();
    КонецЦикла;

    ТаблицаСОтбором = Новый ТаблицаЗначений;
    ТаблицаСОтбором.Колонки.Добавить("ID");
    ТаблицаСОтбором.Колонки.Добавить("ID_DOGOVOR");
    ТаблицаСОтбором.Колонки.Добавить("ID_TYPE_DOGOVOR");
    ТаблицаСОтбором.Колонки.Добавить("OPERATON");
    ТаблицаСОтбором.Колонки.Добавить("DATE_OP");
    ТаблицаСОтбором.Колонки.Добавить("ID_1C");
    ТаблицаСОтбором.Колонки.Добавить("PROCESSED");

    ТаблицаЗначений.Сортировать("DATE_OP");
    Для каждого СтрокаИсходнойТаблицы из ТаблицаЗначений Цикл
    Строки = ТаблицаЗначений.НайтиСтроки(Новый Структура("ID_Dogovor", СтрокаИсходнойТаблицы.id_dogovor));
    СтрокаПоследнегоДействияПоДоговору = Строки[Строки.ВГраница()];
    НоваяСтрока = ТаблицаСОтбором.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаПоследнегоДействияПоДоговору);
    КонецЦикла;
    ТаблицаСОтбором.Свернуть("ID, ID_DOGOVOR,ID_TYPE_DOGOVOR, OPERATON, DATE_OP, ID_1C, PROCESSED");
    ТаблицаСОтбором.Сортировать("ID_DOGOVOR, OPERATON");
    возврат ТаблицаСОтбором;
    КонецФункции
```
---
Я бы сделал массив, в него запихивал бы ID записей, для которых нужно обновить состояние:

```1c
    МассивОбработанныхИД = Новый Массив;

    Пока НЕ Записи.EOF Цикл
    ............
    Если Колонка.Name = "PROCESSED" Тогда
    Если Записи.Fields(Колонка.Name).Value = 0 Тогда
    МассивОбработанныхИД.Добавить(Записи.Fields("ID").Value);
    КонецЕсли;
    КонецЕсли;

    ............
    КонецЦикла;
```

После окончания цикла по Записи, выполнил бы следующее:

```1c
    Команда = Новый ComObject("ADODB.Command");
    Команда.ActiveConnection = Соединение;
    Для Каждого ИД Из МассивОбработанныхИД Цикл
    Комманда.CommandText = "UPD ATE ASU2000_COMERC.DOGOVOR_LOG_1C SE T PROCESSED = 1 WHERE ID = " + Формат(ИД, "ЧГ=");
    Команда.Execute();
    КонецЦикла;
```

Это для случая когда ИД - числовые значения. Если там строка, Формат() не нужен.