Задача загрузки данных из текстовых файлов формата *.txt регулярно возникает при интеграции 1С со сторонними учетными системами, клиент-банками, терминалами сбора данных или при миграции информации. Рассмотрим подробно основные программные и пользовательские варианты решения этой задачи, разберем типовые примеры кода и проанализируем нюансы производительности.
Для файлов любого объема наиболее правильным и оптимальным с точки зрения потребления памяти является объект ЧтениеТекста. В отличие от полной загрузки документа в оперативную память, данный объект выполняет последовательное считывание строк с диска.
Разберем по шагам, как устроен этот механизм:
ЧтениеТекста с указанием пути к файлу и нужной кодировки (например, КодировкаТекста.ANSI или КодировкаТекста.UTF8).ПрочитатьСтроку().Пока, который продолжается до тех пор, пока очередная считанная строка не станет равна значению Неопределено (что сигнализирует о достижении конца файла).Закрыть() для освобождения ресурсов операционной системы.Посмотрим на пример программного кода:
Текст = Новый ЧтениеТекста("d:\win.txt", КодировкаТекста.ANSI);
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
// Выполняем обработку текущей строки
Сообщить(Стр);
Стр = Текст.ПрочитатьСтроку();
КонецЦикла;
Текст.Закрыть();
Объект ЧтениеТекста доступен во всех контекстах (тонкий клиент, сервер, толстый клиент) и отлично подходит для файлов любого объема, исключая переполнение оперативной памяти.
Второй популярный программный подход — использование объекта ТекстовыйДокумент. Этот объект прост в освоении и часто применяется разработчиками для небольших файлов.
Посмотрим на пример использования:
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ФайлСданными);
Для й = 1 По Текст.КоличествоСтрок() Цикл
СтрокаСданными = Текст.ПолучитьСтроку(й);
// Обработка данных строки
КонецЦикла;
Проанализируем ограничения этого метода. Объект ТекстовыйДокумент считывает содержимое файла целиком в оперативную память. Если обрабатывается файл размером в десятки или сотни мегабайт, это вызовет резкий скачок потребления памяти. Кроме того, вызов метода ПолучитьСтроку() в цикле по индексу работает нелинейно медленно на больших массивах данных. Поэтому рекомендуем ограничить использование данного способа только небольшими конфигурационными или настроечными файлами.
Часто текстовые файлы содержат табличные данные с разделителями (запятая, точка с запятой, табуляция). Если внутри данных встречаются кавычки или переводы строк, простой построчный разбор может дать сбой.
Рассмотрим два варианта разбора строк:
ЧтениеТекста строку можно быстро разбить на массив колонок встроенной функцией платформы: МассивПолей = СтрРазделить(Стр, ";", Ложь);.Если нет необходимости разрабатывать собственный программный парсер с нуля, выясним, какие средства уже встроены в типовые конфигурации 1С («1С:Бухгалтерия», «1С:УТ», «1С:ERP», «1С:КА»).
В большинстве справочников и табличных частей документов присутствует стандартная кнопка «Загрузить из внешнего файла». Этот инструмент позволяет пользователю:
Для сложных произвольных структур также удобно использовать стандартную внешнюю обработку «Загрузка данных из табличного документа», в которую текстовый файл можно загрузить через буфер обмена.
При реализации загрузки в управляемом приложении важно учитывать разделение контекстов выполнения кода:
ПоместитьФайлНаСервер() (или асинхронного аналога НачатьПомещениеФайлаНаСервер()), а затем считаем двоичные данные или сохраним их во временный файл на стороне сервера.LF, в то время как в Windows используется CRLF. При чтении через ЧтениеТекста платформа корректно распознает оба варианта, однако кодировку (например, UTF-8 с маркером BOM или Windows-1251) следует указывать явно в параметрах инициализации объекта.