Как загрузить данные из текстового файла в 1С?

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

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

Способ 1. Потоковое чтение через объект ЧтениеТекста

Для файлов любого объема наиболее правильным и оптимальным с точки зрения потребления памяти является объект ЧтениеТекста. В отличие от полной загрузки документа в оперативную память, данный объект выполняет последовательное считывание строк с диска.

Разберем по шагам, как устроен этот механизм:

  1. Создаем объект ЧтениеТекста с указанием пути к файлу и нужной кодировки (например, КодировкаТекста.ANSI или КодировкаТекста.UTF8).
  2. Считываем первую строку с помощью метода ПрочитатьСтроку().
  3. Организуем цикл Пока, который продолжается до тех пор, пока очередная считанная строка не станет равна значению Неопределено (что сигнализирует о достижении конца файла).
  4. Внутри цикла обрабатываем полученную строку и считываем следующую.
  5. По завершении чтения закрываем файл методом Закрыть() для освобождения ресурсов операционной системы.

Посмотрим на пример программного кода:


Текст = Новый ЧтениеТекста("d:\win.txt", КодировкаТекста.ANSI);
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
    // Выполняем обработку текущей строки
    Сообщить(Стр);
    Стр = Текст.ПрочитатьСтроку();
КонецЦикла;
Текст.Закрыть();

Объект ЧтениеТекста доступен во всех контекстах (тонкий клиент, сервер, толстый клиент) и отлично подходит для файлов любого объема, исключая переполнение оперативной памяти.

Способ 2. Чтение через объект ТекстовыйДокумент

Второй популярный программный подход — использование объекта ТекстовыйДокумент. Этот объект прост в освоении и часто применяется разработчиками для небольших файлов.

Посмотрим на пример использования:


Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ФайлСданными);
Для й = 1 По Текст.КоличествоСтрок() Цикл
    СтрокаСданными = Текст.ПолучитьСтроку(й);
    // Обработка данных строки
КонецЦикла;

Проанализируем ограничения этого метода. Объект ТекстовыйДокумент считывает содержимое файла целиком в оперативную память. Если обрабатывается файл размером в десятки или сотни мегабайт, это вызовет резкий скачок потребления памяти. Кроме того, вызов метода ПолучитьСтроку() в цикле по индексу работает нелинейно медленно на больших массивах данных. Поэтому рекомендуем ограничить использование данного способа только небольшими конфигурационными или настроечными файлами.

Способ 3. Парсинг структурированных строк через ЧтениеCSV и СтрРазделить

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

Рассмотрим два варианта разбора строк:

  1. Объект ЧтениеCSV: специально предназначен для файлов с разделителями. Он автоматически обрабатывает кавычки, экранирование спецсимволов и многострочные текстовые поля внутри ячеек, возвращая массив значений колонок.
  2. Функция СтрРазделить: если структура файла простая и экранирование не используется, каждую полученную через ЧтениеТекста строку можно быстро разбить на массив колонок встроенной функцией платформы: МассивПолей = СтрРазделить(Стр, ";", Ложь);.

Способ 4. Типовой механизм «Загрузка данных из внешних файлов»

Если нет необходимости разрабатывать собственный программный парсер с нуля, выясним, какие средства уже встроены в типовые конфигурации 1С («1С:Бухгалтерия», «1С:УТ», «1С:ERP», «1С:КА»).

В большинстве справочников и табличных частей документов присутствует стандартная кнопка «Загрузить из внешнего файла». Этот инструмент позволяет пользователю:

  1. Скопировать текстовую информацию через буфер обмена или указать файл на диске.
  2. Сопоставить колонки текстового файла с реквизитами создаваемых объектов.
  3. Выполнить предварительную валидацию и сопоставление номенклатуры, контрагентов или других элементов перед записью в информационную базу.

Для сложных произвольных структур также удобно использовать стандартную внешнюю обработку «Загрузка данных из табличного документа», в которую текстовый файл можно загрузить через буфер обмена.

Особенности клиент-серверной архитектуры при загрузке файлов

При реализации загрузки в управляемом приложении важно учитывать разделение контекстов выполнения кода:

  1. Передача на сервер: серверный код 1С не имеет прямого доступа к файловой системе на компьютере пользователя в тонком клиенте. Чтобы прочитать файл на сервере, сначала поместим его во временное хранилище на клиенте с помощью метода ПоместитьФайлНаСервер() (или асинхронного аналога НачатьПомещениеФайлаНаСервер()), а затем считаем двоичные данные или сохраним их во временный файл на стороне сервера.
  2. Кодировки и разделители строк: при чтении файлов, созданных в операционных системах Linux, разделителем строк выступает символ LF, в то время как в Windows используется CRLF. При чтении через ЧтениеТекста платформа корректно распознает оба варианта, однако кодировку (например, UTF-8 с маркером BOM или Windows-1251) следует указывать явно в параметрах инициализации объекта.
← На главную