Разработка и Конфигурация · 13 мин
Как прочитать текстовый файл в 1С: пошаговая инструкция с примерами
Как прочитать текстовый файл в 1С: объект ЧтениеТекста, построчное чтение, кодировки UTF-8 и ANSI, работа на сервере и клиенте, типичные ошибки и готовые примеры кода.
Чтение текстовых файлов — одна из самых частых задач при интеграции 1С с внешними системами: загрузка выписок из банка, импорт прайсов поставщиков, разбор CSV-выгрузок, обработка логов и ответов веб-сервисов. Во встроенном языке 1С для этого предусмотрен специальный объект ЧтениеТекста, который позволяет читать файл целиком или построчно, контролировать кодировку и корректно освобождать ресурсы.
Ниже разобраны основные способы чтения: построчный разбор больших файлов, чтение целиком, выбор кодировки, особенности работы на клиенте и на сервере, а также типичные ошибки, из-за которых файл «не находится» или читается «крякозябрами». Все примеры приведены на встроенном языке 1С и подходят для управляемых форм и внешних обработок.
Объект ЧтениеТекста: базовый принцип работы
Объект ЧтениеТекста предназначен для последовательного чтения текстовых файлов. Он создаётся конструктором Новый ЧтениеТекста(ИмяФайла, Кодировка), после чего файл открывается и остаётся занятым до вызова метода Закрыть(). Пока файл открыт, другие процессы могут не получить к нему доступ на запись, поэтому забывать закрывать файл нельзя.
Минимальный рабочий пример выглядит так:
Чтение = Новый ЧтениеТекста("C:\Данные\import.txt", КодировкаТекста.UTF8);
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
// обработка строки
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
Метод ПрочитатьСтроку() возвращает очередную строку файла без символов перевода строки. Когда данные закончились, метод возвращает Неопределено — именно это условие используется для выхода из цикла. Проверка «пустая строка» здесь не подходит: пустые строки внутри файла — нормальное явление, и по ним цикл останавливать нельзя.
Построчное чтение больших файлов
Построчное чтение — основной сценарий при обработке выгрузок большого объёма: банковских выписок, каталогов товаров, файлов обмена. Файл не загружается в память целиком, поэтому объём практически не ограничен — узким местом становится только логика разбора каждой строки.
Типовой шаблон обработки с подсчётом строк:
Функция ПрочитатьФайлПострочно(ИмяФайла)
Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
НомерСтроки = 0;
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
НомерСтроки = НомерСтроки + 1;
Если СокрЛП(Строка) = "" Тогда
Строка = Чтение.ПрочитатьСтроку();
Продолжить;
КонецЕсли;
// разбор строки: например, разделитель ";"
Части = СтрРазделить(Строка, ";");
// ... запись в справочник или документ
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
Возврат НомерСтроки;
КонецФункции
Обратите внимание: СтрРазделить() доступна в актуальных версиях платформы; в старых релизах приходилось разбирать строку вручную через Найти() и Лев()/Сред(). Если обработка должна работать на разных версиях платформы, проверьте доступность функции в режиме совместимости вашей конфигурации.
- 1Создайте объект: Новый ЧтениеТекста(Путь, Кодировка)
- 2Прочитайте первую строку методом ПрочитатьСтроку()
- 3Организуйте цикл Пока Строка <> Неопределено
- 4Внутри цикла обработайте строку и прочитайте следующую
- 5После цикла вызовите Чтение.Закрыть()
- 6Проверьте результат: количество обработанных строк совпадает с ожидаемым
Чтение файла целиком
Если файл небольшой — настройки, JSON-ответ, короткий скрипт, шаблон — удобнее прочитать его целиком методом Прочитать(). Метод возвращает всё содержимое одной строкой, включая символы перевода строк.
Чтение = Новый ЧтениеТекста("C:\Данные\settings.json", КодировкаТекста.UTF8);
ТекстЦеликом = Чтение.Прочитать();
Чтение.Закрыть();
Полученную строку дальше можно передать в ЧтениеJSON, разобрать регулярными заменами или разбить на строки через СтрРазделить(ТекстЦеликом, Символы.ПС). Однако для файлов в десятки и сотни мегабайт такой подход не подходит: вся строка размещается в памяти, что приводит к замедлению и возможной ошибке нехватки памяти на сервере.
Альтернатива: объект ТекстовыйДокумент
Для простых задач существует старый объект ТекстовыйДокумент с методом Прочитать(ИмяФайла). Он загружает файл целиком и позволяет обращаться к строкам по номеру через ПолучитьСтроку(Номер). Это удобно, когда нужен произвольный доступ к строкам, но объект не даёт явного управления кодировкой при чтении в тонком клиенте и хуже подходит для больших файлов. В новых разработках предпочтительнее ЧтениеТекста.
Сравнение способов чтения
Подходит для больших файлов и потоковой обработки; минимальный расход памяти, но только последовательный доступ
Подходит для маленьких файлов (JSON, настройки); весь файл в памяти одной строкой
Подходит, когда нужен доступ к строкам по номеру; загружает файл целиком, слабый контроль кодировки
Кодировка: почему текст читается «крякозябрами»
Самая частая проблема при чтении текстовых файлов — неверная кодировка. Если при создании объекта кодировку не указать, платформа использует значение по умолчанию (обычно системную ANSI), и файл в UTF-8 отобразится нечитаемыми символами. Обратная ситуация тоже встречается: файл сохранён в Windows-1251, а читается как UTF-8.
Кодировка задаётся вторым параметром конструктора через системное перечисление КодировкаТекста:
КодировкаТекста.UTF8— стандарт для обмена, JSON, большинства современных выгрузок;КодировкаТекста.ANSI— системная кодировка Windows (для русской локали — Windows-1251);КодировкаТекста.UTF16— файлы, сохранённые как «Юникод» в Блокноте;КодировкаТекста.OEM— кодировка DOS (866), встречается в старых выгрузках.
Надёжный приём — открыть файл в редакторе, который показывает кодировку (например, Notepad++), и указать именно её. Если источник файла неизвестен, можно сделать эвристику: прочитать файл как UTF-8 и проверить наличие «кракозябр» или символа замены, а при неудаче перечитать как ANSI. Универсальной функции автоопределения кодировки в платформе нет.
Чтение файла на клиенте и на сервере
В клиент-серверном режиме важно понимать, где физически находится файл. Код, выполняющийся на сервере 1С, видит только диски сервера — файл C:\Данные\import.txt с компьютера пользователя серверу недоступен. Это причина ошибки «файл не обнаружен» даже при правильном пути.
Стандартная схема загрузки файла от пользователя в управляемом приложении:
- На клиенте пользователь выбирает файл через диалог или перетаскивание.
- Файл помещается во временное хранилище методом
НачатьПомещениеФайлаВХранилище(асинхронно) илиПоместитьФайл(синхронно, если разрешён). - Адрес хранилища передаётся в серверную процедуру.
- На сервере данные извлекаются через
ПолучитьИзВременногоХранилища, сохраняются во временный файл (ПолучитьИмяВременногоФайла("txt")) и читаются черезЧтениеТекста. - Временный файл удаляется после обработки.
&НаСервере
Процедура ОбработатьНаСервере(АдресХранилища)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяВременного = ПолучитьИмяВременногоФайла("txt");
ДвоичныеДанные.Записать(ИмяВременного);
Чтение = Новый ЧтениеТекста(ИмяВременного, КодировкаТекста.UTF8);
// ... построчная обработка
Чтение.Закрыть();
УдалитьФайлы(ИмяВременного);
КонецПроцедуры
Если файл уже лежит в сетевой папке, доступной серверу, можно читать его напрямую по UNC-пути вида \\server\share\file.txt. Убедитесь, что у пользователя, под которым работает служба агента сервера 1С, есть права на эту папку — это частая причина «невидимых» файлов.
Как выбрать способ чтения
Проверки, ошибки и безопасная обработка
Перед открытием файла полезно проверить его существование объектом Файл: ФайлНаДиске = Новый Файл(Путь); Если Не ФайлНаДиске.Существует() Тогда .... Это позволяет выдать понятное сообщение пользователю вместо системного исключения.
Само чтение стоит оборачивать в Попытка...Исключение, чтобы гарантированно закрыть файл и удалить временные копии даже при ошибке разбора:
Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
Попытка
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
// обработка
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
КонецПопытки;
Отдельная зона риска — запись прочитанных данных в базу. Если загрузка создаёт документы или элементы справочников, выполняйте её в транзакции, чтобы при сбое на середине файла не осталось «половины» данных. Для повторных загрузок предусмотрите поиск существующих элементов по ключевым полям, иначе каждый запуск будет плодить дубли.
Проверка результата и отладка
После чтения полезно контролировать результат простыми показателями: количество прочитанных строк, количество успешно обработанных и отклонённых записей. Выводите эти числа пользователю через Сообщить() — это сразу показывает, дошёл ли разбор до конца файла.
Для отладки удобно выводить первые несколько строк файла в сообщения до начала загрузки: так видно и кодировку, и реальный разделитель колонок, и наличие строки заголовка, которую нужно пропустить. Часто выгрузки содержат шапку, и если её не отфильтровать, первая «запись» окажется мусорной.
Как проверить результат
Кириллица читается, разделители соответствуют ожидаемым
Нечитаемые символы — неверная кодировка; столбцы «слиплись» — другой разделитель
Число обработанных строк равно количеству строк в файле минус служебные
Счётчик остановился раньше — цикл прервался на пустой строке или ошибке
Файл можно открыть и изменить в других программах
Файл заблокирован — не вызван Закрыть()
Количество созданных элементов соответствует числу валидных строк, дублей нет
Дубли при повторном запуске — нет поиска существующих элементов
Перед написанием загрузки откройте проблемный файл в редакторе с отображением кодировки и символов конца строки. Половина ошибок импорта — это не код, а неожиданный формат: другой разделитель, BOM в начале файла, смешанные переводы строк CRLF и LF. Пять минут осмотра файла экономят часы отладки.
Частые вопросы
Как прочитать CSV-файл в 1С?
CSV читается тем же объектом ЧтениеТекста построчно, а каждая строка разбивается через СтрРазделить(Строка, ";") — в русскоязычных выгрузках разделителем обычно служит точка с запятой, а не запятая. Учтите, что значения могут содержать разделитель внутри кавычек; в этом случае простого разделения недостаточно и строку нужно разбирать посимвольно с учётом кавычек.
Что делать, если файл не находится, хотя путь правильный?
Проверьте, где выполняется код: серверная процедура видит только диски и сетевые папки сервера, а не компьютер пользователя. Также проверьте права учётной записи службы сервера 1С на папку и используйте объект Файл с методом Существует() для диагностики.
Как определить кодировку файла перед чтением?
Автоматического определения в платформе нет. Практический способ — открыть файл в редакторе, отображающем кодировку (например, Notepad++), либо программно попробовать UTF-8 и проверить результат на наличие нечитаемых символов, при неудаче перечитав файл как ANSI.
Можно ли читать файл, не загружая его целиком в память?
Да, именно для этого предназначен метод ПрочитатьСтроку(): файл читается последовательно небольшими порциями, поэтому объём файла практически не влияет на потребление памяти. Это рекомендуемый способ для выгрузок большого размера.
Чем ЧтениеТекста отличается от ТекстовыйДокумент?
ЧтениеТекста работает потоково, позволяет явно указать кодировку и подходит для больших файлов, но даёт только последовательный доступ. ТекстовыйДокумент загружает файл целиком и позволяет обращаться к строкам по номеру, что удобно для маленьких файлов, но расходует больше памяти и хуже контролирует кодировку.
Как прочитать файл, выбранный пользователем в управляемой форме?
На клиенте поместите файл во временное хранилище (НачатьПомещениеФайлаВХранилище или ПоместитьФайл), передайте адрес в серверную процедуру, там извлеките двоичные данные, сохраните их во временный файл через ПолучитьИмяВременногоФайла и прочитайте объектом ЧтениеТекста. После обработки удалите временный файл.
Что важно запомнить
Основной инструмент чтения текстовых файлов в 1С — объект ЧтениеТекста: укажите путь и кодировку, читайте построчно для больших файлов или целиком для маленьких, всегда закрывайте файл и оборачивайте обработку в Попытка...Исключение. В клиент-серверном режиме передавайте файл на сервер через временное хранилище, а загрузку данных в базу выполняйте в транзакции с защитой от дублей.