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

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

Как получить текст файла в 1С

Как программно прочитать текстовый файл в 1С: объект ЧтениеТекста, чтение построчно и целиком, кодировки, обработка ошибок и практические примеры кода.

Чтение текстового файла — одна из базовых задач при обмене данными в 1С: загрузка прайсов, выписок банка, логов, CSV-выгрузок и конфигурационных файлов. Платформа 1С:Предприятие предоставляет несколько встроенных механизмов для этого, и основной из них — объект ЧтениеТекста.

Объект позволяет прочитать файл целиком одной строкой, построчно в цикле или блоками заданного размера. При этом важно правильно указать кодировку: большинство ошибок «кракозябры» вместо русского текста возникает именно из-за несоответствия кодировки файла и параметра чтения.

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

Объект ЧтениеТекста: основа работы с файлами

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

Базовый пример чтения файла целиком:

Чтение = Новый ЧтениеТекста("C:\Данные\price.txt", КодировкаТекста.UTF8);

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

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

Сообщить(ТекстФайла);

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

Построчное чтение файла в цикле

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

Чтение = Новый ЧтениеТекста("C:\Данные\vypiska.txt", КодировкаТекста.ANSI);

Строка = Чтение.ПрочитатьСтроку();

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

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

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

Сообщить(Части[0]);

Строка = Чтение.ПрочитатьСтроку();

КонецЦикла;

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

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

Обратите внимание: пустые строки в файле возвращаются как пустая строка "", а не Неопределено. Если логика обработки зависит от пустых строк, проверяйте их явно через ПустаяСтрока(Строка).

Порядок действий при чтении файла
  1. 1
    Проверьте существование файла через объект Файл и метод Существует()
  2. 2
    Создайте объект ЧтениеТекста с путём и кодировкой
  3. 3
    Прочитайте данные: Прочитать() целиком или ПрочитатьСтроку() в цикле
  4. 4
    Обработайте полученные строки: разбор по разделителям, преобразование типов
  5. 5
    Вызовите Закрыть() для освобождения файла
  6. 6
    Проверьте результат: количество строк, отсутствие кракозябр

Кодировки: почему вместо текста кракозябры

Кодировка задаётся вторым параметром конструктора через системное перечисление КодировкаТекста. Наиболее используемые значения: UTF8, ANSI (windows-1251 для русской локали), OEM (cp866), UTF16. Если кодировку не указать, платформа попытается определить её автоматически, что не всегда даёт верный результат.

Типичная ситуация: банк выгружает выписку в ANSI (windows-1251), а файл читается как UTF-8 — вместо русских букв появляются нечитаемые символы. Обратная ситуация встречается при чтении файлов, выгруженных из Linux-систем или веб-сервисов: там чаще используется UTF-8.

Если кодировка файла заранее неизвестна, откройте файл в редакторе, который показывает кодировку (например, Notepad++ отображает её в строке состояния), и укажите соответствующее значение. Для файлов UTF-8 с BOM платформа обычно корректно определяет кодировку автоматически.

Сравнение способов чтения

Прочитать() целиком

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

ПрочитатьСтроку() в цикле

Универсальный вариант для файлов любого размера. Требует больше кода, но экономит память и позволяет прервать обработку.

ТекстовыйДокумент.Прочитать()

Удобен, когда результат нужен как ТекстовыйДокумент для отображения пользователю. Работает в интерактивном режиме и может вызывать диалоги.

Альтернатива: объект ТекстовыйДокумент

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

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

Текст.Прочитать("C:\Данные\price.txt", КодировкаТекста.UTF8);

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

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

КонецЦикла;

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

Проверка существования файла и обработка ошибок

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

ФайлНаДиске = Новый Файл("C:\Данные\price.txt");

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

ВызватьИсключение "Файл не найден: " + ФайлНаДиске.ПолноеИмя;

КонецЕсли;

