Работа с внешними данными — одна из самых частых задач в разработке под 1С:Предприятие. Часто возникает необходимость загрузить информацию из простых текстовых файлов формата .txt, .csv или log. Несмотря на кажущуюся простоту, процесс чтения требует внимания к деталям, таким как кодировка, способ разбора строк и управление памятью.
В платформе 1С версии 8.3 и выше существует несколько механизмов для этих целей. Выбор конкретного инструмента зависит от объема данных и сложности их структуры. Для небольших конфигураций подойдет работа через объект метаданных, а для высоконагруженных обменов лучше использовать низкоуровневые потоки.
В этом материале мы разберем все актуальные способы чтения, сравним их производительность и рассмотрим типичные ошибки, с которыми сталкиваются разработчики при парсинге текста.
Чтение через объект метаданных "Текстовый документ"
Самый наглядный и простой способ, знакомый многим по работе с отчетами, — использование объекта ТекстовыйДокумент. Этот метод идеально подходит, если файл нужно не только прочитать, но и визуально отобразить пользователю перед обработкой.
Для начала работы необходимо создать новый объект и вызвать метод Прочитать. Важно понимать, что этот метод синхронный и может заблокировать интерфейс при работе с большими файлами (более 10-20 Мб).
Код для инициализации выглядит следующим образом:
Текст = Новый ТекстовыйДокумент;
// Путь к файлу должен быть абсолютным или относительным к каталогу данных
Текст.Прочитать("C:\Data\import.txt");
После загрузки содержимое доступно построчно через свойство Текст или методом ПолучитьТекст. Однако, если ваша цель — автоматическая обработка данных без участия пользователя, этот подход считается избыточным с точки зрения потребления ресурсов.
⚠️ Внимание: Объект ТекстовыйДокумент хранит всё содержимое файла в оперативной памяти целиком. При чтении логов размером в несколько гигабайт это может привести к аварийному завершению работы клиента 1С из-за нехватки памяти.
Если файл имеет сложную структуру с форматированием, этот класс сохранит все отступы и шрифты. Но для обычного плоского текста лучше использовать специализированные классы чтения.
Используйте ТекстовыйДокумент только если вам нужно показать содержимое файла пользователю в окне просмотра перед обработкой.
Использование класса ЧтениеТекста для потоковой обработки
Для профессиональной разработки в 1С стандартом де-факто стал класс ЧтениеТекста. Он позволяет читать файл построчно, не загружая его полностью в память. Это критически важно для производительности.
Процесс начинается с открытия файла. Вы можете явно указать кодировку, например КодировкаТекста.UTF8, чтобы избежать проблем с кириллицей. Если кодировка не указана, система попытается определить её автоматически, что не всегда срабатывает корректно.
Цикл чтения реализуется через метод ЧитатьСтроку(), который возвращает Истина, пока есть данные:
Чтение = Новый ЧтениеТекста;
Чтение.ОткрытьФайл("C:\Data\data.csv", КодировкаТекста.UTF8);
Пока Чтение.ЧитатьСтроку() Цикл
Строка = Чтение.ТекущаяСтрока;
// Здесь логика обработки строки
КонецЦикла;
Чтение.Закрыть();
Обратите внимание на обязательный вызов метода Закрыть в конце. Хотя сборщик мусора 1С eventually освободит ресурсы, явное закрытие потока — признак хорошего тона и гарантия отсутствия блокировок файла операционной системой.
Работа с кодировками и разделителями
Одна из самых частых проблем при импорте — "кракозябры" вместо русских букв. Это происходит из-за несоответствия кодировки исходного файла и той, которую ожидает 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];
// Логика создания элемента
// ...
КонецЦикла;
Чтение.Закрыть();
КонецПроцедуры
Такой подход обеспечивает гибкость. Вы можете добавлять проверки на дубликаты, валидацию артикулов и логирование ошибок прямо внутри цикла обработки.
☑️ Чек-лист перед запуском импорта
Часто задаваемые вопросы (FAQ)
Как прочитать файл, если я не знаю его кодировку?
Попробуйте открыть файл через ЧтениеТекста без указания кодировки — система попытается угадать по BOM-маркеру. Если это не помогло, откройте файл в блокноте Notepad++ и посмотритеencoding, затем укажите соответствующую константу в коде 1С.
Можно ли читать текстовый файл на мобильном клиенте 1С?
Да, но с ограничениями. Мобильный клиент имеет доступ только к своей песочнице. Вы не можете указать путь C:\. Файл должен быть предварительно сохранен в каталог данных приложения или выбран через системный диалог.
В чем разница между ЧтениеТекста и ФайловыйПоток?
ЧтениеТекста работает сразу со строками и учитывает кодировку. ФайловыйПоток работает с байтами. Поток быстрее, но вам придется вручную конвертировать байты в строки, что сложно при работе с многобайтовыми кодировками типа UTF-8.
Как обработать файл, который постоянно дописывается (лог-файл)?
Вам нужно читать файл не в цикле Пока, а по таймеру или событию. Открывайте файл, считывайте позиции с последнего прочитанного байта, обрабатывайте новые строки и закрывайте. Не держите файл открытым постоянно, если он активно пишется другой программой.
Почему метод Прочитать выдает ошибку "Файл не найден"?
Проверьте путь. В 1С разделители пути могут быть как \, так и /. Убедитесь, что файл физически существует по этому адресу с точки зрения того процесса, который выполняет код (сервер 1С или клиент).