Текстовый файл из 1С:Предприятия: от кнопки «Сохранить» до выгрузки кодом

· 9 мин

Содержание

Создать txt файл в 1С можно двумя путями. Пользователь открывает отчёт или список и сохраняет его через кнопку с дискетой, выбрав тип «Текстовый документ (*.txt)». Разработчик пишет пару строк кода: Новый ТекстовыйДокумент, ДобавитьСтроку() и Записать(ИмяФайла, КодировкаТекста.UTF8).

Типичная ситуация: банк или контрагент просит выгрузку «в текстовом виде, через точку с запятой, в кодировке Windows-1251». Бухгалтер сохраняет отчёт, а получатель видит кракозябры. Ниже — оба пути работы с файлами в 1С и разбор того, где обычно ломается экспорт данных.

Сохранение в txt без программирования

Платформа 1С 8.3 умеет сохранять в текст любой табличный документ: отчёт, печатную форму, выведенный список.

Из отчёта или печатной формы:

  1. Сформируйте отчёт.
  2. Нажмите кнопку с дискетой «Сохранить» в командной панели отчёта. Если её не видно, откройте Главное меню (☰) → Файл → Сохранить как.
  3. В поле «Тип файла» выберите Текстовый документ (*.txt) или ANSI-текст (*.txt).
  4. Укажите папку и имя файла, нажмите «Сохранить».

Из любого списка (справочника, журнала документов):

  1. Откройте список и настройте отбор.
  2. Нажмите Ещё → Вывести список....
  3. Отметьте нужные колонки, выберите вывод в табличный документ.
  4. Сохраните получившуюся таблицу так же, как отчёт.

Пустой текстовый файл с нуля. В платформе есть встроенный редактор: Главное меню → Файл → Новый → Текстовый документ. Наберите или вставьте текст и сохраните его как .txt.

Тип при сохраненииКодировкаКогда выбирать
Текстовый документ (*.txt)UnicodeПолучатель — современная программа, сайт, сервис
ANSI-текст (*.txt)Windows-1251Старые банковские программы, загрузчики, Блокнот в старых Windows

Текстовый формат сохраняет только значения ячеек. Оформление, объединения и картинки пропадают. Колонки разделяются табуляцией, поэтому такой файл нормально открывается в Excel.

Объекты встроенного языка для работы с файлами

В требованиях к выгрузке иногда пишут про «объект ФайлМенеджер». Такого объекта в платформе 1С:Предприятие нет. Работа с файлами собрана из нескольких объектов и глобальных функций.

Объект или функцияДля чего
ТекстовыйДокументСобрать текст в памяти и записать файл целиком
ЗаписьТекстаПисать в файл построчно, потоком, с дописыванием
ФайлПроверить существование, узнать имя, расширение, размер
ПолучитьИмяВременногоФайла("txt")Получить уникальное имя во временном каталоге
КаталогВременныхФайлов()Путь к временной папке
СоздатьКаталог(), НайтиФайлы(), УдалитьФайлы()Операции с папками и файлами
ПоместитьВоВременноеХранилище()Передать готовый файл с сервера на клиент
ДиалогВыбораФайлаСпросить у пользователя, куда сохранить

Проверка, что файл уже есть, на сервере выглядит так:

ФайлНаДиске = Новый Файл("C:\Exchange\out.txt");
Если ФайлНаДиске.Существует() Тогда
    УдалитьФайлы(ФайлНаДиске.ПолноеИмя);
КонецЕсли;

На клиенте синхронный Существует() может быть запрещён настройками конфигурации. Там используют асинхронный вариант с описанием оповещения или выполняют проверку на сервере.

Как создать текстовый файл кодом: ТекстовыйДокумент

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

&НаСервере
Процедура СоздатьФайлНаСервере()

    Текст = Новый ТекстовыйДокумент;
    Текст.ДобавитьСтроку("Выгрузка от " + Формат(ТекущаяДатаСеанса(), "ДФ=dd.MM.yyyy"));
    Текст.ДобавитьСтроку("Организация: ООО Ромашка");
    Текст.ДобавитьСтроку("Всего строк: " + Формат(2, "ЧГ=0"));

    Текст.Записать("C:\Exchange\out.txt", КодировкаТекста.UTF8);

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

Полезные методы объекта:

  • 📝 ДобавитьСтроку(Строка) — новая строка в конец;
  • 🔁 ЗаменитьСтроку(НомерСтроки, Строка) — правка уже добавленной строки;
  • 🔢 КоличествоСтрок() и ПолучитьСтроку(Номер) — обход содержимого;
  • 📖 Прочитать(ИмяФайла, Кодировка) — обратная операция, загрузка txt в 1С;
  • 💾 Записать(ИмяФайла, Кодировка, РазделительСтрок) — сохранение.

Третий параметр Записать() задаёт перевод строки. Если получатель требует строго Windows-формат, передайте его явно: Символы.ВК + Символы.ПС.