Само чтение полезно оборачивать в конструкцию Попытка ... Исключение ... КонецПопытки, а в блоке исключения обязательно закрывать файл. Это особенно важно в регламентных заданиях: необработанная ошибка чтения оставит файл заблокированным, и следующая попытка обращения к нему завершится неудачей.

Отдельный риск — чтение файла, который в этот момент записывается другой программой. Файл может оказаться неполным или заблокированным. В обменах через каталоги принято договариваться о признаке готовности файла (например, наличии отдельного файла-флага) либо переносить файл во временное имя только после завершения записи.

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

В клиент-серверном режиме важно понимать, где физически находится файл. Код, выполняемый на сервере, видит только файловую систему сервера: путь C:\Данные\... будет указывать на диск сервера, а не компьютера пользователя. Если файл лежит у пользователя, его нужно передать на сервер.

Типовой подход — поместить файл во временное хранилище на клиенте (НачатьПомещениеФайлаВоВременноеХранилище или ПоместитьВоВременноеХранилище в управляемых формах), а на сервере извлечь данные из хранилища, записать во временный файл через ПолучитьИмяВременногоФайла() и уже его прочитать.

В тонком и веб-клиенте прямой доступ к файловой системе ограничен: для работы с файлами используются асинхронные методы с описанием оповещения. Синхронные вызовы ЧтениеТекста на клиенте работают только в толстом клиенте и при определённых настройках, поэтому в современных конфигурациях чтение обычно переносят на сервер.

Типичные ошибки и как их избежать

Большинство проблем при чтении текстовых файлов в 1С сводится к нескольким повторяющимся причинам. Знание их заранее экономит время отладки.

Первая группа ошибок — неверная кодировка, о которой сказано выше. Вторая — отсутствие вызова Закрыть(), из-за чего файл остаётся занятым процессом. Третья — разбор строк без проверки количества элементов после СтрРазделить(): если строка не содержит разделителя, обращение к Части[1] вызовет ошибку индекса.

Типичные ошибки
01
Не указана кодировка — русский текст читается кракозябрами. Укажите КодировкаТекста явно
02
Нет вызова Закрыть() — файл остаётся заблокированным для других процессов
03
Обращение к элементам массива после СтрРазделить без проверки их количества — ошибка индекса на нестандартной строке
04
Чтение большого файла методом Прочитать() — избыточный расход памяти, используйте построчное чтение
05
Серверный код ищет файл на диске C: пользователя — файл недоступен, нужна передача через временное хранилище

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

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

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

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

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

Читаемость текста
Норма

Русские буквы отображаются корректно

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

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

Количество строк
Норма

Совпадает с числом строк в файле

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

Строк меньше — возможно, файл не дочитан или обрезан при записи

Разбор по разделителю
Норма

Каждая строка даёт ожидаемое число полей

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

Строки с другим числом полей — нужна обработка исключений

Доступность файла после чтения
Норма

Файл можно открыть и удалить другой программой

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

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

Часто задаваемые вопросы

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

Создайте ЧтениеТекста без указания кодировки — платформа попытается определить её автоматически по сигнатуре BOM. Если автоматическое определение не помогло, откройте файл в редакторе, отображающем кодировку (например, Notepad++), узнайте её и укажите соответствующее значение КодировкаТекста в коде.

Чем отличается Прочитать() от ПрочитатьСтроку()?

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

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

Код, выполняемый на сервере 1С, работает с файловой системой сервера. Чтобы обработать файл пользователя, поместите его во временное хранилище на клиенте, передайте адрес хранилища в серверную процедуру, извлеките данные во временный файл на сервере и прочитайте его там.

Как обработать CSV-файл с разделителем-точкой с запятой?

Читайте файл построчно через ЧтениеТекста и разбивайте каждую строку функцией СтрРазделить(Строка, ";"). Перед обращением к элементам массива проверяйте их количество, потому что строки могут быть неполными или пустыми. Учтите, что значения могут содержать кавычки и разделители внутри текста — тогда потребуется более сложный разбор.

Нужно ли закрывать файл после чтения?

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

Можно ли читать файл частями заданного размера?

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

Итог

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

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