Работа с внешними файлами — одна из самых частых задач в экосистеме 1С Предприятие. Пользователям часто требуется выгрузить прайс-листы, обменные курсы или логи ошибок в простой текстовый формат для дальнейшей обработки. Разработчикам же необходимо понимать, как программно создать txt файл, записать в него данные и корректно завершить работу с потоком. В этой статье мы разберем все нюансы создания текстовых файлов, от нажатия кнопки в интерфейсе до написания кода на встроенном языке.
Процесс создания файла зависит от того, кто именно выполняет действие: конечный пользователь или программист. Для обычного пользователя конфигурация уже должна содержать функционал выгрузки, тогда как разработчику предстоит реализовать этот механизм с нуля. Важно понимать разницу между объектами файловой системы и методами записи, чтобы избежать ошибок блокировки или потери данных.
Мы рассмотрим оба сценария подробно. Особое внимание уделим кодировкам, так как именно несовпадение кодировок (например, Windows-1251 и UTF-8) чаще всего приводит к тому, что вместо читаемого текста вы получаете набор непонятных символов.
Создание текстового файла через интерфейс пользователя
В стандартных конфигурациях, таких как 1С Бухгалтерия или 1С Управление торговлей, создание файла обычно скрыто за кнопкой «Выгрузить» или «Сохранить». Однако иногда требуется сохранить произвольный отчет или список в формате .txt. Для этого в режиме предприятия часто используется стандартный диалог сохранения.
Когда вы нажимаете кнопку выгрузки, система предлагает выбрать тип файла. Если вам нужен именно текстовый документ, убедитесь, что в поле «Тип файла» выбрано значение Текстовый документ. После этого укажите путь на диске. Система автоматически создаст файл с расширением .txt и запишет в него сформированный отчет.
Если стандартный интерфейс не позволяет выбрать формат, можно воспользоваться хитростью: выгрузите данные в MXL или HTML, откройте их в браузере или редакторе и сохраните как текст. Но это лишний шаг. Гораздо эффективнее настроить выгрузку правильно.
- 📂 Всегда проверяйте расширение файла перед сохранением, чтобы не получить сюрприз в виде
.xmlвместо.txt. - 💾 Убедитесь, что у вас есть права на запись в выбранную папку, иначе система выдаст ошибку доступа.
- 🔤 Обратите внимание на кодировку в окне сохранения, если она доступна для выбора пользователю.
⚠️ Внимание: При сохранении файлов в сетевые папки убедитесь, что сетевой диск подключен корректно. Попытка сохранить файл по пути, который виден только локально на сервере 1С, приведет к ошибке «Файл не найден».
Программное создание файла: объект ФайлМенеджер
Для разработчиков создание txt файла начинается с работы с объектом ФайлМенеджер. Это универсальный инструмент для проверки существования файла, получения его имени и создания нового экземпляра. Перед записью данных необходимо убедиться, что путь корректен.
Создание самого файла происходит неявно в момент получения объекта записи. Вам не нужно вызывать отдельную команду «Создать». Достаточно указать путь и вызвать метод ПолучитьПотокДляЗаписи(). Если файл существует, он будет перезаписан, если нет — создан заново.
Важно различать тонкий и толстый клиент. В тонком клиенте прямая работа с файловой системой клиента возможна только через диалоги или специальные механизмы, тогда как на сервере 1С пути должны быть абсолютными и доступными серверу.
Процедура СоздатьТекстовыйФайл()
ИмяФайла = "C:\Reports\log.txt";
Файл = Новый Файл(ИмяФайла);
// Проверка существования не обязательна для создания, но полезна для логики
КонецПроцедуры
Используйте функцию КаталогВременныхФайлов() для создания временных отчетов, которые не нужно хранить постоянно. Это предотвратит засорение диска пользователя.
При работе с путями используйте символы / или \ в соответствии с операционной системой, хотя 1С часто автоматически конвертирует их. Однако для кроссплатформенности (Linux серверы) лучше использовать универсальные методы получения путей.
Запись данных: ТекстовыйДокумент и ЗаписьТекста
Самый современный и рекомендуемый способ записи текста — использование объекта ЗаписьТекста. Он пришел на смену устаревшему ТекстовыйДокумент и обеспечивает лучшую работу с кодировками и буферизацией. Этот объект позволяет писать данные строка за строкой или большими блоками.
Для инициализации записи вам понадобится поток. Вы создаете поток для записи в файл, а затем передаете его в конструктор ЗаписьТекста. Здесь же можно указать нужную кодировку, например, UTF-8 или Windows-1251, что критически важно для корректного отображения кириллицы.
Метод ЗаписатьСтроку() автоматически добавляет символ перевода строки в конце. Если вам нужно записать данные без перехода на новую строку, используйте метод Записать(). Это полезно при формировании CSV-файлов, где разделители стоят в одной строке.
- 📝 Используйте
ЗаписьТекстадля любых новых разработок, это стандарт платформы. - 🔥 Не забывайте вызывать метод
Закрыть()или использовать конструкциюПока...Циклс автоматическим закрытием потока. - 🛡️ Всегда указывайте кодировку явно, не полагайтесь на настройки по умолчанию.
Поток = Новый ПотокВПамяти();
Запись = Новый ЗаписьТекста(Поток, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Привет, мир!");
Запись.Закрыть();
⚠️ Внимание: Если вы не закроете объект
ЗаписьТекстаили поток, файл может остаться заблокированным операционной системой. Другие процессы не смогут прочитать его до перезапуска 1С.
☑️ Чек-лист правильной записи файла
Работа с кодировками и спецсимволами
Проблема «кракозябр» в текстовых файлах — классика жанра в 1С. Она возникает, когда файл, созданный в одной кодировке (например, UTF-8 без BOM), открывается в программе, ожидающей другую (например, ANSI). Для корректного создания txt файла с русским текстом необходимо явно управлять этим параметром.
Объект ЗаписьТекста позволяет передать параметр КодировкаТекста. Наиболее универсальным вариантом сегодня является UTF8. Однако, если файл предназначен для открытия в старом Блокноте Windows или импорта в старую бухгалтерскую программу, может потребоваться Win1251.
Особое внимание уделите символу BOM (Byte Order Mark). Это специальная метка в начале файла, указывающая на кодировку. Некоторые системы не умеют читать файлы с BOM, считая первые три байта мусором. В 1С можно управлять добавлением BOM через параметр конструктора.
| Кодировка | Описание | Рекомендация |
|---|---|---|
UTF8 |
Универсальная, поддерживает все языки | Использовать по умолчанию для веба и новых систем |
Win1251 |
Стандартная для Windows (кириллица) | Для совместимости со старым ПО и Excel |
UTF8NoBOM |
UTF-8 без метки порядка байт | Для скриптов и конфигов, чувствительных к заголовку |
Что такое BOM и почему он мешает?
BOM (Byte Order Mark) — это последовательность байтов в начале файла, которая сообщает программе о кодировке текста. В UTF-8 это байты EF BB BF. Некоторые парсеры (например, в PHP или старые импортеры 1С) не ожидают эти байты и воспринимают их как часть текста, из-за чего первая строка файла «ломается» или отображается некорректно.
При чтении файлов ситуация обратная: если вы не укажете кодировку при чтении, 1С попытается угадать её автоматически. Это работает не всегда надежно. Поэтому правило простое: при записи указывайте кодировку явно, и при чтении указывайте ту же самую.
Особенности работы в файловом и клиент-серверном варианте
Архитектура 1С Предприятие накладывает серьезные ограничения на работу с файлами. В файловом варианте базы данных код выполняется на компьютере пользователя, поэтому пути вида C:\Users\... работают корректно. Вы можете легко создать файл на рабочем столе.
В клиент-серверном варианте (SQL) код часто выполняется на стороне сервера 1С. Сервер не имеет доступа к диску вашего локального компьютера. Попытка сохранить файл по пути C:\Temp\file.txt приведет к созданию файла на диске сервера, а не клиента. Пользователь этого файла не увидит.
Для решения этой проблемы в тонком клиенте используется механизм НачатьПомещениеФайла или сохранение через диалог выбора файла, который инициирует клиентское приложение. Либо файл сохраняется во временную папку сервера, а затем пользователю предлагается ссылка на скачивание.
⚠️ Внимание: Никогда не используйте жестко заданные локальные пути (например,
D:\Export\) в коде, который выполняется на сервере. Используйте переменные окружения или настройки констант для определения путей.
Главное правило: код на сервере видит только диски сервера. Чтобы файл появился у пользователя, его нужно явно передать на клиент или сохранить в общедоступную сеть.
Частые ошибки и методы отладки
При создании текстовых файлов разработчики часто сталкиваются с ошибками доступа. Самая распространенная причина — файл уже открыт в другой программе (например, в Excel). Операционная система блокирует файл для записи, и 1С выбрасывает исключение.
Вторая частая ошибка — отсутствие прав на запись в корень диска или системные папки. Всегда старайтесь сохранять файлы в папки документов или специальные каталоги для обмена. Используйте конструкцию Попытка...Исключение для перехвата ошибок и вывода понятного сообщения пользоватelu.
Также стоит помнить о лимитах на длину строки. Хотя текстовый формат гибкий, некоторые внешние системы имеют ограничения на количество символов в строке (например, 255 или 32767 символов). При формировании выгрузок для сторонних сервисов уточняйте эти требования в документации.
- 🚫 Ошибка «Файл занят» решается закрытием файла во всех других приложениях.
- 📁 Ошибка «Отказано в доступе» требует проверки прав пользователя Windows.
- 📉 Ошибка переполнения буфера возникает при попытке записать гигантский массив данных одной строкой.
Для отладки используйте вывод имен файлов и путей в журнал регистрации или во временный лог-файл. Это поможет понять, куда именно система пытается сохранить данные и почему операция завершается неудачей.
Можно ли создать txt файл без использования кода?
Да, если в вашей конфигурации есть обработка «Универсальный обмен данными» или аналогичные инструменты. Также можно использовать внешние обработки, скачанные из сообщества ИТС, которые позволяют выгружать произвольные выборки в текст.
Как открыть txt файл, созданный в 1С, в Excel?
В Excel выберите «Данные» → «Получить данные» → «Из текста/CSV». При импорте обязательно укажите ту же кодировку, которая использовалась при создании файла в 1С, и выберите правильный разделитель (точка с запятой или табуляция).
Почему файл создается пустым?
Скорее всего, вы забыли вызвать метод Закрыть() у объекта записи. Данные могут оставаться в буфере и не записываться на диск до момента закрытия потока. Также проверьте, не происходит ли ошибка в цикле записи до того, как данные успевают попасть в буфер.
Как добавить дату в имя создаваемого файла?
Используйте функцию Формат() для текущей даты. Пример кода: ИмяФайла = "Отчет_" + Формат(ТекущаяДата(), "ДФ=ddMMyyyy") + ".txt". Это позволит создавать уникальные файлы для каждого дня.
В чем разница между ТекстовыйДокумент и ЗаписьТекста?
ТекстовыйДокумент — это устаревший объект, который менее гибок в работе с кодировками и потоками. ЗаписьТекста — современный объект, работающий напрямую с потоками, поддерживающий асинхронность и более точный контроль над байтовым представлением данных.