Можно ли загрузить CSV файл целиком, а не построчно его считывать, по аналогии ТабличныйДокумент.Прочитать(файл)?
---
Можно еще через OLEDB либо через ODBC драйверы работать, скорость на чтении будет существенно выше и запросом по файлу можно будет получать необходимые данные.

```1c
    Connection = Новый ComОбъект("ADODB.Connection");
    Command = Новый ComОбъект("ADODB.Command");
    СтрокаПодключения = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="+Файл.Путь
    +";Extensions=csv;";
    Connection.ConnectionString = СтрокаПодключения;
    Connection.Open();
    Command.ActiveConnection = Connection;

    Команда = "SEL ECT * FR OM ["+файл.Имя+"]";
    Command.CommandText = Команда;
    Recordset = Command.Execute();
    Сообщить("Выполнил");

    ЧислоПолей = Recordset.Fields.Count;
```
---
я рекомендую следующий подход:

```1c
    &НаКлиенте
    Процедура ПрочитатьCSV(Команда)
    Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    Фильтр = "Текстовый документ(*.txt;*.csv;)|*.txt;*.csv;";
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите файлы";
    Если ДиалогОткрытияФайла.Выбрать() Тогда
    МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
    Для Каждого ИмяФайла Из МассивФайлов Цикл
    ВыбФайл = Новый Файл(ИмяФайла);
    Файл=ВыбФайл.ПолноеИмя;
    Сообщить(ИмяФайла
    + НСтр("ru = '; Размер = '; en = '; Size = '")
    + ВыбФайл.Размер());
    КонецЦикла;

    Connection = Новый ComОбъект("ADODB.Connection");
    Command = Новый ComОбъект("ADODB.Command");
    СтрокаПодключения = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="+ВыбФайл.Путь
    +";Extensions=csv;";
    Connection.ConnectionString = СтрокаПодключения;
    Connection.Open();
    Command.ActiveConnection = Connection;

    Команда = "SEL ECT * FR OM ["+ВыбФайл.Имя+"]";
    Command.CommandText = Команда;
    Recordset = Command.Execute();
    Колонки = Новый Массив;
    Для Каждого Кол Из Recordset.Fields Цикл
    Колонки.Добавить(Кол.Name);
    КонецЦикла;
    ПрочитатьCSVНаСервере(Колонки,Recordset.GetRows().Выгрузить());
    КонецЕсли;
    КонецПроцедуры

    &НаСервере
    Процедура ПрочитатьCSVНаСервере(Колонки,МассивСтрок)

    Таб = Новый ТаблицаЗначений;

    Для Инд = 0 По Колонки.ВГраница() Цикл
    Типы = Новый Массив;
    //Этот обход только для опредедления типов в колонках, можно обойтись первой строкой или указать типы вручную
    Для Каждого Строка Из МассивСтрок Цикл
    НовыйТип = ТипЗнч(Строка[Инд]);
    Если Типы.Найти(НовыйТип) = Неопределено Тогда
    Типы.Добавить(НовыйТип);
    КонецЕсли;
    КонецЦикла;
    Таб.Колонки.Добавить(Колонки[Инд],Новый описаниеТипов(Типы));
    КонецЦикла;

    Для Каждого Строка Из МассивСтрок Цикл
    НовСтр = Таб.Добавить();
    Для Инд = 0 По Колонки.ВГраница() Цикл
    НовСтр[Колонки[Инд]] = Строка[Инд];
    КонецЦикла;
    КонецЦикла;

    КонецПроцедуры
```
---
В первой строке будет находится шапка

```1c
    Шапка = ЗагружаемыйФайл.ПолучитьСтрoку(1);
    МассивКолонок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Шапка , ";"); //Подставите нужный разделитель
```

Если колонки заранее известны то можно игнорить первую строку и получать непосредственно данные

```1c
    Для НомерСтроки=2 по ЗагружаемыйФайл.КоличествоСтрок() Цикл
    //Херак - херак
    КонецЦикла;
```
---
Построчно очень долго обходить, файлы очень большие
---
А Вы пробовали уже? Excel же как-то открывает CSV, и даже делит всё в зависимости от указанного разделителя.
Если так напрямую не открывает, можно докопаться до открытия через Excel. Что-то вроде открытия CSV в Excel программно по вашим разделителям, он разделяет всё по ячейкам, пишите во временный файлик это всё и пользуетесь потом ТабличныйДокумент.Прочитать(ВременныйФайл)
---
Ну это хорошо если на сервере установлен Excel, его может там и не быть.
---
Уже работал с большими набора и натыкался на такое. А перед открытием экселька его конвертирует и нет гарантии на корректность.
---
Ну, тут я уж не спорю, я вкратце познакомился с этим всем и задача была не такая большая. Я просто подсказал вариант, который, как оказалось, не совсем подходит)
---
CSV это обычный текстовой файл в котором данные разделены символами Символы.Таб либо ";" либо ","