Табличный документ записывается в txt без промежуточного текста: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.TXT). Для варианта Windows-1251 есть значение ANSITXT. Так выгружают результат отчёта на СКД по расписанию.

Построчная запись через ЗаписьТекста

Когда строк сотни тысяч, собирать их в памяти расточительно. ЗаписьТекста пишет поток прямо в файл: строка ушла — память освободилась.

Конструктор принимает параметры по порядку: имя файла, кодировку, разделитель строк, признак дописывания и разделитель строк в файле.

Пример: выгрузка контрагентов с ИНН в файл с разделителем «точка с запятой» в кодировке Windows-1251.

&НаСервере
Процедура ВыгрузитьКонтрагентов(ИмяФайла)

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Контрагенты.Наименование КАК Наименование,
    |    Контрагенты.ИНН КАК ИНН
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    НЕ Контрагенты.ПометкаУдаления";
    Выборка = Запрос.Выполнить().Выбрать();

    Запись = Новый ЗаписьТекста(ИмяФайла, "windows-1251");
    Попытка
        Запись.ЗаписатьСтроку("Наименование;ИНН");
        Пока Выборка.Следующий() Цикл
            Наименование = СтрЗаменить(Выборка.Наименование, ";", ",");
            Запись.ЗаписатьСтроку(СтрШаблон("%1;%2", Наименование, Выборка.ИНН));
        КонецЦикла;
        Запись.Закрыть();
    Исключение
        Запись.Закрыть();
        ВызватьИсключение;
    КонецПопытки;

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

Три приёма, без которых такая выгрузка ломается:

  1. Замена разделителя внутри данных. В названии вроде ООО «Север; Юг» точка с запятой разобьёт строку на лишние колонки. Её заменяют или берут значение в кавычки, если формат получателя это допускает.
  2. Закрыть() в любом случае. Пока объект не закрыт, хвост данных может остаться в буфере, а файл — занятым процессом 1С.
  3. Дописывание для журналов. Четвёртый параметр Истина добавляет строки в конец существующего файла, а не затирает его:
Лог = Новый ЗаписьТекста("C:\Exchange\exchange.log", КодировкаТекста.UTF8, , Истина);
Лог.ЗаписатьСтроку(Формат(ТекущаяДатаСеанса(), "ДЛФ=DT") + " Обмен завершён");
Лог.Закрыть();
ЗадачаТекстовыйДокументЗаписьТекста
Небольшой файл, нужна правка строк до записи✅—
Большая выгрузка из запросаРасход памяти растёт✅
Дописать в конец журналаЧитать и переписывать весь файл✅ параметр дописывания
Прочитать txt обратно✅ Прочитать()Для чтения есть ЧтениеТекста

Кодировка файла и спецсимволы

Почти все жалобы на «битый» txt — это несовпадение кодировки. 1С записала одну, программа получателя читает другую.

Значения перечисления КодировкаТекста:

  • 🌐 UTF8 — универсальный вариант для сайтов, API, современных программ;
  • 🏦 ANSI — системная кодировка Windows, для русской Windows это Windows-1251;
  • 💻 OEM — кодировка консоли DOS (cp866), нужна редко, для очень старых загрузчиков;
  • 📄 UTF16 — встречается в обменах с отдельными учётными системами;
  • ⚙️ Системная — кодировка операционной системы, где выполняется код.

Кроме перечисления, можно передать имя кодировки строкой: "windows-1251", "cp866", "utf-8". Строку удобно хранить в настройках обмена.

Метка BOM. При записи с КодировкаТекста.UTF8 в начало файла попадают три служебных байта (BOM). Блокнот и Excel их понимают. Некоторые загрузчики банков и сайты принимают первую строку из-за них за испорченную. Если получатель требует UTF-8 без BOM, срежьте эти байты после записи:

Данные = Новый ДвоичныеДанные(ИмяФайла);
Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Данные);
Если Буфер.Размер >= 3
    И Буфер[0] = 239 И Буфер[1] = 187 И Буфер[2] = 191 Тогда
    БезМетки = Буфер.Прочитать(3, Буфер.Размер - 3);
    ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(БезМетки).Записать(ИмяФайла);
КонецЕсли;

Байты 239, 187, 191 — это и есть BOM UTF-8 (EF BB BF). Буфер двоичных данных доступен в платформе 8.3.9 и новее.

Спецсимволы в строках:

Что вставитьКак в коде
ТабуляцияСимволы.Таб
Перевод строкиСимволы.ПС
Возврат кареткиСимволы.ВК
Кавычка внутри строкиУдвоить: "Текст ""в кавычках"""
Символ по кодуСимвол(9)

Символов вроде №, «» и длинного тире нет в cp866. В кодировке OEM они превратятся в знаки вопроса. Для ANSI (Windows-1251) эти символы допустимы.

