К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как прочитать TXT файл в 1С

Как прочитать txt файл в 1С: ЧтениеТекста, ТекстовыйДокумент, построчное чтение, кодировки UTF-8 и ANSI, обработка ошибок и готовые примеры кода.

Чтение текстовых файлов — одна из самых частых задач при интеграции 1С с внешними системами: банковские выписки, выгрузки из торгового оборудования, прайсы поставщиков и логи обмена почти всегда приходят в формате TXT или CSV. Во встроенном языке 1С есть несколько штатных механизмов для этого, и выбор между ними зависит от размера файла, кодировки и того, нужно ли читать файл целиком или построчно.

Основные инструменты — объекты ЧтениеТекста и ТекстовыйДокумент. Первый оптимален для построчной обработки больших файлов, второй удобен, когда нужно загрузить файл целиком и работать с ним как с набором строк. Оба доступны и на толстом, и на тонком клиенте, но с ограничениями: на веб-клиенте и в файловых операциях на сервере действуют свои правила доступа к файловой системе.

Ниже разобраны рабочие примеры кода, выбор кодировки, обработка ошибок и типичные ситуации, с которыми сталкиваются разработчики и внедренцы.

Какие объекты 1С используются для чтения TXT

В платформе 1С:Предприятие 8.3 есть два основных объекта для работы с текстовыми файлами, и у каждого своё назначение.

  • ЧтениеТекста — потоковое чтение. Позволяет открыть файл и читать его построчно, посимвольно или целиком. Не загружает весь файл в память, поэтому подходит для больших файлов (сотни мегабайт).
  • ТекстовыйДокумент — загружает файл в память целиком и представляет его как набор строк с возможностью навигации, поиска и замены. Удобен для небольших файлов и когда нужен доступ к произвольной строке по номеру.
  • ЧтениеДанных / ЧтениеДвоичныхДанных — низкоуровневое чтение, нужно редко, в основном для нестандартных форматов.

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

Сравнение вариантов

ЧтениеТекста

Построчная обработка больших файлов, экономия памяти. Ограничение: последовательный доступ, нельзя вернуться к предыдущей строке без переоткрытия.

ТекстовыйДокумент

Небольшие файлы, нужен доступ к строкам по номеру, поиск и замена. Ограничение: весь файл загружается в память.

ЧтениеXML / универсальные обработки

Если файл на самом деле XML или CSV со сложной структурой — лучше использовать профильные механизмы, а не ручной разбор строк.

Чтение файла построчно через ЧтениеТекста

Это рекомендуемый способ для большинства задач: загрузка выписок, прайсов, файлов обмена. Файл открывается, читается строка за строкой, каждая строка разбирается и обрабатывается.

Процедура ПрочитатьФайлПострочно(ПутьКФайлу)

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

СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();

Пока СтрокаФайла <> Неопределено Цикл

// Разбор строки, например по разделителю

ЧастиСтроки = СтрРазделить(СтрокаФайла, ";");

Если ЧастиСтроки.Количество() >= 3 Тогда

// Обработка данных: ЧастиСтроки[0], ЧастиСтроки[1] ...

КонецЕсли;

СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();

КонецЦикла;

ЧтениеТекста.Закрыть();

КонецПроцедуры

Ключевые моменты: метод ПрочитатьСтроку() возвращает Неопределено, когда файл закончился — это условие выхода из цикла. Вызов Закрыть() обязателен: пока поток открыт, файл заблокирован для других операций, и при массовой обработке можно получить ошибку «файл занят».

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

Порядок действий
  1. 1
    Проверьте существование файла через объект Файл и метод Существует()
  2. 2
    Откройте файл: Новый ЧтениеТекста(Путь, КодировкаТекста.UTF8)
  3. 3
    Читайте строки в цикле Пока ... &lt;&gt; Неопределено
  4. 4
    Разбирайте каждую строку через СтрРазделить() по разделителю
  5. 5
    Закройте поток методом Закрыть() после цикла
  6. 6
    Проверьте результат: количество обработанных строк совпадает с ожиданием

Чтение небольшого файла через ТекстовыйДокумент

Если файл небольшой (условно до нескольких мегабайт) и нужен доступ к строкам по номерам, проще использовать ТекстовыйДокумент. Типичный сценарий — файл настроек, шаблон, список значений.

Процедура ПрочитатьЧерезТекстовыйДокумент(ПутьКФайлу)

Док = Новый ТекстовыйДокумент;

Док.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8);

Для НомерСтроки = 1 По Док.КоличествоСтрок() Цикл

СтрокаФайла = Док.ПолучитьСтроку(НомерСтроки);

// Обработка строки

КонецЦикла;

КонецПроцедуры

Преимущество подхода — можно обращаться к любой строке по номеру, искать подстроку методом НайтиТекст(), заменять фрагменты и сохранять результат обратно методом Записать(). Недостаток — расход памяти: весь файл находится в оперативной памяти, поэтому для крупных выгрузок этот способ не подходит.

Как определить и указать кодировку файла

Большинство проблем при чтении TXT связаны не с кодом, а с кодировкой. Если открыть файл в неправильной кодировке, кириллица превратится в «кракозябры» или знаки вопроса, а разбор строк сломается.

Основные значения перечисления КодировкаТекста:

КодировкаКогда встречаетсяЗначение в 1С
UTF-8Современные выгрузки, веб-сервисы, Linux-системыКодировкаТекста.UTF8
ANSI (Windows-1251)Старые программы, банковские клиенты, выгрузки из WindowsКодировкаТекста.ANSI
UTF-16Файлы, сохранённые из Блокнота как «Юникод»КодировкаТекста.UTF16
OEM (DOS, 866)Очень старые DOS-программы, кассовое оборудованиеКодировкаТекста.OEM

