Back to top

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

Опубликовано e-1c@mail.ru - ср, 08/24/2016 - 05:31

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

Чтение текстового файла

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

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

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

Пример:

&НаКлиенте
Процедура ПрочитатьФайл(Команда)
 
        // Вставить содержимое обработчика.
        Перем Стр;
 
        Стр = "";
 
        //Открываем диалог выбора файла для чтения
        ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        ВыборФайла.МножественныйВыбор = Ложь;
        ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'");
        ВыборФайла.Фильтр = НСтр("ru = 'Все файлы (*.*)|*.*'");
 
        Если ВыборФайла.Выбрать() Тогда
 
                ПолноеИмяФайла = ВыборФайла.ПолноеИмяФайла;
 
        КонецЕсли;
 
        Текст = Новый ЧтениеТекста;
        Текст.Открыть(ПолноеИмяФайла);
 
        Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки
 
                Стр = Текст.ПрочитатьСтроку();
                Сообщить(Стр);
 
        КонецЦикла;
 
        Текст.Закрыть();
 
КонецПроцедуры

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

Запись текстового файла

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

&НаКлиенте
Процедура ЗаписатьФайл(Команда)
 
        //Открываем диалог выбора файла для записи
        СохранениеФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
        СохранениеФайла.Заголовок = НСтр("ru = 'Сохранить файл'");
        СохранениеФайла.Фильтр = НСтр("ru = 'Все файлы (*.txt)|*.txt'");
 
        Если СохранениеФайла.Выбрать() Тогда
 
                Текст = Новый ЗаписьТекста;
                Текст.Открыть(СохранениеФайла.ПолноеИмяФайла,КодировкаТекста.ANSI);
                Текст.ЗаписатьСтроку("Программируем в 1С 8.2");
                Текст.Закрыть();
 
        КонецЕсли;
 
КонецПроцедуры

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

Чтение файла CSV

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

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

Пример:
&НаКлиенте
ПроцедураПрочитатьЦСВ(Команда)
 
        // Вставить содержимое обработчика.
        ПеремСтр,Сч;
        Стр = "";
 
        //Открываем диалог выбора файла для чтения
        ВыборФайла= НовыйДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        ВыборФайла.МножественныйВыбор = Ложь;
        ВыборФайла.Заголовок =НСтр("ru = 'Выбор файла'");
        ВыборФайла.Фильтр=НСтр("ru = 'Все файлы (*.csv)|*.csv'");
 
        ЕслиВыборФайла.Выбрать() Тогда
                ПолноеИмяФайла=ВыборФайла.ПолноеИмяФайла;
        КонецЕсли;
 
        Текст =НовыйЧтениеТекста;
        Текст.Открыть(ПолноеИмяФайла);
        Сч = 0;
 
        ПокаСтр <> Неопределено Цикл
 
                Стр =Текст.ПрочитатьСтроку();
 
                //Создаем массив в который будем добавлять выбранные поля
                МассивПолей =НовыйМассив();
 
                //Цикл разбивает строку на подстроки по разделителю ";" и заносит их в массив
                ПокаСтрДлина(Стр)> 0 Цикл
 
                       //Находим позицию первого вхождения символа ";"
                       ПозицияРазделителя =Найти(Стр, ";");
 
                       //Считываем символы до первого найденного символа ";"
                       МассивПолей.Добавить(Лев(Стр,ПозицияРазделителя - 1));
 
                       //Удаляем из строки найденную подстроку и повторяем цикл с оставшейся строкой
                       Стр =Прав(Стр,СтрДлина(Стр) -ПозицияРазделителя);
 
                КонецЦикла;
 
                //Выводим на экран первое прочитанное поле
                Попытка Сообщить(МассивПолей[0]); Исключение КонецПопытки;
 
        КонецЦикла;
 
        Текст.Закрыть();
 
КонецПроцедуры