Где окажется файл: файловый и клиент-серверный вариант

Главный вопрос при создании файла кодом — на каком компьютере выполняется запись. Путь C:\Exchange\out.txt в коде сервера и в коде клиента указывает на разные диски.

Вариант работыКод &НаСервере пишет файлПод какими правами
Файловая база, тонкий или толстый клиентНа компьютер пользователяУчётная запись пользователя Windows
Клиент-серверная базаНа сервер 1СУчётная запись службы сервера 1С (часто USR1CV8)
Веб-клиент или публикация на веб-сервереНа сервер, где выполняется серверный кодУчётная запись службы или веб-сервера

Отсюда правило: код на сервере создаёт файл на сервере, а не у бухгалтера. Чтобы файл попал пользователю, его передают через временное хранилище.

&НаСервереБезКонтекста
Функция ПодготовитьФайл(ИдентификаторФормы)
    ИмяФайла = ПолучитьИмяВременногоФайла("txt");
    Текст = Новый ТекстовыйДокумент;
    Текст.ДобавитьСтроку("Данные выгрузки");
    Текст.Записать(ИмяФайла, КодировкаТекста.UTF8);
    Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), ИдентификаторФормы);
    УдалитьФайлы(ИмяФайла);
    Возврат Адрес;
КонецФункции

&НаКлиенте
Процедура Выгрузить(Команда)
    Адрес = ПодготовитьФайл(УникальныйИдентификатор);
    Файлы = Новый Массив;
    Файлы.Добавить(Новый ОписаниеПередаваемогоФайла("vygruzka.txt", Адрес));
    НачатьПолучениеФайлов(Новый ОписаниеОповещения("ПослеПолученияФайла", ЭтотОбъект), Файлы, "", Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПолученияФайла(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
    // Файл сохранён пользователем
КонецПроцедуры

Последний параметр Истина открывает диалог выбора папки. Такой код работает в тонком клиенте и в веб-клиенте: браузер просто скачает файл. В новых релизах платформы есть и асинхронная функция ПолучитьФайлССервераАсинх с тем же назначением.

Сетевая папка обмена. Если файл должен лечь в \\fileserver\exchange, на сервере 1С права на эту папку нужны учётной записи службы, а не бухгалтеру. Подключённые буквы дисков (Z:\) служба не видит: указывайте полный UNC-путь.

В конфигурациях на БСП для отдачи файла пользователю удобно вызвать ФайловаяСистемаКлиент.СохранитьФайл. Процедура сама выбирает способ под тип клиента.

Ошибки при записи txt и как их отлаживать

Сообщение платформы при сбое записи обычно начинается с Ошибка при вызове метода контекста (Записать). Причину ищите во второй части текста.

Диагностика: выберите симптом

Как отлаживать:

  1. Оберните запись в Попытка ... Исключение и выведите полный текст: Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())).
  2. Перед записью выведите путь: Сообщить(ИмяФайла). Опечатку в имени папки так видно сразу.
  3. Поставьте точку останова в отладчике на строке Записать(). Если отладка идёт на сервере, включите в Конфигураторе отладку серверного кода.
  4. Проверьте результат не только Блокнотом. Блокнот угадывает кодировку и скрывает проблему. Откройте файл тем же загрузчиком, которым его будет читать получатель, или редактором, где видна кодировка.
  5. Для регулярных выгрузок пишите итог в журнал регистрации: ЗаписьЖурналаРегистрации("Выгрузка txt", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки()).

Частые вопросы

Как прочитать txt файл обратно в 1С?
Объектом ТекстовыйДокумент: создайте его и вызовите Прочитать(ИмяФайла, Кодировка). Затем обходите строки через КоличествоСтрок() и ПолучитьСтроку(). Для больших файлов используйте ЧтениеТекста и метод ПрочитатьСтроку() в цикле.
Можно ли выгружать txt по расписанию, без участия пользователя?
Да. Код выгрузки размещают в процедуре регламентного задания, она выполняется на сервере. Путь к папке указывайте серверный или сетевой UNC-путь с правами для службы 1С.
Как задать имя файла с датой выгрузки?
Соберите имя строкой: “vygruzka_” + Формат(ТекущаяДатаСеанса(), “ДФ=yyyyMMdd”) + “.txt”. В имени не должно быть символов двоеточия, косой черты и звёздочки: Windows их не принимает.
Чем txt отличается от csv при выгрузке из 1С?
По сути ничем: csv — тот же текстовый файл, где колонки разделены точкой с запятой или запятой. Отличается только расширение и договорённость о разделителе. Записывается он теми же ТекстовыйДокумент или ЗаписьТекста.
Почему Excel открывает выгруженный txt одной колонкой?
Excel не угадал разделитель. Откройте файл через мастер импорта текста и укажите разделитель вручную. Либо сохраняйте отчёт сразу в xlsx, если получателю нужна именно таблица.