Если кодировка неизвестна, практический приём — открыть файл в Notepad++ или аналогичном редакторе: кодировка отображается в строке состояния. Альтернатива — прочитать файл дважды в разных кодировках и проверить, в каком варианте кириллица читается корректно.

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

В клиент-серверном режиме код с директивой &НаСервере выполняется на сервере 1С, и путь к файлу интерпретируется относительно сервера, а не компьютера пользователя. Файл, лежащий на диске C: пользователя, сервер не увидит.

Типовая схема передачи файла с клиента на сервер:

  1. На клиенте поместить файл во временное хранилище: НачатьПомещениеФайлаВоВременноеХранилище() или ПоместитьФайл().
  2. Передать на сервер адрес хранилища.
  3. На сервере получить двоичные данные: ПолучитьИзВременногоХранилища(Адрес), записать их во временный файл через Записать(ИмяВременногоФайла).
  4. Прочитать временный файл через ЧтениеТекста, после обработки удалить его.

Для интерактивного выбора файла пользователем используется ДиалогВыбораФайла с режимом РежимДиалогаВыбораФайла.Открытие и фильтром "Текстовые файлы (.txt)|.txt".

Обработка ошибок и проверка результата

Работа с файлами почти всегда требует защиты от сбоев: файл может отсутствовать, быть занят другой программой, содержать пустые или битые строки. Минимальный каркас надёжного чтения:

Процедура БезопасноеЧтение(ПутьКФайлу)

ФайлНаДиске = Новый Файл(ПутьКФайлу);

Если Не ФайлНаДиске.Существует() Тогда

ВызватьИсключение "Файл не найден: " + ПутьКФайлу;

КонецЕсли;

ЧтениеТекста = Неопределено;

Попытка

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

// ... чтение и разбор строк

Исключение

Если ЧтениеТекста <> Неопределено Тогда

ЧтениеТекста.Закрыть();

КонецЕсли;

ВызватьИсключение "Ошибка чтения файла: " + ОписаниеОшибки();

КонецПопытки;

ЧтениеТекста.Закрыть();

КонецПроцедуры

При разборе данных проверяйте каждую строку: пропускайте пустые строки и строки-заголовки, контролируйте количество колонок после СтрРазделить(), преобразуйте числа и даты через Число() и Дата() внутри попытки — текстовые файлы часто содержат значения, не приводимые к нужному типу.

Контрольные точки

Как проверить результат

Количество прочитанных строк
Норма

Совпадает с количеством строк в файле (минус заголовок)

Тревожный признак

Часть строк потеряна — проверьте признак конца файла и пустые строки

Кириллица в данных
Норма

Текст читается нормально

Тревожный признак

Кракозябры или знаки вопроса — неверная кодировка

Числа и даты
Норма

Все значения преобразованы без исключений

Тревожный признак

Ошибки преобразования — в файле другой формат разделителя или даты

Блокировка файла
Норма

После обработки файл можно открыть и удалить

Тревожный признак

Файл занят — не вызван метод Закрыть()

Типичные ошибки при чтении TXT в 1С

Первая частая ошибка — чтение CSV-файла «в лоб» через СтрРазделить(Строка, ",") без учёта кавычек. Если значение содержит запятую внутри кавычек, разбор ломается. Для таких файлов либо пишите парсер с учётом кавычек, либо используйте готовые библиотеки разбора CSV.

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

Типичные ошибки
01
Не указана кодировка — кириллица превращается в кракозябры при чтении UTF-8 без BOM
02
Нет вызова Закрыть() — файл остаётся заблокированным для других процессов
03
Разбор CSV через СтрРазделить без учёта кавычек — колонки смещаются и данные портятся
04
Чтение файла на сервере по клиентскому пути — ошибка «файл не найден»
05
Запись данных в базу без предварительной проверки — массовые некорректные документы
Итог

Что важно запомнить

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

Частые вопросы

Как прочитать TXT файл, если неизвестна его кодировка?

Откройте файл в редакторе, который показывает кодировку (например, Notepad++ — она отображается в строке состояния). Если редактора нет, прочитайте файл в 1С дважды — как UTF8 и как ANSI — и сравните, в каком варианте кириллица отображается корректно. Полученную кодировку зафиксируйте в коде явно.

Чем отличается ЧтениеТекста от ТекстовыйДокумент?

ЧтениеТекста читает файл потоково, последовательно, не загружая его в память целиком — подходит для больших файлов. ТекстовыйДокумент загружает весь файл в память и даёт доступ к строкам по номерам, поиск и замену — удобен для небольших файлов и редактирования содержимого.

Почему при чтении файла русские буквы заменяются знаками вопроса?

Причина в несовпадении кодировки файла и кодировки, указанной при открытии. Чаще всего файл сохранён в ANSI (Windows-1251), а читается как UTF-8, или наоборот. Укажите правильное значение КодировкаТекста при создании объекта чтения.

Как прочитать файл, который выбрал пользователь, в клиент-серверной базе?

На клиенте поместите файл во временное хранилище (НачатьПомещениеФайлаВоВременноеХранилище), передайте адрес хранилища в серверную процедуру, там получите двоичные данные, запишите их во временный файл на сервере и прочитайте через ЧтениеТекста. После обработки временный файл удалите.

Как пропустить первую строку файла с заголовками колонок?

Просто вызовите ПрочитатьСтроку() один раз до начала основного цикла и не обрабатывайте результат. Альтернативно — введите счётчик строк и пропускайте строку с номером 1 внутри цикла, что удобнее, если заголовков несколько.

Можно ли читать TXT файл без прав на внешние компоненты и в безопасном режиме?

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