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