При интеграции с внешними системами и обработке текстовых выгрузок часто возникает необходимость прочитать данные из файла формата TXT, разбить каждую строку по определённому разделителю (например, по запятой или табуляции) и поместить полученные значения в коллекцию для дальнейшей обработки.
Рассмотрим по шагам, как правильно считать текстовый файл в 1С, распарсить строки и подставить полученные элементы в результирующий шаблон текста с помощью функции СтрШаблон.
Для оптимальной работы с памятью платформы разберем базовый механизм чтения файла с помощью объекта ЧтениеТекста и стандартной функции СтрРазделить. Такой подход позволяет последовательно обрабатывать каждую строку без необходимости загружать весь файл целиком в одну переменную.
Проанализируем пример кода, выполняющего построчный разбор и выгрузку в массив:
ПутьКФайлу = "C:\Data\upload.txt";
ФайлТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);
МассивРезультат = Новый Массив;
ТекстоваяСтрока = ФайлТекста.ПрочитатьСтроку();
Пока ТекстоваяСтрока <> Неопределено Цикл
// Проверяем, что строка не пустая
Если Не ПустаяСтрока(ТекстоваяСтрока) Тогда
// Разбиваем строку по запятой в массив значений
МассивЭлементов = СтрРазделить(ТекстоваяСтрока, ",");
// Очищаем каждый элемент от лишних пробелов по краям
Для Индекс = 0 По МассивЭлементов.Количество() - 1 Цикл
МассивЭлементов[Индекс] = СокрЛП(МассивЭлементов[Индекс]);
КонецЦикла;
МассивРезультат.Добавить(МассивЭлементов);
КонецЕсли;
ТекстоваяСтрока = ФайлТекста.ПрочитатьСтроку();
КонецЦикла;
ФайлТекста.Закрыть();
Для последующего вывода подставим полученные строки в шаблон СтрШаблон:
ШаблонВывода = "id:%1 Ref=%2 currency=""%3""";
Для Каждого ЭлементМассива Из МассивРезультат Цикл
Если ЭлементМассива.Количество() >= 3 Тогда
Сообщение = СтрШаблон(ШаблонВывода, ЭлементМассива[0], ЭлементМассива[1], ЭлементМассива[2]);
Сообщить(Сообщение);
КонецЕсли;
КонецЦикла;
Обращение к элементам по числовым индексам (ЭлементМассива[0], ЭлементМассива[1]) часто приводит к ошибкам при чтении кода. Удобнее формировать одномерный Массив, элементами которого являются объекты Структура с именованными полями.
Разберем реализацию этого подходу на практике:
МассивДанных = Новый Массив;
ФайлТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);
ТекстоваяСтрока = ФайлТекста.ПрочитатьСтроку();
Пока ТекстоваяСтрока <> Неопределено Цикл
Если Не ПустаяСтрока(ТекстоваяСтрока) Тогда
МассивКолонок = СтрРазделить(ТекстоваяСтрока, ",");
Если МассивКолонок.Количество() >= 3 Тогда
СтрокаСтруктуры = Новый Структура;
СтрокаСтруктуры.Вставить("Идентификатор", СокрЛП(МассивКолонок[0]));
СтрокаСтруктуры.Вставить("Артикул", СокрЛП(МассивКолонок[1]));
СтрокаСтруктуры.Вставить("Валюта", СокрЛП(МассивКолонок[2]));
МассивДанных.Добавить(СтрокаСтруктуры);
КонецЕсли;
КонецЕсли;
ТекстоваяСтрока = ФайлТекста.ПрочитатьСтроку();
КонецЦикла;
ФайлТекста.Закрыть();
// Вывод сформированных данных
ШаблонВывода = "id:%1 Ref=%2 currency=""%3""";
Для Каждого СтрокаДанных Из МассивДанных Цикл
Сообщить(СтрШаблон(ШаблонВывода, СтрокаДанных.Идентификатор, СтрокаДанных.Артикул, СтрокаДанных.Валюта));
КонецЦикла;
При работе с внешними текстовыми файлами необходимо учитывать следующие моменты:
ЧтениеТекста (например, КодировкаТекста.UTF8 или КодировкаТекста.ANSI). Если кодировка не задана, кириллические символы могут прочитаться искаженно.СтрРазделить в значениях могут оставаться концевые и начальные пробелы (например, " A1" вместо "A1"). Применяйте функцию СокрЛП к каждому подстрочному значению.ПустаяСтрока перед разбором, чтобы избежать выхода за пределы массива.СтроковыеФункцииКлиентСервер, в которых уже содержатся готовые инструменты для разбора и очистки строк.