Работа с внешними данными — одна из самых частых задач в разработке под 1С:Предприятие. Часто возникает необходимость загрузить информацию из простых текстовых файлов формата .txt, .csv или log. Несмотря на кажущуюся простоту, процесс чтения требует внимания к деталям, таким как кодировка, способ разбора строк и управление памятью.

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

В этом материале мы разберем все актуальные способы чтения, сравним их производительность и рассмотрим типичные ошибки, с которыми сталкиваются разработчики при парсинге текста.

Чтение через объект метаданных "Текстовый документ"

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

Для начала работы необходимо создать новый объект и вызвать метод Прочитать. Важно понимать, что этот метод синхронный и может заблокировать интерфейс при работе с большими файлами (более 10-20 Мб).

Код для инициализации выглядит следующим образом:

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

// Путь к файлу должен быть абсолютным или относительным к каталогу данных

Текст.Прочитать("C:\Data\import.txt");

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

⚠️ Внимание: Объект ТекстовыйДокумент хранит всё содержимое файла в оперативной памяти целиком. При чтении логов размером в несколько гигабайт это может привести к аварийному завершению работы клиента 1С из-за нехватки памяти.

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

💡

Используйте ТекстовыйДокумент только если вам нужно показать содержимое файла пользователю в окне просмотра перед обработкой.

Использование класса ЧтениеТекста для потоковой обработки

Для профессиональной разработки в 1С стандартом де-факто стал класс ЧтениеТекста. Он позволяет читать файл построчно, не загружая его полностью в память. Это критически важно для производительности.

Процесс начинается с открытия файла. Вы можете явно указать кодировку, например КодировкаТекста.UTF8, чтобы избежать проблем с кириллицей. Если кодировка не указана, система попытается определить её автоматически, что не всегда срабатывает корректно.

Цикл чтения реализуется через метод ЧитатьСтроку(), который возвращает Истина, пока есть данные:

Чтение = Новый ЧтениеТекста;

Чтение.ОткрытьФайл("C:\Data\data.csv", КодировкаТекста.UTF8);

Пока Чтение.ЧитатьСтроку() Цикл

Строка = Чтение.ТекущаяСтрока;

// Здесь логика обработки строки

КонецЦикла;

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

Обратите внимание на обязательный вызов метода Закрыть в конце. Хотя сборщик мусора 1С eventually освободит ресурсы, явное закрытие потока — признак хорошего тона и гарантия отсутствия блокировок файла операционной системой.

📊 Какой способ чтения файлов вы используете чаще?
ТекстовыйДокумент
ЧтениеТекста
ФайловыйПоток
ЧтениеJSON

Работа с кодировками и разделителями

Одна из самых частых проблем при импорте — "кракозябры" вместо русских букв. Это происходит из-за несоответствия кодировки исходного файла и той, которую ожидает 1С. Чаще всего встречаются UTF-8 и Windows-1251.

Класс ЧтениеТекста позволяет гибко управлять этим параметром. Вы можете передать константу кодировки вторым аргументом в метод ОткрытьФайл. Также существует возможность чтения с разделителями, что удобно для CSV-файлов.

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

  • 📂 Укажите правильный путь к файлу, используя слэши (/) или двойные обратные слэши (\\).
  • 🔤 Всегда явно задавайте КодировкаТекста, если файл пришел из внешней системы (Linux, Web).
  • ⚙️ Используйте метод УстановитьРазделительСтрок, если в файле используются нестандартные переносы строк (например, только LF без CR).

Если вы работаете с файлами, созданными в старых версиях Windows, скорее всего, вам понадобится кодировка Windows-1251. Для файлов из веб-сервисов или мобильных приложений стандартом является UTF-8 без BOM.

Тип кодировки Описание Где встречается
UTF8 Универсальная, поддерживает все языки Веб, Linux, современные CRM
Windows1251 Однобайтная, только кириллица и латиница Старые отчеты 1С 7.7, Windows Notepad
UTF16 Двухбайтная, большой размер файла Системные логи Windows
ASCI Только базовые символы латиницы Технические логи оборудования
💡

Недопустимо полагаться на автоматическое определение кодировки в промышленных решениях. Всегда требуйте спецификацию формата от поставщика данных.

Обработка ошибок и несуществующих файлов

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

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

Попытка

Чтение.ОткрытьФайл(ПутьКФайлу);

Исключение

Сообщить("Не удалось открыть файл: " + ОписаниеОшибки());

Возврат;

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

Также стоит проверять существование файла перед открытием с помощью объекта Файл. Метод Существует() вернет булево значение, что позволит избежать лишней попытки открытия и генерации исключения.

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

⚠️ Внимание: В режиме предприятия на клиенте прямые пути вида C:\... могут быть недоступны из соображений безопасности. Используйте диалог выбора файла или размещайте файлы в каталоге данных пользователя.

Сравнение производительности методов

Разница в скорости между ТекстовыйДокумент и ЧтениеТекста становится заметной уже на файлах объемом от 5 Мб. Для больших объемов данных (выгрузки товаров, прайс-листы) использование объектов метаданных недопустимо.

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

Ниже приведены примерные показатели времени обработки файла размером 50 Мб (1 миллион строк):

  • ТекстовыйДокумент: загрузка занимает 3-5 секунд, последующий перебор быстрый, но пик памяти высокий.
  • ЧтениеТекста: общее время 2-3 секунды, память стабильная, нет скачков потребления.
  • ФайловыйПоток (байтовый): самый быстрый, но требует ручного преобразования байтов в строки, что усложняет код.

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

Секрет высокой скорости

Буферизированное чтение в ЧтениеТекста происходит асинхронно на уровне ОС, пока 1С обрабатывает предыдущую строку, диск уже читает следующую порцию данных.

Практический пример: импорт справочника из CSV

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

Сначала подготовим массив для хранения временных данных. Затем организуем цикл чтения. Для разделения строки используем метод СтрРазделить. Важно пропустить заголовок файла, если он есть.

Процедура ЗагрузитьНоменклатуру(ПутьКФайлу)

Чтение = Новый ЧтениеТекста;

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

// Пропускаем заголовок

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

Пока Чтение.ЧитатьСтроку() Цикл

СтрокаДанных = СтрРазделить(Чтение.ТекущаяСтрока, ";");

Если СтрокаДанных.Количество() < 2 Тогда

Продолжить;

КонецЕсли;

Наименование = СтрокаДанных[0];

Артикул = СтрокаДанных[1];

// Логика создания элемента

// ...

КонецЦикла;

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

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

Такой подход обеспечивает гибкость. Вы можете добавлять проверки на дубликаты, валидацию артикулов и логирование ошибок прямо внутри цикла обработки.

☑️ Чек-лист перед запуском импорта

Выполнено: 0 / 5

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

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

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

Можно ли читать текстовый файл на мобильном клиенте 1С?

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

В чем разница между ЧтениеТекста и ФайловыйПоток?

ЧтениеТекста работает сразу со строками и учитывает кодировку. ФайловыйПоток работает с байтами. Поток быстрее, но вам придется вручную конвертировать байты в строки, что сложно при работе с многобайтовыми кодировками типа UTF-8.

Как обработать файл, который постоянно дописывается (лог-файл)?

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

Почему метод Прочитать выдает ошибку "Файл не найден"?

Проверьте путь. В 1С разделители пути могут быть как \, так и /. Убедитесь, что файл физически существует по этому адресу с точки зрения того процесса, который выполняет код (сервер 1С или клиент).