Разработка и Конфигурация · 10 мин
Как создать текстовый файл в 1С
Как создать текстовый файл в 1С: объекты Текст, ЗаписьТекста и ЧтениеТекста, кодировки, работа на клиенте и сервере, примеры кода и разбор типичных ошибок.
Создание текстового файла — одна из базовых задач при разработке на платформе 1С:Предприятие. Текстовые файлы используются для выгрузки данных в банк (платёжные поручения), обмена с другими системами, формирования логов, экспорта печатных форм и передачи информации в программы, которые не поддерживают XML или JSON.
Во встроенном языке 1С есть несколько способов записать текст на диск: классический объект Текст, более гибкий ЗаписьТекста, а также потоковые механизмы для больших объёмов данных. Выбор зависит от того, где выполняется код (клиент или сервер), какая нужна кодировка и насколько велик файл.
Материал ориентирован на разработчиков и администраторов, работающих с управляемыми и обычными формами. Примеры кода приведены для версий платформы 8.3, но большинство конструкций работает и в 8.2.
Какие объекты 1С умеют создавать текстовые файлы
Платформа предлагает три основных инструмента записи текста. Объект Текст — самый старый: он позволяет добавлять строки в памяти и одним вызовом Записать() сохранить всё содержимое в файл. Он удобен для небольших файлов, но плохо контролирует кодировку и переводы строк.
Объект ЗаписьТекста — рекомендуемый вариант для большинства задач. Он позволяет явно указать кодировку (UTF-8, UTF-16, ANSI и другие), символ перевода строки и записывать данные порциями, что экономит память при формировании больших файлов.
Третий вариант — Поток и ЗаписьДанных, которые применяются для бинарных данных и сложных сценариев, например когда текст нужно одновременно сжать или отправить по HTTP. Для обычного текстового файла они избыточны.
Сравнение вариантов
Подходит для простых небольших файлов; ограничение — слабый контроль кодировки и переводов строк
Основной вариант: явная кодировка, пословная запись, работа на клиенте и сервере
Для больших объёмов и бинарных данных; избыточны для обычного текста
Создание файла через объект Текст
Объект Текст накапливает строки в памяти. Последовательность простая: создать объект, добавить строки методом ДобавитьСтроку(), затем записать результат методом Записать(), передав полный путь к файлу.
Док = Новый Текст;
Док.ДобавитьСтроку("Первая строка");
Док.ДобавитьСтроку("Вторая строка");
Док.Записать("C:\Temp\primer.txt");
Если файл с таким именем уже существует, он будет перезаписан без предупреждения. Если каталога C:\Temp не существует, метод вызовет исключение — каталог нужно создать заранее, например через СоздатьКаталог().
У объекта есть и метод Прочитать() для загрузки существующего файла, поэтому та же конструкция подходит для редактирования текста: прочитали, изменили строки, записали обратно.
Создание файла через ЗаписьТекста с указанием кодировки
Объект ЗаписьТекста создаётся с параметрами: путь к файлу, кодировка, признак добавления в конец файла. Кодировку задают через перечисление КодировкаТекста — наиболее востребованы UTF8, ANSI и OEM (последняя иногда нужна для старых банковских систем и DOS-программ).
Запись = Новый ЗаписьТекста("C:\Temp\vygruzka.txt", КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Номер;Сумма;Контрагент");
Запись.ЗаписатьСтроку("1;15000;ООО Ромашка");
Запись.Закрыть();
Метод ЗаписатьСтроку() добавляет перевод строки автоматически, а Записать() пишет текст без перевода — это удобно, когда строку собирают по частям. После завершения обязательно вызовите Закрыть(): до этого момента данные могут находиться в буфере, а файл остаётся заблокированным для других программ.
Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку(Содержимое);
Запись.Закрыть();Если нужно дописывать данные в существующий файл (например, вести журнал обмена), передайте третьим параметром значение Истина — тогда новые строки будут добавляться в конец, а не затирать содержимое.
Работа на клиенте и на сервере
Ключевой момент, который часто упускают: файл создаётся на том компьютере, где выполняется код. Если процедура с директивой &НаСервере записывает файл в C:\Temp, он появится на диске сервера 1С, а не у пользователя. В файловом режиме клиент и сервер совпадают, поэтому проблема незаметна, но в клиент-серверном варианте разница критична.
Типовой сценарий для управляемых форм выглядит так: на сервере формируется текст и помещается во временное хранилище (как строка или двоичные данные), затем на клиенте содержимое сохраняется через ПолучитьФайл() или диалог сохранения файла. Так пользователь сам выбирает, куда положить файл.
В веб-клиенте прямой доступ к файловой системе ограничен браузером. Запись произвольного файла на диск пользователя без диалога сохранения невозможна — это ограничение безопасности, а не дефект конфигурации. Для тонкого и толстого клиента рекомендуется подключать расширение работы с файлами, иначе каждая операция будет сопровождаться предупреждением.
Пошаговый сценарий: выгрузка данных в текстовый файл
Типовая задача — выгрузить таблицу значений в файл с разделителями. Логика одинакова для большинства обменов: сформировать заголовок, перебрать строки, каждую преобразовать в текст и записать.
- 1Определите, где должен появиться файл: на сервере или у пользователя
- 2Создайте каталог при необходимости: СоздатьКаталог(Путь)
- 3Создайте объект ЗаписьТекста с нужной кодировкой
- 4Запишите строки в цикле методом ЗаписатьСтроку()
- 5Вызовите Закрыть() и при необходимости передайте файл на клиента
- 6Проверьте результат: откройте файл в редакторе, поддерживающем выбранную кодировку
Пример формирования строки с разделителями:
Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
СтрокаФайла = Строка(СтрокаТЗ.Номер) + ";"
+ Формат(СтрокаТЗ.Сумма, "ЧРД=.; ЧГ=0") + ";"
+ СтрокаТЗ.Контрагент;
Запись.ЗаписатьСтроку(СтрокаФайла);
КонецЦикла;
Обратите внимание на форматирование чисел: по умолчанию 1С может выводить разделитель групп разрядов (неразрывный пробел), который сломает импорт в сторонней системе. Функция Формат() с параметром ЧГ=0 убирает группировку.
Проверка результата и типичные ошибки
После записи убедитесь, что файл действительно создан и читается корректно. Программно проверить существование файла можно через объект Файл и его метод Существует(). Визуальную проверку делайте в редакторе, который показывает кодировку, — стандартный Блокнот не всегда корректно определяет UTF-8 без BOM.
Как проверить результат
Файл существует и имеет ненулевой размер
Файла нет или размер 0 байт — запись не выполнилась
Русский текст читается в редакторе
Кракозябры — несовпадение кодировки записи и просмотра
Каждая запись на отдельной строке
Весь текст в одну строку — использован Записать() вместо ЗаписатьСтроку()
Отдельная группа ошибок связана с правами доступа. Учётная запись, под которой работает сервер 1С (обычно USR1CV8), должна иметь права на запись в целевой каталог. Если обмен работает в файловом режиме, но перестаёт работать после перехода на клиент-серверный вариант, почти всегда причина именно в правах сервисной учётной записи.
Ограничения и альтернативные подходы
Текстовый формат прост, но не всегда оптимален. Если принимающая система поддерживает структурированные форматы, рассмотрите XML или JSON: в 1С для них есть объекты ЗаписьXML и ЗаписьJSON, которые избавляют от ручной сборки строк и проблем с экранированием спецсимволов.
Для очень больших выгрузок (сотни тысяч строк) запись через ЗаписьТекста работает стабильно, но формирование строк через конкатенацию может стать узким местом. В таких случаях собирайте строку через массив с последующим СтрСоединить() — это заметно быстрее многократного сложения строк.
Если файл нужен только как промежуточный, используйте ПолучитьИмяВременногоФайла(): платформа сама сгенерирует уникальное имя во временном каталоге, и вам не придётся заботиться о коллизиях имён при параллельной работе пользователей.
Частые вопросы
Как создать текстовый файл на компьютере пользователя, если код выполняется на сервере?
Сформируйте текст на сервере, поместите его (или двоичные данные файла) во временное хранилище методом ПоместитьВоВременноеХранилище(), верните адрес хранилища в клиентскую процедуру и сохраните файл через ПолучитьФайл() или диалог сохранения. Прямая запись с сервера на диск клиента невозможна.
Какую кодировку выбрать для выгрузки в банк-клиент?
Требования зависят от конкретной банковской системы: одни принимают UTF-8, другие — только ANSI (Windows-1251) или OEM (866). Уточните формат в документации банка и задайте кодировку явно при создании ЗаписьТекста, не полагаясь на значение по умолчанию.
Почему после записи файл пустой, хотя ошибок не было?
Наиболее вероятная причина — не вызван метод Закрыть(), и данные остались в буфере. Также проверьте, в ту ли папку смотрите: в клиент-серверном режиме файл мог создаться на сервере. Реже встречается ситуация, когда запись идёт в переменную другого объекта, а в файл не попадает ни одной строки из-за пустой таблицы-источника.
Как дописать строки в существующий файл, не стирая его содержимое?
При создании объекта ЗаписьТекста передайте третьим параметром Истина: Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8, Истина). Тогда новые строки добавятся в конец файла. Без этого параметра файл перезаписывается полностью.
Можно ли создать текстовый файл в веб-клиенте?
Напрямую записать файл на диск пользователя из веб-клиента нельзя — это ограничение безопасности браузера. Рабочий вариант: сформировать содержимое на сервере, передать его на клиент и инициировать сохранение через диалог, чтобы пользователь сам выбрал место и имя файла.
Чем ЗаписьТекста лучше объекта Текст?
ЗаписьТекста даёт явный контроль над кодировкой и переводами строк, позволяет дописывать в существующий файл и не требует держать весь текст в памяти. Объект Текст проще, но пригоден в основном для небольших файлов, где кодировка не критична.
Что важно запомнить
Для создания текстового файла в 1С используйте ЗаписьТекста с явно заданной кодировкой и обязательным Закрыть(). Учитывайте, где выполняется код: в клиент-серверном режиме файл создаётся на сервере, а на клиент его передают через временное хранилище. Проверяйте права на каталог, формат чисел и кодировку принимающей системы.