```1c
    // чтение
    ЗагружаемыйФайл = Новый ТекстовыйДокумент;
    ЗагружаемыйФайл.Прочитать(ВашCSVФайл);
```
---
В том то и дело, что хотелось бы сразу иметь таблицу. Если загрузить текстовый документ, то всё равно надо проходить построчно чтобы данные поместить в таблицу значений, что занимает более длительное время.
Вот если бы ТабличныйДокумент умел читать такой довольно стандартный формат как CSV. Excel довольно быстро читает данные в текстовом формате. Если например имеются данные в текстовом файле с разделителями, а в файле 26000 строк и более. Чтобы быстро загрузить эти данные в 1С надо Excel'ем преобразовать из текстового формата в xls а потом ТабличныйДокумент.Прочитать(файл). Вот и хотелось бы сделать это средствами только 1С автоматически и без подключения к Excel, т.к. на сервере Excel может быть не установлен.
---
Можно еще через OLEDB либо через ODBC драйверы работать, скорость на чтении будет существенно выше и запросом по файлу можно будет получать необходимые данные.

```1c
    Connection = Новый ComОбъект("ADODB.Connection");
    Command = Новый ComОбъект("ADODB.Command");
    СтрокаПодключения = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="+Файл.Путь
    +";Extensions=csv;";
    Connection.ConnectionString = СтрокаПодключения;
    Connection.Open();
    Command.ActiveConnection = Connection;

    Команда = "SEL ECT * FR OM ["+файл.Имя+"]";
    Command.CommandText = Команда;
    Recordset = Command.Execute();
    Сообщить("Выполнил");

    ЧислоПолей = Recordset.Fields.Count;
```
---
xls & csv только лишь условно совместимые - при конвертации можно потерять часть данных т.к. у эксельки есть ограничения:
1 048 576 строк и 16 384 столбца
Ширина столбца 255 знаков
Высота строки 409 пунктов
Общее количество знаков в ячейке 32 767 знаков
Число знаков в верхнем и нижнем колонтитуле 255
Максимальное число переводов строки в ячейке 253
---
я рекомендую следующий подход:

```1c
    &НаКлиенте
    Процедура ПрочитатьCSV(Команда)
    Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    Фильтр = "Текстовый документ(*.txt;*.csv;)|*.txt;*.csv;";
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите файлы";
    Если ДиалогОткрытияФайла.Выбрать() Тогда
    МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
    Для Каждого ИмяФайла Из МассивФайлов Цикл
    ВыбФайл = Новый Файл(ИмяФайла);
    Файл=ВыбФайл.ПолноеИмя;
    Сообщить(ИмяФайла
    + НСтр("ru = '; Размер = '; en = '; Size = '")
    + ВыбФайл.Размер());
    КонецЦикла;

    Connection = Новый ComОбъект("ADODB.Connection");
    Command = Новый ComОбъект("ADODB.Command");
    СтрокаПодключения = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="+ВыбФайл.Путь
    +";Extensions=csv;";
    Connection.ConnectionString = СтрокаПодключения;
    Connection.Open();
    Command.ActiveConnection = Connection;

    Команда = "SEL ECT * FR OM ["+ВыбФайл.Имя+"]";
    Command.CommandText = Команда;
    Recordset = Command.Execute();
    Колонки = Новый Массив;
    Для Каждого Кол Из Recordset.Fields Цикл
    Колонки.Добавить(Кол.Name);
    КонецЦикла;
    ПрочитатьCSVНаСервере(Колонки,Recordset.GetRows().Выгрузить());
    КонецЕсли;
    КонецПроцедуры

    &НаСервере
    Процедура ПрочитатьCSVНаСервере(Колонки,МассивСтрок)

    Таб = Новый ТаблицаЗначений;

    Для Инд = 0 По Колонки.ВГраница() Цикл
    Типы = Новый Массив;
    //Этот обход только для опредедления типов в колонках, можно обойтись первой строкой или указать типы вручную
    Для Каждого Строка Из МассивСтрок Цикл
    НовыйТип = ТипЗнч(Строка[Инд]);
    Если Типы.Найти(НовыйТип) = Неопределено Тогда
    Типы.Добавить(НовыйТип);
    КонецЕсли;
    КонецЦикла;
    Таб.Колонки.Добавить(Колонки[Инд],Новый описаниеТипов(Типы));
    КонецЦикла;

    Для Каждого Строка Из МассивСтрок Цикл
    НовСтр = Таб.Добавить();
    Для Инд = 0 По Колонки.ВГраница() Цикл
    НовСтр[Колонки[Инд]] = Строка[Инд];
    КонецЦикла;
    КонецЦикла;

    КонецПроцедуры
```
---
Команда = "SEL ECT * FR OM ["+ВыбФайл.Имя+"]"; только пробелы убрать лишние
---
Для Каждого Строка Из МассивСтрок Цикл
        НовСтр = Таб.Добавить();
        Для Инд = 0 По Колонки.ВГраница() Цикл
            НовСтр[Колонки[Инд]] = Строка[Инд];
        КонецЦикла;
    КонецЦикла;

Как будет быстрее загрузить в таблицу значений, пройти построчно или по колонкам ТаблицаЗначений.ЗагрузитьКолонку()?
---
Там на входе массив массивов (выгруженный из многомерного массива) То есть надо будет сначала собрать загружаемый массив тем же циклом, так что скорее всего не быстрее.