Аренда серверов

Работа с текстовыми файлами и файлами CSV в 1С 8.2






        Целью данной статьи будет изучение алгоритмов работы с текстовыми файлами, файлами DBF и CSV. Очень часто приходится использовать данные форматы для обмена данными между несколькими базами, в том числе и отличными от 1С.


Открытие текстового файла для чтения описывается конструкцией: 

Текст = Новый ЧтениеТекста;
Текст.Открыть(ПолноеИмяФайла);

В данной конструкции создается неинициализированный объект ЧтениеТекста, а для инициализации используется метод Открыть(<Имя файла>)

Пример:

&НаКлиенте
Процедура ПрочитатьФайл(Команда)

        // Вставить содержимое обработчика.
        Перем Стр;

        Стр = "";

        //Открываем диалог выбора файла для чтения
        ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        ВыборФайла.МножественныйВыбор = Ложь;
        ВыборФайла.Заголовок НСтр("ru = 'Выбор файла'");
        ВыборФайла.Фильтр = НСтр("ru = 'Все файлы (*.*)|*.*'");

        Если ВыборФайла.Выбрать() Тогда

                ПолноеИмяФайла ВыборФайла.ПолноеИмяФайла;

        КонецЕсли;

        Текст Новый ЧтениеТекста;
        Текст.Открыть(ПолноеИмяФайла);

        Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки

                Стр Текст.ПрочитатьСтроку();
                Сообщить(Стр);

        КонецЦикла;

        Текст.Закрыть();

КонецПроцедуры

Перебор строк в текстовом документе реализован при помощи функции ПрочитатьСтроку().
После чтения файла не забываем его закрыть функцией Закрыть().


Запись в текстовый файл происходит приблизительно по тому же сценарию:

&НаКлиенте
Процедура ЗаписатьФайл(Команда)

        //Открываем диалог выбора файла для записи
        СохранениеФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
        СохранениеФайла.Заголовок НСтр("ru = 'Сохранить файл'");
        СохранениеФайла.Фильтр НСтр("ru = 'Все файлы (*.txt)|*.txt'");

        Если СохранениеФайла.Выбрать() Тогда

                Текст = Новый ЗаписьТекста;
                Текст.Открыть(СохранениеФайла.ПолноеИмяФайла,КодировкаТекста.ANSI);
                Текст.ЗаписатьСтроку("Программируем в 1С 8.2");
                Текст.Закрыть();

        КонецЕсли;

КонецПроцедуры

Записать текст в документ можно при помощи функции ЗаписатьСтроку() - в данном случае после записанной строки автоматически добавится разделитель строк и следующая запись начнется с новой строки. Если же необходимо добавить в строку дополнительно текст, то можно воспользоваться функцией без переноса строки - Записать()


CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом (delimiter) — запятая (,) или точка с запятой (;). (Википедия)

Такой формат часто используют для выгрузки данных из различных баз отличных от 1С. Ниже представлен алгоритм чтения данного формата на основе обычного чтения текстового файла с анализом строки и разбиением ее на поля.

Пример:

&НаКлиенте
ПроцедураПрочитатьЦСВ(Команда)

        // Вставить содержимое обработчика.
        ПеремСтр,Сч;
        Стр = "";

        //Открываем диалог выбора файла для чтения
        ВыборФайла= НовыйДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        ВыборФайла.МножественныйВыбор = Ложь;
        ВыборФайла.Заголовок =НСтр("ru = 'Выбор файла'");
        ВыборФайла.Фильтр=НСтр("ru = 'Все файлы (*.csv)|*.csv'");

        ЕслиВыборФайла.Выбрать() Тогда
                ПолноеИмяФайла=ВыборФайла.ПолноеИмяФайла;
        КонецЕсли;

        Текст =НовыйЧтениеТекста;
        Текст.Открыть(ПолноеИмяФайла);
        Сч = 0;

        ПокаСтр <> Неопределено Цикл

                Стр =Текст.ПрочитатьСтроку();

                //Создаем массив в который будем добавлять выбранные поля
                МассивПолей =НовыйМассив();

                //Цикл разбивает строку на подстроки по разделителю ";" и заносит их в массив
                ПокаСтрДлина(Стр)> 0 Цикл

                       //Находим позицию первого вхождения символа ";"
                       ПозицияРазделителя =Найти(Стр, ";");

                       //Считываем символы до первого найденного символа ";"
                       МассивПолей.Добавить(Лев(Стр,ПозицияРазделителя - 1));

                       //Удаляем из строки найденную подстроку и повторяем цикл с оставшейся строкой
                       Стр =Прав(Стр,СтрДлина(Стр) -ПозицияРазделителя);

                КонецЦикла;

                //Выводим на экран первое прочитанное поле
                Попытка Сообщить(МассивПолей[0]); Исключение КонецПопытки;

        КонецЦикла;

        Текст.Закрыть();

КонецПроцедуры

2 комментария:

  1. в последнем примере бесконечный цикл, т.к. в конце концов ПозицияРазделителя = 0 и СтрДлина(Стр) всегда больше 0.

    ОтветитьУдалить
  2. Добрый день!
    Цикл работает корректно.
    В конце концов ПозицияРазделителя = n, где n - длина строки последнего вхождения.
    В итоге стр = "" и соответственно СтрДлина(стр) = 0.

    ОтветитьУдалить