Разработка и Конфигурация · 11 мин
Как прочитать TXT файл в 1С
Как прочитать txt файл в 1С: ЧтениеТекста, ТекстовыйДокумент, построчное чтение, кодировки UTF-8 и ANSI, обработка ошибок и готовые примеры кода.
Чтение текстовых файлов — одна из самых частых задач при интеграции 1С с внешними системами: банковские выписки, выгрузки из торгового оборудования, прайсы поставщиков и логи обмена почти всегда приходят в формате TXT или CSV. Во встроенном языке 1С есть несколько штатных механизмов для этого, и выбор между ними зависит от размера файла, кодировки и того, нужно ли читать файл целиком или построчно.
Основные инструменты — объекты ЧтениеТекста и ТекстовыйДокумент. Первый оптимален для построчной обработки больших файлов, второй удобен, когда нужно загрузить файл целиком и работать с ним как с набором строк. Оба доступны и на толстом, и на тонком клиенте, но с ограничениями: на веб-клиенте и в файловых операциях на сервере действуют свои правила доступа к файловой системе.
Ниже разобраны рабочие примеры кода, выбор кодировки, обработка ошибок и типичные ситуации, с которыми сталкиваются разработчики и внедренцы.
Какие объекты 1С используются для чтения TXT
В платформе 1С:Предприятие 8.3 есть два основных объекта для работы с текстовыми файлами, и у каждого своё назначение.
- ЧтениеТекста — потоковое чтение. Позволяет открыть файл и читать его построчно, посимвольно или целиком. Не загружает весь файл в память, поэтому подходит для больших файлов (сотни мегабайт).
- ТекстовыйДокумент — загружает файл в память целиком и представляет его как набор строк с возможностью навигации, поиска и замены. Удобен для небольших файлов и когда нужен доступ к произвольной строке по номеру.
- ЧтениеДанных / ЧтениеДвоичныхДанных — низкоуровневое чтение, нужно редко, в основном для нестандартных форматов.
Дополнительно для проверки существования файла и получения его атрибутов используется объект Файл, а для диалога выбора файла пользователем — ДиалогВыбораФайла.
Сравнение вариантов
Построчная обработка больших файлов, экономия памяти. Ограничение: последовательный доступ, нельзя вернуться к предыдущей строке без переоткрытия.
Небольшие файлы, нужен доступ к строкам по номеру, поиск и замена. Ограничение: весь файл загружается в память.
Если файл на самом деле XML или CSV со сложной структурой — лучше использовать профильные механизмы, а не ручной разбор строк.
Чтение файла построчно через ЧтениеТекста
Это рекомендуемый способ для большинства задач: загрузка выписок, прайсов, файлов обмена. Файл открывается, читается строка за строкой, каждая строка разбирается и обрабатывается.
Процедура ПрочитатьФайлПострочно(ПутьКФайлу)
ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);
СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();
Пока СтрокаФайла <> Неопределено Цикл
// Разбор строки, например по разделителю
ЧастиСтроки = СтрРазделить(СтрокаФайла, ";");
Если ЧастиСтроки.Количество() >= 3 Тогда
// Обработка данных: ЧастиСтроки[0], ЧастиСтроки[1] ...
КонецЕсли;
СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();
КонецЦикла;
ЧтениеТекста.Закрыть();
КонецПроцедуры
Ключевые моменты: метод ПрочитатьСтроку() возвращает Неопределено, когда файл закончился — это условие выхода из цикла. Вызов Закрыть() обязателен: пока поток открыт, файл заблокирован для других операций, и при массовой обработке можно получить ошибку «файл занят».
Если нужно прочитать файл целиком одной строкой, используйте метод Прочитать() без параметров — он вернёт всё содержимое. Это оправдано для небольших файлов, когда дальше текст разбирается регулярными выражениями или функциями работы со строками.
- 1Проверьте существование файла через объект Файл и метод Существует()
- 2Откройте файл: Новый ЧтениеТекста(Путь, КодировкаТекста.UTF8)
- 3Читайте строки в цикле Пока ... <> Неопределено
- 4Разбирайте каждую строку через СтрРазделить() по разделителю
- 5Закройте поток методом Закрыть() после цикла
- 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: пользователя, сервер не увидит.
Типовая схема передачи файла с клиента на сервер:
- На клиенте поместить файл во временное хранилище:
НачатьПомещениеФайлаВоВременноеХранилище()илиПоместитьФайл(). - Передать на сервер адрес хранилища.
- На сервере получить двоичные данные:
ПолучитьИзВременногоХранилища(Адрес), записать их во временный файл черезЗаписать(ИмяВременногоФайла). - Прочитать временный файл через ЧтениеТекста, после обработки удалить его.
Для интерактивного выбора файла пользователем используется ДиалогВыбораФайла с режимом РежимДиалогаВыбораФайла.Открытие и фильтром "Текстовые файлы (.txt)|.txt".
Обработка ошибок и проверка результата
Работа с файлами почти всегда требует защиты от сбоев: файл может отсутствовать, быть занят другой программой, содержать пустые или битые строки. Минимальный каркас надёжного чтения:
Процедура БезопасноеЧтение(ПутьКФайлу)
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если Не ФайлНаДиске.Существует() Тогда
ВызватьИсключение "Файл не найден: " + ПутьКФайлу;
КонецЕсли;
ЧтениеТекста = Неопределено;
Попытка
ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);
// ... чтение и разбор строк
Исключение
Если ЧтениеТекста <> Неопределено Тогда
ЧтениеТекста.Закрыть();
КонецЕсли;
ВызватьИсключение "Ошибка чтения файла: " + ОписаниеОшибки();
КонецПопытки;
ЧтениеТекста.Закрыть();
КонецПроцедуры
При разборе данных проверяйте каждую строку: пропускайте пустые строки и строки-заголовки, контролируйте количество колонок после СтрРазделить(), преобразуйте числа и даты через Число() и Дата() внутри попытки — текстовые файлы часто содержат значения, не приводимые к нужному типу.
Как проверить результат
Совпадает с количеством строк в файле (минус заголовок)
Часть строк потеряна — проверьте признак конца файла и пустые строки
Текст читается нормально
Кракозябры или знаки вопроса — неверная кодировка
Все значения преобразованы без исключений
Ошибки преобразования — в файле другой формат разделителя или даты
После обработки файл можно открыть и удалить
Файл занят — не вызван метод Закрыть()
Типичные ошибки при чтении TXT в 1С
Первая частая ошибка — чтение CSV-файла «в лоб» через СтрРазделить(Строка, ",") без учёта кавычек. Если значение содержит запятую внутри кавычек, разбор ломается. Для таких файлов либо пишите парсер с учётом кавычек, либо используйте готовые библиотеки разбора CSV.
Вторая ошибка — забытый Закрыть() при исключении в середине цикла. Поток остаётся открытым, файл блокируется, и повторная обработка завершается ошибкой доступа. Третья — обработка большого файла целиком в памяти через ТекстовыйДокумент, что приводит к замедлению и перерасходу памяти на сервере.
Что важно запомнить
Для построчного чтения больших TXT файлов используйте ЧтениеТекста, для небольших — ТекстовыйДокумент. Всегда указывайте кодировку явно, проверяйте существование файла, закрывайте поток и тестируйте разбор на копии базы перед записью данных.
Частые вопросы
Как прочитать TXT файл, если неизвестна его кодировка?
Откройте файл в редакторе, который показывает кодировку (например, Notepad++ — она отображается в строке состояния). Если редактора нет, прочитайте файл в 1С дважды — как UTF8 и как ANSI — и сравните, в каком варианте кириллица отображается корректно. Полученную кодировку зафиксируйте в коде явно.
Чем отличается ЧтениеТекста от ТекстовыйДокумент?
ЧтениеТекста читает файл потоково, последовательно, не загружая его в память целиком — подходит для больших файлов. ТекстовыйДокумент загружает весь файл в память и даёт доступ к строкам по номерам, поиск и замену — удобен для небольших файлов и редактирования содержимого.
Почему при чтении файла русские буквы заменяются знаками вопроса?
Причина в несовпадении кодировки файла и кодировки, указанной при открытии. Чаще всего файл сохранён в ANSI (Windows-1251), а читается как UTF-8, или наоборот. Укажите правильное значение КодировкаТекста при создании объекта чтения.
Как прочитать файл, который выбрал пользователь, в клиент-серверной базе?
На клиенте поместите файл во временное хранилище (НачатьПомещениеФайлаВоВременноеХранилище), передайте адрес хранилища в серверную процедуру, там получите двоичные данные, запишите их во временный файл на сервере и прочитайте через ЧтениеТекста. После обработки временный файл удалите.
Как пропустить первую строку файла с заголовками колонок?
Просто вызовите ПрочитатьСтроку() один раз до начала основного цикла и не обрабатывайте результат. Альтернативно — введите счётчик строк и пропускайте строку с номером 1 внутри цикла, что удобнее, если заголовков несколько.
Можно ли читать TXT файл без прав на внешние компоненты и в безопасном режиме?
Штатные объекты ЧтениеТекста и ТекстовыйДокумент — это механизмы платформы, а не внешние компоненты, поэтому они работают без дополнительных установок. Однако в безопасном режиме и при ограничении прав доступа к файловой системе операции с файлами могут быть запрещены настройками кластера или профиля безопасности — это решается на уровне администрирования.