Как сформировать массив из текстового файла в 1С и распарсить его строки?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции с внешними системами и обработке текстовых выгрузок часто возникает необходимость прочитать данные из файла формата TXT, разбить каждую строку по определённому разделителю (например, по запятой или табуляции) и поместить полученные значения в коллекцию для дальнейшей обработки.

Рассмотрим по шагам, как правильно считать текстовый файл в 1С, распарсить строки и подставить полученные элементы в результирующий шаблон текста с помощью функции СтрШаблон.

Способ 1. Построчное чтение и применение функции СтрРазделить

Для оптимальной работы с памятью платформы разберем базовый механизм чтения файла с помощью объекта ЧтениеТекста и стандартной функции СтрРазделить. Такой подход позволяет последовательно обрабатывать каждую строку без необходимости загружать весь файл целиком в одну переменную.

Проанализируем пример кода, выполняющего построчный разбор и выгрузку в массив:


ПутьКФайлу = "C:\Data\upload.txt";
ФайлТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);

МассивРезультат = Новый Массив;

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

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

Для последующего вывода подставим полученные строки в шаблон СтрШаблон:


ШаблонВывода = "id:%1 Ref=%2 currency=""%3""";

Для Каждого ЭлементМассива Из МассивРезультат Цикл
    Если ЭлементМассива.Количество() >= 3 Тогда
        Сообщение = СтрШаблон(ШаблонВывода, ЭлементМассива[0], ЭлементМассива[1], ЭлементМассива[2]);
        Сообщить(Сообщение);
    КонецЕсли;
КонецЦикла;

Способ 2. Использование массива структур вместо многомерного массива

Обращение к элементам по числовым индексам (ЭлементМассива[0], ЭлементМассива[1]) часто приводит к ошибкам при чтении кода. Удобнее формировать одномерный Массив, элементами которого являются объекты Структура с именованными полями.

Разберем реализацию этого подходу на практике:


МассивДанных = Новый Массив;
ФайлТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);

ТекстоваяСтрока = ФайлТекста.ПрочитатьСтроку();
Пока ТекстоваяСтрока <> Неопределено Цикл
    
    Если Не ПустаяСтрока(ТекстоваяСтрока) Тогда
        
        МассивКолонок = СтрРазделить(ТекстоваяСтрока, ",");
        
        Если МассивКолонок.Количество() >= 3 Тогда
            
            СтрокаСтруктуры = Новый Структура;
            СтрокаСтруктуры.Вставить("Идентификатор", СокрЛП(МассивКолонок[0]));
            СтрокаСтруктуры.Вставить("Артикул",       СокрЛП(МассивКолонок[1]));
            СтрокаСтруктуры.Вставить("Валюта",        СокрЛП(МассивКолонок[2]));
            
            МассивДанных.Добавить(СтрокаСтруктуры);
            
        КонецЕсли;
        
    КонецЕсли;
    
    ТекстоваяСтрока = ФайлТекста.ПрочитатьСтроку();
    
КонецЦикла;

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

// Вывод сформированных данных
ШаблонВывода = "id:%1 Ref=%2 currency=""%3""";
Для Каждого СтрокаДанных Из МассивДанных Цикл
    Сообщить(СтрШаблон(ШаблонВывода, СтрокаДанных.Идентификатор, СтрокаДанных.Артикул, СтрокаДанных.Валюта));
КонецЦикла;

Важные нюансы и возможные проблемы при парсинге

При работе с внешними текстовыми файлами необходимо учитывать следующие моменты:

  1. Явное указание кодировки: Всегда передавайте кодировку в конструктор ЧтениеТекста (например, КодировкаТекста.UTF8 или КодировкаТекста.ANSI). Если кодировка не задана, кириллические символы могут прочитаться искаженно.
  2. Удаление пробелов вокруг разделителей: После разбиения строки методом СтрРазделить в значениях могут оставаться концевые и начальные пробелы (например, " A1" вместо "A1"). Применяйте функцию СокрЛП к каждому подстрочному значению.
  3. Обработка пустых строк: Файлы выгрузки часто содержат пустые строки в конце. Проверяйте прочитанные строки функцией ПустаяСтрока перед разбором, чтобы избежать выхода за пределы массива.
  4. Использование библиотек БСП: Если разработка ведется в типовой конфигурации на базе БСП, обратите внимание на функции общего модуля СтроковыеФункцииКлиентСервер, в которых уже содержатся готовые инструменты для разбора и очистки строк.
← На главную